В современном мире разработки программного обеспечения непрерывная интеграция и доставка (CI/CD) становятся неотъемлемой частью процессов разработки. Jenkins, как один из ведущих инструментов CI/CD, помогает автоматизировать сборку, тестирование и развертывание приложений. Однако настройка и управление Jenkins могут быть трудоемкими и сложными, особенно в крупных проектах со множеством разработчиков и разнообразными требованиями.
Docker, контейнеризация и оркестрация контейнеров пришли на помощь, предлагая более эффективные и масштабируемые решения для развертывания приложений и инфраструктуры. Docker позволяет разработчикам упаковывать приложения и их зависимости в контейнеры, которые можно легко переносить и запускать на любой системе с установленным Docker.
Преимущества использования Docker для автоматизации настройки Jenkins
- Упрощенная установка и настройка: Использование Docker для развертывания Jenkins позволяет избежать множества сложностей, связанных с установкой зависимостей и настройкой окружения. Все, что необходимо, — это запустить несколько команд, чтобы получить готовый к работе Jenkins-сервер.
- Повторяемость: С Docker вы можете быть уверены, что ваше окружение всегда будет одинаковым, независимо от того, где оно запускается. Это устраняет проблемы, связанные с разными конфигурациями на разных серверах.
- Изоляция окружений: Docker обеспечивает изоляцию приложений и их зависимостей, что позволяет избежать конфликтов между различными проектами и сервисами.
- Масштабируемость: Использование Docker и оркестрационных инструментов, таких как Docker Compose или Kubernetes, позволяет легко масштабировать Jenkins, добавляя или удаляя агенты по мере необходимости.
- Быстрое развертывание и восстановление: В случае сбоя или необходимости обновления Docker позволяет быстро развернуть новый контейнер с Jenkins, минимизируя время простоя и обеспечивая непрерывность работы.
В этой статье мы рассмотрим, как с помощью Docker можно автоматизировать настройку и развертывание Jenkins. Мы пройдем через все этапы — от создания Docker файла и настройки Docker Compose до интеграции Jenkins Configuration as Code (JCasC) для автоматической конфигурации Jenkins. В результате у вас будет полное понимание процесса и готовое решение для автоматизации Jenkins в ваших проектах.
Предварительные требования
Перед тем как приступить к настройке Jenkins с помощью Docker, необходимо убедиться, что у вас есть все необходимые инструменты и программное обеспечение. В этом разделе мы рассмотрим, что потребуется для успешной автоматизации Jenkins и как установить необходимые компоненты.
Установка Docker и Docker Compose
Docker можно установить на различных операционных системах, включая Linux, macOS и Windows. Ниже приведены шаги для установки Docker на наиболее популярных платформах
-
Обновите список пакетов командой:
-
Установите пакеты для работы с HTTPS:
-
Добавьте официальный GPG-ключ Docker:
-
Добавьте Docker-репозиторий в APT-источники:
-
Установите Docker:
-
Убедитесь, что Docker работает:
Docker Compose обычно устанавливается вместе с Docker Desktop на macOS и Windows. На Linux требуется отдельная установка:
-
Скачайте последнюю версию Docker Compose:
-
Сделайте скачанный файл исполняемым:
-
Проверьте установку:
Docker Hub — это облачный репозиторий, где можно находить и хранить Docker-образы. Официальный Jenkins Docker образ доступен на Docker Hub и предоставляет готовый к использованию Jenkins сервер:
- Перейдите на сайт Docker Hub.
- В строке поиска введите «Jenkins».
- Выберите официальный образ «jenkins/jenkins».

