Готовим Jenkins CI в Docker

Для большей изоляции и переносимости Jenkins рекомендую запускать его в контейнере, для этого проще всего использовать готовое решение docker-jenkinsci. Ниже расскажу как запустить его, настроить Nginx и перенести данные.
Установка
Можете использовать мой немного исправленный форк docker-jenkinsci, но лучше сделайте свой со своими настройками. После чего склонируйте к себе на сервер:
cd ~example
git clone https://github.com/adw0rd/docker-jenkinsci.git
cd docker-jenkinsci
Доустановите Nginx, Docker и Docker Compose:
sudo apt install nginx docker.io docker-compose
Настройка Nginx
Подключим сертификаты и будем проксировать на localhost:8080 (или какой угодно другой адрес, указанный в docker-compose.yml)
server {
listen 443 ssl;
server_name jenkins.example.org;
ssl_certificate /etc/nginx/certs/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/privkey.pem;
auth_basic "closed site"; # Рекомендую прятать Jenkins за base-auth, в Jenkins часто находят уязвимости, продукт популярный. Общая Basic Auth это дополнительная безопасность
auth_basic_user_file htpasswd; # Ниже показываю как сгенерировать этот файл, который Nginx будет искать в /etc/nginx
location / {
proxy_set_header Authorization ""; # Тут мы сбрасываем заголовок с Basic Auth, иначе Jenkins пытается его использовать для авторизации пользователя в своем интерфейсе. Я разделяю эти авторизации для себя
proxy_pass http://localhost:8080;
}
}
server {
listen 80;
server_name jenkins.example.org;
return 301 https://$host$request_uri;
}
Как получить бесплатные SSL-сертификаты от LetsEncypt читаем в статье.
Для генерации htpasswd файла выполните:
echo "<USERNAME>:`openssl passwd -apr1`" > /etc/nginx/htpasswd
Укажите нужный вам .
Установка Jenkins в Docker
Запускаем Jenkins:
docker-compose up
Во время запуска, в консоли отобразиться пароль, скопируйте и введите его в поле “Administrator password” веб-интерфейса (по адресу https://jenkins.example.org ).
Вас спросят какие плагины установить, советую выбрать “Select plugins to install” и выбрать минимальный подходящий вам набор (Git, Build Timeout и прочие на которых стоит галочка и вы осознаете для чего выбранный плагин вам нужен, остальное доустановите потом).
Далее вас попросят создать учетную запись “Create First Admin User”, думаю справитесь.
Авто-запуск Jenkins в Docker
Теперь вы можете запускать Jenkins в бекграунде:
docker-compose up -d
Или лучше разместите сервис-файл для systemd по пути /etc/systemd/system/docker-jenkinsci.service:
[Unit]
Description=Docker Compose Service for Jenkins CI
Requires=docker.service
After=docker.service
[Service]
WorkingDirectory=/home/example/docker-jenkinsci
ExecStart=/usr/bin/docker-compose up
ExecStop=/usr/bin/docker-compose down
TimeoutStartSec=0
Restart=on-failure
[Install]
WantedBy=multi-user.target
Теперь активируем и запустим наш сервис:
sudo systemctl enable docker-jenkinsci sudo systemctl start docker-jenkinsci
Вы также можете узнать статус, остановить или перезапустить сервис:
sudo systemctl status docker-jenkinsci sudo systemctl stop docker-jenkinsci sudo systemctl restart docker-jenkinsci
Не забывайте после каждого изменения service-файла перезапускать systemd:
systemctl daemon-reload
Перенос рабочих файлов для Jenkins
По умолчанию имя запущенного контейнера “docker-jenkinsci_master_1”, поэтому ниже будет использовано именно это имя.
Если у вас имеется сожержимое каталога от прежнего Jenkins (jobs, workspaces, конфиги), то можно закинуть все эти данные в volume:
cat var_lib_jenkins.tgz | docker exec -i docker-jenkinsci_master_1 tar Cxzf /var/jenkins_home/ -
После чего, вы можете войти в контейнер и проверить правильно ли вы разместили данные:
docker exec -uroot -ti docker-jenkinsci_master_1 bash
cd ~jenkins
Далее перезапустите Jenkins и проверьте корректность работы через веб-интерфейс:
systemctl restart docker-jenkinsci
Бекап данных
Чтобы сдампить все файлы из volume контейнера можно использовать docker cp:
docker cp -a docker-jenkinsci_master_1:/var/jenkins_home backup_dir
Задавайте свои вопросы в комментариях.
Комментирование закрыто.