Jenkins - настройка pipline

Thank you for reading this post, don't forget to subscribe!

Установка плагина

При уста­нов­ке Jenkins систе­ма по умол­ча­нию пред­ла­га­ет уста­но­вить пла­гин pipeline. Веро­ят­но, в нашей систе­ме он есть. Но если пла­гин не уста­нов­лен, пере­хо­дим на стар­то­вой стра­ни­це веб-интер­фей­са Jenkins в раз­дел Настро­ить Jenkins:

Кли­ка­ем по Управ­ле­ние пла­ги­на­ми:

Пере­хо­дим на вклад­ку Доступ­ные и ищем нуж­ный нам пла­гин по сло­ву «pipeline». Мы полу­чим боль­шое коли­че­ство резуль­та­тов — нам нужен пла­гин с назва­ни­ем «Pipeline»:

Вни­зу экра­на нажи­ма­ем Install without restart:

Мы уви­дим пол­ный спи­сок ком­по­нен­тов, кото­рые нуж­но будет уста­но­вить для пла­ги­на — дожи­да­ем­ся окон­ча­ния про­цес­са (мы долж­ны уви­деть «Успеш­но» или «Success»):

* в про­цес­се уста­нов­ки пла­ги­на могут появить­ся сооб­ще­ния об ошиб­ках. Про­бле­мы могут быть свя­за­ны с рас­хож­де­ни­ем вер­сий зави­си­мых ком­по­нен­тов или необ­хо­ди­мо­стью пере­за­груз­ки. Так или ина­че, про­смат­ри­ва­ем такие сооб­ще­ния и само­сто­я­тель­но пыта­ем­ся в них разобраться.

После завер­ше­ния уста­нов­ки, мож­но вер­нуть­ся на глав­ную стра­ни­цу, клик­нув по одно­имен­ной ссылке:

Наша систе­ма гото­ва для созда­ния конвейера.

Создание и настойка задания

На глав­ной стра­ни­це Jenkins кли­ка­ем по Создать Item:

Даем назва­ние нашей зада­че и ниже выби­ра­ем Pipeline:

Нажи­ма­ем кноп­ку OK:

Про­кру­чи­ва­ем стра­ни­цу вниз до под­раз­де­ла «Pipeline» — сюда мы пишем скрипт на Groovy:

Так­же у нас есть воз­мож­ность исполь­зо­вать репо­зи­то­рий Git в каче­стве источ­ни­ка фай­ла Jenkinsfile, выбрав в под­раз­де­ле «Definition» Pipeline script from SCM и Git:

… но мы в дан­ной инструк­ции будем рас­смат­ри­вать напи­са­ние кода напря­мую в Jenkins.

Для нача­ла, напи­шем приветствие:

Суще­ству­ет 2 спо­со­ба напи­са­ния pipeline — скрип­то­вый и декла­ра­тив­ный. В нашем при­ме­ре исполь­зу­ет­ся послед­ний. Бла­го­да­ря стро­го­му син­так­си­су, он про­ще чита­ет­ся — в декла­ра­тив­ном пай­плайне обя­за­тель­но долж­ны быть:

  1. Дирек­ти­ва pipeline. В нее мы обо­ра­чи­ва­ем наш код.
  2. Опре­де­ле­ние аген­та. В нашем при­ме­ре пока не задан кон­крет­ный (agent any), но ниже мы рас­смот­рим запуск кон­вей­е­ра в docker.
  3. Необ­хо­ди­ма дирек­ти­ва stages, в кото­рой, в свою оче­редь, опре­де­ле­ны ста­дии (stage).
  4. Обя­за­тель­но ука­зы­ва­ем steps, в кото­ром и будет наш код.