Официальный образ регулярно обновляется и поддерживается сообществом, что гарантирует получение стабильного и безопасного окружения.
Облачные серверы
по всему миру с почасовой оплатой.
Создание Docker-файла для Jenkins
В этой главе мы рассмотрим, как создать Docker файл для Jenkins, который будет использоваться для создания Docker-образа. Мы также обсудим, как добавлять конфигурации и плагины в этот образ для удовлетворения специфическим требованиями вашего проекта
Структура Docker файла
Docker-файл — это текстовый документ, содержащий все команды, которые пользователь может вызвать в командной строке для сборки образа. В каждом Docker-файле используются инструкции для определения шага в процессе сборки образа. Основные команды включают:
FROM: указывает базовый образ для создания нового образа.RUN: выполняет команду в контейнере.COPYилиADD: копирует файлы или директории в контейнер.CMDилиENTRYPOINT: определяет команду, которая будет выполнена при запуске контейнера.
Базовый Docker-файл для Jenkins
Начнем с создания простого Docker-файла для Jenkins. Этот файл будет использовать официальный Jenkins образ в качестве базового и добавлять несколько необходимых плагинов.
- Создайте новый файл с именем Dockerfile в директории вашего проекта.
- Добавьте следующий код:
Этот базовый Docker-файл устанавливает два плагина: workflow-aggregator и git. Также он открывает порты 8080 (для веб интерфейса) и 50000 (для соединения с агентами Jenkins).
Добавление конфигураций и плагинов
Для более сложных конфигураций мы можем добавить дополнительные шаги в Docker-файл. Например, можно настроить Jenkins для автоматического использования определенного файла конфигурации или добавления скриптов для предварительной настройки.
Пример Docker-файла с расширенной конфигурацией:
- Создайте директорию
jenkins_homeдля хранения пользовательских конфигураций. - Создайте файл
custom_config.xmlвнутри новой директории с необходимыми конфигурациями:
-
Обновите Dockerfile следующим образом:
В этом примере мы устанавливаем дополнительные плагины, копируем файл пользовательской конфигурации и добавляем скрипты в директорию init.groovy.d для автоматической инициализации Jenkins при первом запуске.
Настройка Docker Compose
Docker Compose позволяет описать инфраструктуру вашего приложения в виде кода, используя YAML-файлы. Это упрощает процесс настройки и развертывания, делая его повторяемыми и удобными для управления.
Основные преимущества использования Docker Compose:
- Простота использования: Создание и управление много контейнерными приложениями с помощью единого YAML-файла.
- Масштабируемость: Легкость масштабирования сервисов, добавление или удаление контейнеров по мере необходимости.
- Удобство тестирования: Возможность запуска изолированных окружений для разработки и тестирования.
Пример docker-compose.yml файла для Jenkins
Создадим файл docker-compose.yml для развертывания Jenkins вместе с сопутствующими сервисами, такими как база данных и агент Jenkins.
- Создайте файл
docker-compose.ymlв директории вашего проекта. - Добавьте следующий код в файл:
Этот файл описывает два сервиса:
jenkins: сервис, использующий официальный образ Jenkins. Порты 8080 и 50000 проброшены для доступа к веб-интерфейсу Jenkins и соединения с агентами. Директория/var/jenkins_homeмонтируется на внешний томjenkins_home, чтобы сохранять данные между перезапусками контейнера.jenkins-agent: сервис, использующий образ Jenkinsinbound-agent. Агент подключается к серверу Jenkins через URL, указанный в переменной окруженияJENKINS_URL. Рабочая директория агента монтируется на внешний томagent_workdir.
Теперь, когда файл docker-compose.yml создан, можно запустить все сервисы с помощью одной команды.
- Перейдите в директорию, где находится ваш
docker-compose.yml. - Выполните команду для запуска всех сервисов:
Флаг -d запускает контейнеры в фоновом режиме. После выполнения этой команды Docker Compose создаст и запустит контейнеры для всех сервисов, описанных в файле.
Теперь вы можете проверить состояние запущенных контейнеров с помощью команды:
Если все прошло успешно, то в выводе окажется только jenkins-server.
Теперь настроим сервер и создадим агента.
Если вы перейдете по адресу http://localhost:8080/, то при первом запуске увидите следующее сообщение:

Jenkins запустился корректно и ожидает ввода пароля администратора для начальной настройки. Для получения пароля выполните следующую команду:
Скопируйте полученный пароль и вставьте в форму на странице «Unlock Jenkins». Откроется новое окно с первоначальной настройкой. Выберите «Install suggested plugins». По окончанию установки заполните форму администратора:

Примите URL по умолчанию и завершите настройку. Перейдите в «Настроить Jenkins» → «Nodes».

Нажмите «New Node», укажите имя для нового узла, например «agent», и выберите «Постоянный агент». Заполните остальные поля, как на скриншоте ниже:

После создания агента у вас откроется окно с командой, которая содержит секрет для подключения агента.

Скопируйте секрет и добавьте его в docker-compose.yml:
Для перезапуска введите команды ниже и убедитесь, что jenkins-agent запустился:

Настройка Jenkins через код (JCasC)
Jenkins Configuration as Code (JCasC) — это подход, который позволяет описать всю конфигурацию Jenkins в виде YAML-файла. Это упрощает автоматизацию, поддержание и переносимость настроек Jenkins. В этой главе мы рассмотрим как настроить JCasC для автоматической конфигурации Jenkins при запуске контейнера.
JCasC позволяет описать конфигурацию Jenkins в одном YAML-файле, что дает следующие преимущества:
- Автоматизация: Полностью автоматизированный процесс настройки Jenkins, устраняющий необходимость ручной конфигурации
- Управляемость: Легкость управления конфигурациями с использование систем контроля версий
- Документирование: Явная и легко читаемая документация конфигурации Jenkins.
Пример конфигурационного файла для Jenkins
Для начала создадим файл конфигурации.
- Создайте файл
jenkins.yamlв директории вашего проекта. - Добавьте следующую конфигурацию в файл:
Этот файл конфигурации задает:
- Системное сообщение: задается в блоке
systemMessage. Эта строка будет отображаться на главной странице Jenkins. Оно может быть использовано для информирования пользователей о важной информации или изменениях. - Локальная база пользователей и учетная запись администратора: задается в блоке
securityRealm. ПолеallowsSignup: falseотключает возможность самостоятельной регистрации новых пользователей. Далее определяется один пользователь сid: "admin"и паролем, заданным переменной среды${JENKINS_ADMIN_PASSWORD}. - Политика авторизации: задается в блоке
authorizationStrategy. ПолитикаloggedInUsersCanDoAnythingпозволяет авторизованным пользователям выполнять любые действия, при этомallowAnonymousRead: falseзапрещает анонимным пользователям доступ к системе. - Установка JDK: задается в блоке
tools. В данном примере указывается JDK с именемOpenJDK 11и местоположением/usr/lib/jvm/java-11-openjdk. - Пример пайплайна: задается в блоке
jobs. Этот пайплайн включает три стадии:Build,TestиDeploy, каждая из которых содержит один шаг с выводом соответствующего сообщения в консоль.
Интеграция JCasC с Docker и Docker Compose
Теперь необходимо интегрировать наш конфигурационный файл jenkins.yaml с Docker и Docker Compose, чтобы при запуске контейнера Jenkins автоматически применял эту конфигурацию.
-
Обновите Dockerfile, чтобы скопировать конфигурационный файл в контейнер и установите плагин JCasC:
-
Обновите
docker-compose.yml, чтобы задать переменные окружения и монтировать файл конфигурации. Для этого в блокеvolumesдобавьте следующий код:
После блока volumes добавьте новый блок environment (в случае если вы не задавали его ранее):
-
Постройте новый образ Jenkins с конфигурацией JCasC:
-
Запустите контейнеры:
После запуска контейнеров, перейдите в браузер по адресу http://localhost:8080 и войдите в систему с учетной записью администратора. Вы должны увидеть сообщения системы и установленную конфигурацию Jenkins в соответствии с вашим jenkins.yaml-файлом.

