Позвольте использовать инструменты CI / CD для автоматизации создания образов Docker
В частях 1 и 2 этой серии я объяснил, как Dockerize rails-приложениям, написав файлы Docker для приложений, и рассмотрел некоторые из лучших практик для создания образов Docker. Кроме того, я объяснил, как реализовать или создать простой, согласованный и легкий в использовании интерфейс для создания образов Docker для нескольких приложений.
В этом посте я расскажу, как мы можем интегрировать процесс создания образов Docker и их отправку в реестр докеров с помощью трех различных инструментов CI / CD: jenkins
, travis
и Github Actions
.
Дженкинс
Jenkins - это бесплатный сервер автоматизации с открытым исходным кодом для автоматизации выполняемых задач, таких как развертывание программного обеспечения, компиляция исходного кода или выполнение модульных тестов. С Jenkins Pipelines легко определять задачи автоматизации. Я буду использовать эту функцию, чтобы определить конвейер, который можно использовать для создания образов Docker.
Вместе с файлом конвейера Jenkins я определю параметры конвейера. Они будут использоваться для перезаписи элементов конфигурации, определенных в Makefile
, который мы написали в предыдущей статье.
Следующий участок конвейера - этап этапов. Здесь мы определяем этапы, которые принадлежат конвейеру, и порядок, в котором эти этапы будут выполняться.
Для конвейера сборки Docker нам понадобятся следующие четыре этапа
- Checkout SCM: конвейер извлекает репозиторий приложения из
git
и переключается на выбранную ветвь. - Предварительные требования для установки: выполняем команду
make config
, чтобы подготовить рабочий каталог для создания образа Docker. - Создайте образ: конвейер создает образ Docker для приложений, используя
make build
. - Отправка образа:
make push
отправляет созданные образы Docker в реестр Docker.
Участок post
- это последний участок конвейера. Здесь мы запускаем действия, которые могут иметь место после выполнения этапов конвейера. Мы можем выполнить команду make clean
, чтобы удалить все сгенерированные файлы или образы докеров.
Вот полная реализация предложенного конвейера Jenkins:
Указанный выше конвейер Jenkins необходимо запустить вручную. Если есть необходимость запустить этот конвейер с помощью push-уведомлений Github, вы можете выполнить действия, описанные в этом сообщении.
Трэвис К.И.
Travis CI - это размещенная служба непрерывной интеграции, используемая для выполнения заданий непрерывной интеграции для приложений, размещенных на GitHub. Услуга бесплатна для проектов с открытым исходным кодом. Давайте посмотрим, как мы можем заставить Travis CI создавать образы Docker всякий раз, когда новая фиксация отправляется в основную ветвь или создается запрос на вытягивание.
Интеграция Travis CI может быть достигнута просто путем включения travis ci
в проекте GitHub и добавления файла Travis в корень репозитория проекта. Файл Travis - это файл YAML, содержащий все задачи, которые необходимо выполнить, а также конфигурации интеграции, например, когда задачи запускаются. Полное описание интерфейса Трэвиса можно найти на сайте Трэвиса здесь. Наш .travis.yml
файл включает следующие разделы конфигурации:
- Язык программирования и версия проекта.
- Ветви Git, в которых включена задача. Мы ограничим это только для ветки
master
. - Действия, которые необходимо выполнить перед скриптом. Для этой задачи нам нужно убедиться, что
travis ci
worker может отправлять образы Docker в реестр Docker. Следовательно, нам нужно выполнить командуdocker login
перед построением и отправкой образа в реестр. К счастью, Travis предоставляет способ хранить защищенные переменные как переменные среды и передавать ихci workers
- нет необходимости хранить пароли или какие-либо конфиденциальные данные в виде простого текста в.travis.yml
. Мы можем добавить эти переменные среды со страницы конфигураций проекта, как показано:
В .travis.yml
мы можем ссылаться на эти переменные среды, не рискуя раскрыть конфигурации секретов:
echo $DOCKER_TOKEN | docker login -u $DOCKER_NAMESPACE --password-stdin
В следующем разделе travis.yml
выполняются команды, которые фактически выполняют работу. Здесь мы собираемся использовать команду make release
для создания и публикации образа Docker.
Последний раздел - это раздел уведомлений. Это необязательный шаг, но его полезно иметь. Это позволяет нам отслеживать статус задания - когда оно запускается, мы получаем уведомление Slack о статусе сборки.
Вот полная реализация .travis.yml
, которая позволит достичь пунктов, описанных выше:
Секретное значение Slack можно сгенерировать с помощью следующей команды:
travis encrypt "${slack_room_token}" --add notifications.slack
Действия Github
GitHub Actions - это сервис, предлагаемый GitHub для автоматизации задач и заданий CI / CD. С помощью действий Github мы можем определить задачи CI / CD, которые будут выполняться при запуске события Github. Список поддерживаемых событий можно найти здесь.
Чтобы интегрировать задачу выпуска образа Docker в качестве действия Github, нам нужно написать рабочий процесс для нашей работы. Этот рабочий процесс представляет собой просто файл YAML, который хранится по следующему пути в (.github/workflows
), корневом пути репозитория GitHub. Файл рабочего процесса содержит необходимую информацию для выполнения рабочего процесса и список действий, которые необходимо выполнить. GitHub предоставляет торговую площадку для действий, которые могут выполняться над рабочими процессами. С другой стороны, вы можете разработать собственное действие и опубликовать его на рынке, чтобы его могли использовать и другие.
Чтобы автоматизировать и интегрировать процесс создания образов докеров с помощью действий GitHub, я представлю два рабочих процесса.
Рабочий процесс первый
Первый рабочий процесс выполняется после того, как мы создаем пул-реквест для ветви master
или если новая фиксация передается в ветвь master
. Этот рабочий процесс будет выполнять только команду make build
, чтобы убедиться, что наша сборка Docker с изображениями не повреждена (эти действия предназначены для демонстрационных целей и могут быть изменены в соответствии с потребностями).
Рабочий процесс начинается с определения, когда действия должны быть запущены, а затем перечисляются шаги, которые необходимо выполнить. Последний шаг - отправить уведомление Slack в зависимости от статуса задания.
Обратите внимание, что секрет SLACK_WEBHOOK_URL
должен быть создан и добавлен в соответствующий репозиторий GitHub. Сделать это можно, выполнив эти шаги.
Второй рабочий процесс
Второй рабочий процесс выполняется только в том случае, если новый выпуск публикуется на GitHub. Он позаботится о создании образов докеров для этого выпуска и отправит их в реестр Docker.
Первое отличие этого рабочего процесса от первого - это триггерное событие. В первом он запускается при каждом нажатии на master
или каждом PR в отношении основной ветви, но этот рабочий процесс запускается только в случае публикации нового выпуска на GitHub. Как уже упоминалось, push-события - не единственное событие, предоставляемое GitHub. Фактически, существует длинный список событий, которые могут использоваться рабочими процессами.
Второе отличие состоит в том, что этот рабочий процесс будет создавать, маркировать и отправлять образы Docker в реестр Docker. Это означает, что нам нужно добавить дополнительный шаг для аутентификации реестра Docker, чтобы он мог отправлять образы в реестр (секреты могут быть добавлены, как описано здесь).
Тег образа Docker также извлекается из полезной нагрузки действия GitHub и передается в качестве Environment
переменной команде make
следующим образом: IMAGE_TAG=${{ github.ref}} make release
.
Вот полная реализация второго рабочего процесса. Добавление этих файлов рабочего процесса в путь рабочего процесса Github автоматически активирует действия GitHub в соответствующем репозитории:
Заключение
Докеризация и автоматизация процесса создания образов Docker относительно просты. Чтобы полностью построить конвейер интеграции CI / CD для автоматизации процесса, выполните следующие действия:
- Напишите
Dockerfile
dockerize приложение. - Используйте
Makefiles
, чтобы предоставить простые команды для создания образов докеров. - Используйте один или несколько инструментов CI / CD (
Jenkins
,Travis
иGithub Actions
и т. Д.) Для автоматизации конвейера.