30 января 2019 г. Jenkins CI Docker

Готовим 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

Укажите нужный вам <USERNAME>.

Установка 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

Задавайте свои вопросы в комментариях.

Комментарии

Оставьте свой комментарий

Markdown