Несколько важных замечаний:
- YAML-файлы
docker-compose.ymlиjenkins.yamlна первый взгляд могут показаться похожими, но выполняют совершенно разные функции. Файл в Docker Compose описывает сервисы и контейнеры, необходимые для запуска Jenkins и его окружения, в то время как файл в JCasC описывает саму конфигурацию Jenkins, включая установку плагинов, настройку пользователей, безопасность, системные настройки и джобы. - Расширения
.ymlи.yaml— это варианты одного и того же формата файлаYAML. Они взаимозаменяемы и поддерживаются различными инструментами и библиотеками для работы с YAML. Применение того или иного формата во многом зависит от исторических предпочтений сообщества; в документации по Docker вы чаще встретите примеры с расширением.yml, а в документации по JCasC — с расширением.yaml. - Пример пайплайна, приведенного ниже, выполняет только выводы сообщений на каждом этапе, без полезной нагрузки. Этот пример служит для демонстрации структуры и основных концепций, однако это не мешает Jenkins успешно применить конфигурацию. Более сложную и практичную структуру мы рассматривать не будем.
jenkins.yamlпредназначен для описания статической конфигурации и не предназначен для описания деталей конкретного CI/CD процесса для отдельного проекта. Для описание этих действий есть Jenkinsfile, который предоставляет гибкость для определения конкретных шагов CI/CD и интеграции с системами контроля версий. Более подробно мы поговорим об этом в следующей главе.
Основные концепции jobs в JCasC
Jobs — это раздел конфигурационного файла, который позволяет определить и настроить сборочные задачи с помощью кода. Блок включает в себя:
- Описание сборочных задач: В разделе описываются все аспекты джобы, включая ее тип, этапы, триггеры и шаги выполнения.
- Типы джобов: Существуют различные типы джобов в Jenkins, такие как фристайл-проекты (freestyle projects), пайплайны (pipelines) и многоконфигурационные проекты (multiconfiguration projects). В JCasC, как правило, используются пайплайны, поскольку они обеспечивают более гибкий и мощный подход к автоматизации.
- Декларативный синтаксис: Пайплайны обычно описываются с использованием декларативного синтаксиса, что упрощает их понимание и редактирование.
Разбор примера:
pipeline: Основной блок, определяющий пайплайн-джобы.agent any: Определяет, что пайплайн может выполняться на любом доступном агенте Jenkins.stages: Блок, содержащий этапы пайплайна. Stage — этап.
Дополнительные возможности:
-
Триггеры: Можно добавить триггеры, чтобы джоба запускалась автоматически при определенных условиях, например, по расписанию или при коммите в репозиторий:
- Постусловия: Можно добавить постусловия (
post-conditions) для выполнения шагов после завершения пайплайна, например, отправка уведомлений или архивирование артефактов. - Параметры: Можно определить параметры джобы, чтобы сделать ее конфигурируемой при запуске:
Автоматизация развертывания Jenkins в Docker с JCasC
Использование скриптов для автоматического развертывания
- Используйте Bash для автоматизации процессов установки, обновления и запуска контейнеров Jenkins.
- Используйте Jenkins Configuration as Code для автоматизации конфигурации.
Примеры скриптов
-
Скрипт для развертывания Jenkins в Docker:
-
Пример JCasC конфигурационного файла
jenkins.yamlмы рассматривали выше.
Настройка CI/CD-пайплайна для обновления Jenkins
Для настройки CI/CD пайплайна следуйте этим шагам:
- Откройте Jenkins и перейдите на главную страницу.
- Нажмите «Создать Item».

- Введите имя для нового элемента, выберите «Pipeline» и нажмите «OK».
-
- Если у вас нет этого раздела, нужно будет установить плагин внутри Jenkins. Для этого перейдите в «Настроить Jenkins» → «Plugins». Во вкладке «Available Plugins» введите в поиске «Pipeline» и выберите плагин как на картинке ниже. Установите этот плагин.

-
- Также по аналогии установите плагин Git Push.

-
-
После установки перейдите обратно в раздел «Создать Item»
-
- Перейдите в раздел «Pipeline» и в «Definition» выберите «Pipeline script from SCM». В качестве SCM выберите Git.
- Добавьте URL вашего репозитория; если он приватный, добавьте учетную запись. В поле «Branch Specifier» укажите ветку, в которой находится Jenkinsfile (например,
*/main). Обратите внимание, Jenkinsfile создается без расширения. Если у вас есть подкаталог, в котором находится Jenkinsfile, укажите его в поле «Script Path». - Нажмите «Save».
Пример Jenkinsfile
- На странице вашего нового pipeline нажмите «Собрать сейчас».
- Перейдите в «Console output». В случае успешного завершения вы должны увидеть следующий вывод.

Для этого пайплайна использовались следующие файлы:
Dockerfile:
docker-compose.yml:
Здесь используются порты 8081 и 50001, чтобы новый развернутый Jenkins мог занять порты 8080 и 50000 соответственно. То есть основной Jenkins, из которого запускается пайплайн, сейчас находится по адресу http://localhost:8081/. Один из способов проверить, что Jenkins развернулся, это перейти по адресу http://localhost:8080/, поскольку в пайплайне мы задавали именно его. Так как это новый образ, на главной странице высветится приветственное сообщение с авторизацией:

Выгодные тарифы на облако в Timeweb Cloud
477 ₽/мес
657 ₽/мес
Заключение
Автоматизация развертывания, обновлений и резервного копирования Jenkins важна для обеспечения надежности и безопасности CI/CD-процессов. Использование современных инструментов дополняет этот процесс множеством полезных функций и ресурсов.
Если вам дальше интересно изучать возможности Jenkins, рекомендуем полезные ресурсы и материалы, которым могут помочь при автоматизации развертывания:
