Jenkins: создание pipeline Continuous Delivery процесса с деплоем на Docker Swarm Cluster для нескольких окружений

Предположим, у нас есть два окружения Staging и Production
На Staging окружении деплоится ветка c именем staging, а на Produсtion – с именем master
Тип сборки в Jenkins – pipeline multibranch
Запуск сборки выполняется автоматически при коммите в репозитарий(Bitbucket)
Настройка автоматического запуска сборки при коммите в репозитарий Bitbucket описана здесь
https://kamaok.org.ua/?p=2833
При использовании типа сборки Pipeline Multibranch становится доступна имя ветки, в которую сделали коммит в виде переменной BRANCH_NAME
Кроме того, необходимо запускать сборку только для веток master и staging, а все остальные ветки сборка должна игнорировать при коммитах в эти ветки(даже не вызываться на запуск)
Это достигается фильтрацией по имени ветки в настройках сборки — в поле Include указываем только интересующие нас ветки master и staging

Предварительно создаем Credentials в Jenkins для аутентификации на Bitbucket

Все остальные настройки и сам процесс сборки и деплоя содержится в Jenkinsfile, который вытягивается из репозитария, указанного в поле Repository Name, доступного для пользователя указанного в поле Owner на изображении с настройками фильтрации веток.

Весь pipeline имеет следующий вид:

Разберем содержание pipeline
Запуск сборки на агенте с меткой linux-slave1

Общие/глобальные настройки
Хранить 3 копии билдов(выполненных сборок)
Отключить параллельный запуск/выполнение сборки
Включать временные метки в вывод консоли

Запускать сборку при коммите в репозитарий Bitbucket

Имя Docker-образа,который будет собираться имеет формат

Имитация/эмулирование выполнения Unit и Integration-тестов

Сборки Docker-образа в формате

из Docker-файла

Dockerfile имеет вид

Содержимое файлов app.py, requirements.txt, templates/index.html такое же, как и в предыдущей статье https://kamaok.org.ua/?p=3004

Далее по pipeline:

Аутентификация в Docker-реестре/репозитарии — docker login с логином/паролем(DOCKER_USER/DOCKER_PASSWORD), значения этих переменных подставляется из Jenkins Credentials, которые необходимо создать заранее

Благодаря конструкции

Загрузка Docker-образа в удаленный Docker-репозитарий — docker push
Удаление вновь созданного(локального) Docker-образа — docker rmi

Далее, проверяется имя ветки и в зависимости от имени ветки вызывается функция по деплою либо в master либо в staging – окружение

Далее в зависимости от установленного значения (master или staging) в строке

1.Устанавливается имя сервера Docker Swarm-менеджера т.к. для staging и production-окружений они различные
DOCKER_SWARM_MANAGER_NODE
( предварительно обнуляется значение переменной DOCKER_SWARM_MANAGER_NODE с помощью def DOCKER_SWARM_MANAGER_NODE = »)
2. Динамически дополняется файл .env, который содержит переменные и их значения,которые будут использоваться/доступны внутри контейнера
Все переменные, которые различаются для staging и production-окружений динамически добавляются в файл .env, который уже содержит общие для обоих окружений переменные
Например, общая для обоих окружений переменная, которая будет доступна внутри контейнера имеет имя FROM_EMAIL

Например, различные для окружений переменные
Для master

Для staging

Если ветка ни staging ни master, то прервать дальнейшее выполнение сборки

Далее с Jenkins-сервера устанавливается ssh-туннель(в фоновом режиме) с соответствующей окружению(master или staging) Docker Swarm менеджер нодой с пробросом Docker-сокета(/var/run/docker.sock) с менеджер ноды на Jenkins-сервер на localhost на порт 2371.Это позволяет использовать этот порт для передачи docker-команд на сокет удаленного Swarm-менеджера

Необходимо отметить, что подключение по SSH выполняется с помощью имени пользователя и SSH-приватного ключа, которые определяются как переменные SWARM_USER и SWARM_KEY соответственно. Значения этих переменных берутся из Jenkins Credentials благодаря конструкции

Такие Jenkins Credentials необходимо создать заранее.

Далее выполняется deploy сервиса ,указанного в docker-compose-cats.yaml файле, в Docker Swarm кластере

Передача параметра —with-registry-auth cats позволяет worker-нодам успешно аутентифицироваться в Docker-реестре/репозитарии и скачать обновленный образ с хранилища
Благодаря тому, что jenkins-сервер успешно аутентифицируется в Docker-репозитарии с помощью конструкции

Внутри этой конструкции и выполняется команда по деплою сервиса в кластере

Файл docker-compose-cats.yaml-файл имеет вид

т.е. запускается 2 реплики на worker-нодах приложения в сервисе cats с образа, собранного и загруженного в Docker-репозитарий в начале pipeline

Сделаем коммит в master-ветку в Bitbucket и проверим автоматический запуск сборки с веткой master и ее корректное выполнение

Сборка запущена коммитом в Bitbucket

Успешная сборка образа в нужном нам формате

Успешная аутентификация на удаленном Docker-репозитарии и загрузка в него собранного образа

Удаление локального собранного образа

Деплой на Docker Swarm-кластер

Пропуск стадии деплоя на staging-окружение т.к. деплоим только на production-окружение по причине имени ветки(master), в которую был сделан коммит

Успешное завершение выполнения всей сборки

 

Создание Jenkins pipeline rollback-сборки для ручного отката/передеплоя приложения с необходимым Docker-образом

Для выполнения rollback на нужную версию образа вручную запускаем эту сборку
При таком запуске необходимо выбрать/определить несколько опций
Имя ветки: staging или master

Указать необходимую временную метку, которая содержится в имени Docker-образа

Указать необходимый hash-коммита(7-и символьный),которая содержится в имени Docker-образа

Напомним, что имя Docker-образа имеет формат

Pipeline rollback сборки

Комментирование и размещение ссылок запрещено.

Комментарии закрыты.

Яндекс.Метрика