А так­же:

  • Экра­ни­ро­ва­ние неко­то­рых сим­во­лов мож­но сде­лать с помо­щью обрат­но­го слеша — \
  • Блок тек­ста, напри­мер для его напи­са­ния в несколь­ко строк, мож­но обер­нуть в три оди­нар­ные кавычки — '''
  • Оста­вить ком­мен­та­рий на одну стро­ку мож­но дву­мя пря­мы­ми слешами — //
  • Блок ком­мен­та­рия дела­ем так — /* комментарий */

 

И нажи­ма­ем Сохра­нить:

* наш скрипт на Groovy будет сохра­нен в так назы­ва­е­мый Jenkinsfile — это файл, в кото­ром мы опи­сы­ва­ем эта­пы выпол­не­ния наше­го зада­ния с исполь­зо­ва­ни­ем pipeline.

Нас пере­ки­нет на стра­ни­цу зада­ния — сле­ва кли­ка­ем по Собрать сей­час:

Кон­вей­ер немно­го пора­бо­та­ет и выдаст резуль­тат, состо­я­щий из одно­го шага:

Создан­ное зада­ние рабо­та­ет — попро­бу­ем его усложнить.

Разбиваем обработку на этапы

Откры­ва­ем на редак­ти­ро­ва­ние наше задание:

Пере­ме­ща­ем­ся вниз и пишем сле­ду­ю­щий код на Groovy:

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

Сохра­ня­ем изме­не­ния и запус­ка­ем зада­чу на выполнение:

После ее завер­ше­ния мы долж­ны уви­деть что-то на подобие:

Попро­бу­ем посмот­реть чуть подроб­нее про­то­кол выпол­не­ния — кли­ка­ем по изоб­ра­же­нию стрел­ки спра­ва от назва­ния зада­ния и выби­ра­ем Послед­няя ста­биль­ная сбор­ка (или про­сто Послед­няя сбор­ка):

Кли­ка­ем по Console Output:

Мы долж­ны уви­деть вывод всех ком­мен­та­рий и команд, кото­рые выпол­ня­лись во вре­мя сборки.

Обработка в Docker

Jenkins может выпол­нять зада­ние внут­ри Docker. Таким обра­зом, мы можем исполь­зо­вать кон­тей­не­ры с настро­ен­ной сре­дой, необ­хо­ди­мой для тести­ро­ва­ния и сбор­ки кода и полу­че­ния необ­хо­ди­мых артефактов.

Рас­смот­рим настрой­ку сер­ве­ра для воз­мож­но­сти исполь­зо­вать Docker и при­мер кода на Groovy.

Подготовка системы

Мы долж­ны выпол­нит ряд действий:

  • Уста­нов­ку пла­ги­на для рабо­ты Jenkins с Docker.
  • Уста­нов­ку сер­ви­са Docker в системе.
  • Настрой­ку привилегий.

1. Нач­нем с уста­нов­ки пла­ги­на. На глав­ной стра­ни­це Jenkins пере­хо­дим в настройки:

Кли­ка­ем по раз­де­лу Управ­ле­ние пла­ги­на­ми:

Сре­ди спис­ка пла­ги­нов нахо­дим «Docker Pipeline» и отме­ча­ем его для установки:

Пере­хо­дим к установке:

… и дожи­ва­ем­ся ее окончания.

2. Под­клю­ча­ем­ся к кон­со­ли по SSH и выпол­ня­ем Уста­нов­ку Docker.

3. Что­бы мож­но было под­клю­чить­ся к Docker из Jenkins, необ­хо­ди­мо, что­бы поль­зо­ва­тель jenkins вхо­дил в груп­пу docker — для это­го выпол­ня­ем команду:

usermod -a -G docker jenkins

После необ­хо­ди­мо пере­за­пу­стить дженкинс:

systemctl restart jenkins

Сре­да гото­ва для рабо­ты с контейнерами.

Использование агента docker

Пере­хо­дим к настрой­ке наше­го зада­ния или созда­ем новое и при­во­дим Groovy-код к тако­му виду:

* обра­ти­те вни­ма­ние, мы изме­ни­ли аген­та на docker с ука­за­ни­ем обра­за, в кото­ром будет выпол­нять­ся обра­бот­ка — в дан­ном при­ме­ре, с помо­щью python (послед­ней вер­сии). Так­же мы доба­ви­ли этап Под­го­тов­ка, в кото­ром про­сто выве­дем на экран вер­сию python.

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

Для подроб­но­го про­смот­ра хода про­цес­са (или реше­ния про­блем в слу­чае их воз­ник­но­ве­ния), кли­ка­ем по стрел­ке спра­ва от назва­ния зада­ния и пере­хо­дим к сборке:

Пере­хо­дим к консоли:

Если зада­ние выпол­не­но успеш­но, сре­ди логов мы долж­ны уви­деть вер­сию исполь­зу­е­мо­го в кон­тей­не­ре Docker python: