Поиск по сайту:

Как установить и использовать Jenkins для создания конвейера CI/CD


Для компаний-разработчиков программного обеспечения, придерживающихся гибкого процесса разработки, ежедневный выпуск программного обеспечения является интенсивным процессом. Jenkins — это инструмент, который может ускорить ваш рабочий процесс за счет автоматизации многих повторяющихся задач, таких как сборка, тестирование и выпуск.

Что такое Дженкинс?

Изначально Jenkins создавался для единственной цели — автоматизировать сборку и тестирование ночных сборок программного обеспечения. Новые коммиты должны регулярно интегрироваться в основную ветку (часто называемая «непрерывной интеграцией»), что часто требует тщательного тестирования, чтобы убедиться, что все работает гладко. Делать это раз в неделю — это одно, но когда вы интегрируете несколько раз в день, для всех лучше, чтобы это был автоматический процесс.

Jenkins и другие подобные решения CI/CD ускоряют этот процесс. Вы можете думать об этом как об автоматизированном сценарии оболочки. Например, чтобы выпустить новую сборку приложения React, вам может потребоваться запустить npm install, npm run build, а затем запустить набор тестов, например Jest, чтобы убедиться, что новая сборка проходит все тесты. В случае успеха вы можете отправить его в тестовую среду для ручной проверки или просто опубликовать новый выпуск напрямую. Все это команды, которые вы можете написать довольно легко.

Дженкинс может выполнять все эти задачи как часть конвейера. Всякий раз, когда Jenkins обнаруживает изменения в вашей системе управления версиями (будь то в основной или функциональной ветке), он запускает автоматизированный конвейер и выполняет каждую поставленную вами задачу. Некоторые задачи так же просты, как команды bash, другие задачи могут взаимодействовать с внешней службой, такой как Jira, Git или поставщиком услуг электронной почты. Jenkins также полностью расширяем с помощью плагинов, и его действительно можно заставить делать все, что вы захотите.

У Дженкинса есть два основных релиза: Blue Ocean и classic. Blue Ocean является более новым и включает оптимизированный пользовательский интерфейс, который значительно упрощает создание конвейеров. В этом руководстве мы будем использовать Blue Ocean, но большая часть одних и тех же концепций применима к обеим версиям Jenkins.

Установка Дженкинса

Двоичные файлы Jenkin доступны для нескольких операционных систем, но обычно не из менеджеров пакетов по умолчанию. Если вы используете Ubuntu, вы можете загрузить и установить с помощью следующих нескольких команд:

wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
sudo apt-get update
sudo apt-get install jenkins

Однако, чтобы сделать вещи независимыми от платформы, мы будем запускать Jenkins с помощью Docker, что в любом случае рекомендует Дженкинс.

Установка Докера

Docker — это платформа для запуска приложений в «контейнерах». Контейнер включает в себя все необходимые зависимости и гарантирует, что приложение будет работать одинаково независимо от базовой операционной системы — все, что вам нужно сделать, это установить Docker для вашей системы и выполнить несколько команд.

Для Ubuntu вам нужно будет установить некоторые предварительные условия:

sudo apt install apt-transport-https ca-certificates curl software-properties-common

Затем добавьте ключ GPG Docker:

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

И добавьте само репо:

sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"

Обновите свои источники:

apt update

И, наконец, устанавливаем Docker из apt:

sudo apt install docker-ce

Теперь Docker должен быть запущен в вашей системе, что вы можете проверить с помощью systemctl.

Настройка Дженкинса

Запустив Docker, вы можете настроить контейнер Docker для Jenkins. Сначала вам понадобится сеть с мостом, чтобы контейнеры могли обмениваться данными:

docker network create jenkins

Docker по своей сути эфемерен — все данные, хранящиеся в контейнерах, будут удалены, когда эти контейнеры будут остановлены. Чтобы предотвратить это, вам нужно хранить данные на томах Docker, которые будут сохраняться на диске. Вам понадобятся два тома: один для некоторых сертификатов TLS, необходимых Дженкинсу для подключения к Docker, а другой — для всех ваших данных Jenkins. Они будут привязаны к контейнеру во время выполнения.

docker volume create jenkins-docker-certs
docker volume create jenkins-data

Jenkins на самом деле нужно иметь возможность запускать Docker как часть своей работы, чтобы настроить среды сборки. Это невозможно с обычным Docker, поэтому, чтобы эта функция работала правильно, вам нужно запустить «Docker in Docker» или DinD. Следующая команда запустит официальный контейнер Docker docker:dind , привяжет к нему сеть и тома, созданные на предыдущих шагах, и опубликует их как службу, работающую на порту 2376, для использования контейнером Jenkins. Вы можете изменить этот порт, если хотите, хотя вам также придется изменить его на следующем шаге.

docker container run --name jenkins-docker --rm --detach 
--privileged --network jenkins --network-alias docker 
--env DOCKER_TLS_CERTDIR=/certs 
--volume jenkins-docker-certs:/certs/client 
--volume jenkins-data:/var/jenkins_home 
--publish 2376:2376 docker:dind

