Пошаговое руководство для создания конвейера Jenkins.
Почему именно конвейер Jenkins?
Непрерывное развертывание (CD - Continuous Delivery) – это важная часть жизненного цикла DevOps.
Оно дает уверенность в том, что программное обеспечение или приложение, которое создают разработчики, всегда будет готово к использованию в производственной среде. Для этого всякий раз, когда код обновляется, его необходимо сразу же собирать, тестировать и развертывать. Именно здесь на первый план выходит конвейер Jenkins.
Если мы говорим о DevOps, то здесь CI/CD (Continuous Integration and Continuous Delivery – непрерывная интеграция и непрерывное развертывание) достигается за счет конвейера Jenkins. Конвейер Jenkins, используемый для CD, помогает развертывать программное обеспечение более быстрыми и частыми релизами. Это, в свою очередь, помогает учитывать обратную связь в каждом последующем релизе.
Что такое конвейер Jenkins?
Конвейер Jenkins – это набор задач по непрерывному развертыванию программного обеспечения с помощью Jenkins.
Конвейер Jenkins состоит из группы состояний и нескольких этапов, которые выполняются последовательно друг за другом. JenkinsFile – это простой текстовый файл, который используется для создания конвейера (все равно что создать код в Jenkins). Он содержит код на предметно-ориентированном языке Groovy, который легко писать и читать.
Вы можете запустить отдельно JenkinsFile или запустить код конвейера из веб-интерфейса Jenkins. Существует два способа, как можно создать конвейер с помощью Jenkins.
- Декларативный – новый способ создания конвейера Jenkins. Здесь вы пишете Groovy-код, содержащий блоки pipeline, которые затем регистрируются в SCM (Source Code Management – системе управления версиями исходного кода).
- В виде сценария – способ написание Groovy-кода, при котором код определяется внутри блоков node.
Прежде чем мы перейдем к демонстрационному примеру, установите Jenkins (если вы этого еще не сделали). Убедитесь, что Jenkins в вашей системе запущен.
Создание конвейера Jenkins
Ниже приведен пример, как выглядит конвейерный поток Jenkins. Он состоит из нескольких этапов – от создания программного обеспечения разработчиками до отправки программного обеспечения в производство.
Давайте создадим конвейер декларативным способом.
Нажмите «New Item» (Новый элемент) на панели управления Jenkins. Далее введите имя элемента, например, «First Pipeline» и выберите проект «Pipeline» (Конвейер). После чего нажмите «ОК».
Перейдите во вкладку «Pipeline», как показано на рисунке ниже, и вставьте сюда свой код из JenkinsFile (код Groovy).
pipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Hi, GeekFlare. Starting to build the App.'
}
}
stage('Test') {
steps {
input('Do you want to proceed?')
}
}
stage('Deploy') {
parallel {
stage('Deploy start ') {
steps {
echo "Start the deploy .."
}
}
stage('Deploying now') {
agent {
docker {
reuseNode true
image ‘nginx’
}
}
steps {
echo "Docker Created"
}
}
}
}
stage('Prod') {
steps {
echo "App is Prod Ready"
}
}
}
}
Давайте разберемся, что значат все эти блоки.
- Блок pipeline содержит все инструкции по сборке, тестированию и развёртыванию программного приложения. Это главный компонент конвейера Jenkins.
- Блоку agent поручено выполнение конвейера на узле и выделение рабочего пространства для конвейера.
- stage - это блок, который содержит шаги по созданию, тестированию и развертыванию приложения. Эти блоки используются для визуализации процессов конвейера Jenkins.
- step - это отдельная задача, которую необходимо выполнить, например, создать каталог, запустить образ docker, удалить файл и т.д.
Код Groovy, который приведен выше, я использую в JenkinsFile. Конвейеру назначается любой доступный agent. После чего я определяю этап сборки (Build) и выполняют простой шаг – вывожу сообщение с помощью команды echo. Затем я определяю этап тестирования (Test), где меня спрашивают, хочу ли я продолжить. После я создал этап развертывания (Deploy), на котором параллельно выполняются еще два этапа. На этапе запуска развертывания (Deploy start) выполняется шаг с командой echo, а на этапе текущего развертывания (Deploying now) выполняется шаг, который извлекает с узла docker-образ Nginx. И наконец, этап производства (Prod), где выполняется простой шаг – выводится сообщение с помощью команды echo.
Конвейер, который я описал выше, состоит из этапов, которые, в свою очередь, состоят из простых шагов. Этот пример должен помочь вам понять, как это все работает. Как только вы научитесь создавать конвейеры, вы сможете добавлять более сложные шаги и создавать более сложные конвейеры.
После того, как вы добавите код во вкладку «Pipeline», нажмите «Apply and Save» (Применить и сохранить). И наконец, нажмите «Build Now» (Выполнить сборку), чтобы выполнить сборку конвейера Jenkins, который вы только что создали.
Вот так будет выглядеть пользовательский интерфейс, когда вы запустите конвейер. Если вы выполнили все шаги как надо, то сборка будет выполнена успешно, и этап сборки (#27) будет окрашен в синий цвет. Если в процессе сборки произошли какие-то ошибки, то этап сборки (#27) будет окрашен в красный цвет.
Теперь нажмите на сборку #27, а затем нажмите «Console Output» (Консольный вывод), чтобы проверить, что происходит на сервера при ее запуске.
Вот так должен выглядеть этот вывод – в конце должно быть сообщение об успешном завершении (SUCCESS).
Success Console Output
Started by user geekflare
Running in Durability level: MAX_SURVIVABILITY
[Pipeline] Start of Pipeline
[Pipeline] node
Running on Jenkins in /var/lib/jenkins/workspace/First Pipeline
[Pipeline] {
[Pipeline] stage
[Pipeline] { (Build)
[Pipeline] echo
Hi, GeekFlare. Starting to build the App.
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Test)
[Pipeline] input
Do you want to proceed?
Proceed or Abort
Approved by geekflare
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Deploy)
[Pipeline] parallel
[Pipeline] { (Branch: Deploy start )
[Pipeline] { (Branch: Deploying now)
[Pipeline] stage
[Pipeline] { (Deploy start )
[Pipeline] stage
[Pipeline] { (Deploying now)
[Pipeline] getContext
[Pipeline] isUnix
[Pipeline] sh
[Pipeline] echo
Start the deploy ..
[Pipeline] }
+ docker inspect -f . nginx
[Pipeline] // stage
[Pipeline] }
Error: No such object: nginx
[Pipeline] isUnix
[Pipeline] sh
+ docker pull nginx
Using default tag: latest
latest: Pulling from library/nginx
8d691f585fa8: Pulling fs layer
5b07f4e08ad0: Pulling fs layer
abc291867bca: Pulling fs layer
abc291867bca: Verifying Checksum
abc291867bca: Download complete
5b07f4e08ad0: Verifying Checksum
5b07f4e08ad0: Download complete
8d691f585fa8: Verifying Checksum
8d691f585fa8: Download complete
8d691f585fa8: Pull complete
5b07f4e08ad0: Pull complete
abc291867bca: Pull complete
Digest: sha256:922c815aa4df050d4df476e92daed4231f466acc8ee90e0e774951b0fd7195a4
Status: Downloaded newer image for nginx:latest
[Pipeline] withDockerContainer
Jenkins does not seem to be running inside a container
$ docker run -t -d -u 125:131 -w "/var/lib/jenkins/workspace/First Pipeline" -v "/var/lib/jenkins/workspace/First Pipeline:/var/lib/jenkins/workspace/First Pipeline:rw,z" -v "/var/lib/jenkins/workspace/First Pipeline@tmp:/var/lib/jenkins/workspace/First Pipeline@tmp:rw,z" -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** -e ******** nginx cat
$ docker top 3141793b98f315dc90a57d810068b8eedb6f62debafb9040de06635b558f2943 -eo pid,comm
[Pipeline] {
[Pipeline] echo
Docker Created
[Pipeline] }
$ docker stop --time=1 3141793b98f315dc90a57d810068b8eedb6f62debafb9040de06635b558f2943
$ docker rm -f 3141793b98f315dc90a57d810068b8eedb6f62debafb9040de06635b558f2943
[Pipeline] // withDockerContainer
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // parallel
[Pipeline] }
[Pipeline] // stage
[Pipeline] stage
[Pipeline] { (Prod)
[Pipeline] echo
App is Prod Ready
[Pipeline] }
[Pipeline] // stage
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
Данный конвейер Jenkins создал docker-образ Nginx. Вы можете убедиться в этом, запустив команду ниже. Вы увидите, что docker-образ Nginx находится в списке.
geekflare@chef-geekflare:~$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 540a289bab6c 2 weeks ago 126MB
httpd latest 7d85cc3b2d80 2 months ago 154MB
redis latest f7302e4ab3a8 2 months ago 98.2MB
geekflare_mongodb latest 095d17727ca0 3 months ago 325MB
Заключение
Надеюсь, что эта статья дала вам представление о преимуществах конвейера Jenkins и о том, как его можно создать. Все, что мы делали выше, - это простой демонстрационный пример. Лучший способ научиться создавать конвейеры – пробовать создавать более сложные варианты.