После такой настройки вы можете запустить контейнер jenkinsci/blueocean, используя следующую команду:

docker container run --name jenkins-blueocean --rm --detach 
--network jenkins --env DOCKER_HOST=tcp://docker:2376 
--env DOCKER_CERT_PATH=/certs/client --env DOCKER_TLS_VERIFY=1 
--volume jenkins-data:/var/jenkins_home 
--volume jenkins-docker-certs:/certs/client:ro 
--publish 8080:8080 --publish 50000:50000 jenkinsci/blueocean

Это позволит смонтировать сеть и диски, установить для переменной DOCKER_HOST порт, на котором работает DinD, и опубликовать службу на порту 8080, который вы можете изменить, если он не свободен. (Формат — host:container.) Он также публикует административное соединение Jenkin на порту 50000, если вы планируете настроить главный сервер Jenkins с подключением к нему нескольких распределенных сборок.

Как только Jenkins будет запущен и запущен, он будет доступен через браузер на порту 8080 хост-компьютера. Вам нужно будет выполнить небольшую настройку, прежде чем Jenkins будет полностью готов к использованию, первая из которых — аутентификация себя, чтобы доказать, что вы являетесь владельцем сервера, а не бот, атакующий уязвимый веб-интерфейс.

Вам нужно будет ввести пароль, хранящийся в /var/jenkins_home/, который является частью тома Docker. Чтобы получить к нему доступ, вам нужно запустить cat внутри контейнера Docker:

docker container exec -it jenkins-blueocean cat /var/jenkins_home/secrets/initialAdminPassword

Это распечатает пароль, который вы можете скопировать и начать остальную часть настройки.

Вам будет предложено настроить имя пользователя и пароль администратора, установить различные плагины. Выбор «Установить рекомендуемые плагины» просто установит множество рекомендованных сообществом для начала. Вы всегда можете установить больше позже.

Создание конвейера

После того, как вы настроите Jenkins, вас встретит следующий экран приветствия. Нажмите «Создать новый конвейер», чтобы начать.

Вам нужно будет выбрать, где хранится ваш код. Вы можете связать свою учетную запись Github или BitBucket напрямую с помощью ключа доступа.

Однако лучшим решением будет просто выбрать общий «Git». Введите URL-адрес своего репозитория, и Дженкинс предоставит вам открытый ключ. Поскольку Jenkins может делать фиксации (и всегда фиксирует изменения в конфигурации конвейера), вам следует создать нового пользователя службы и добавить к нему открытый ключ.

Дженкинсу потребуется секунда, чтобы подключиться к Git, а затем вывести вас на страницу, где вы можете изменить настройки конвейера. Jenkins хранит всю конфигурацию конвейера в файле Jenkinsfile, расположенном в корне репозитория. Всякий раз, когда вы вносите обновления в конвейер в редакторе, Jenkins будет фиксировать изменения в вашем Jenkinsfile.

Каждый конвейер будет иметь несколько отдельных этапов, таких как сборка, тестирование или развертывание, которые будут содержать отдельные шаги. Они могут делать самые разные вещи, например отправлять электронные письма, взаимодействовать с другими сервисами, такими как Jira и Git, и координировать поток других шагов, но чаще всего вы будете использовать их для выполнения простых сценариев оболочки. Любые ошибки в возврате этих скриптов приведут к сбою конвейера.

Прежде чем добавлять какие-либо этапы, вам нужно настроить параметры среды. Обычно вы будете использовать контейнер Docker, например node:latest.

В этом примере мы создадим веб-приложение на основе Node. Достаточно просто добавить два шага для npm install и npm run build — это все, что необходимо. Дженкинс выполнит эти команды и перейдет к следующему этапу с готовыми артефактами сборки. На этапе тестирования настройка сценария оболочки для запуска Jest потребует прохождения всех тестов для успешной сборки.

Jenkins может запускать несколько этапов параллельно, что полезно, если вам нужно протестировать несколько разных платформ. Вы можете настроить этапы «Тестирование в Linux» и «Тестирование в Windows» и запустить их одновременно, чтобы не ждать, пока один из них запустит другой. Если один из них выйдет из строя, конвейер все равно выйдет из строя.

Как только вы закончите редактирование, Jenkins автоматически запустит ваш конвейер. Если вы нажмете на нее для получения дополнительной информации, вы сможете наблюдать за ходом сборки по этапам.

Верхняя полоса станет красной, если есть ошибка, и зеленой, если все прошло успешно. Если вы столкнулись с ошибками, вы можете щелкнуть этапы нарушения, чтобы просмотреть консольный вывод команд, вызывающих сбой конвейера. Вы также захотите проверить конфигурацию своей среды, чтобы убедиться, что все необходимые инструменты установлены. (Возможно, вы захотите настроить свой собственный контейнер Docker для своих сборок.)