Gitlab Pipelines - шпаргалка

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

Шаблоны

В дан­ном раз­де­ле напи­шем несколь­ко гото­вых шаб­ло­нов, кото­рые мож­но взять за осно­вы при напи­са­нии сво­е­го сценария.

1. Мини­маль­ный сце­на­рий. Для неболь­ших зада­ний, состо­я­щих из пары заданий:

* где:

  • stages — опи­са­ние ста­дий наше­го пай­плай­на. В дан­ном при­ме­ре, все­го одна.
  • TASK_NAME — имя нашей задачи. 
    • stage — ста­дия, к кото­рой отно­сит­ся наше задание.
    • script — набор скрип­тов для выполнения.

2. Стан­дарт­ный цикл при сбор­ке. Обыч­но, про­цесс CI/CD вклю­ча­ет сле­ду­ю­щие шаги:

  • Сбор­ка пакета.
  • Тести­ро­ва­ние.
  • Достав­ка.
  • Раз­вер­ты­ва­ние.

Для напи­са­ния тако­го сце­на­рия за осно­ву мож­но взять шаблон:

Задания

В дан­ном раз­де­ле мы рас­смот­рим опции, кото­рые могут при­ме­нять­ся при опи­са­нии зада­ния. Общий синтаксис:

Мы пере­чис­лим лишь часто встре­ча­е­мые опции. Пол­ный спи­сок мож­но най­ти в офи­ци­аль­ной доку­мен­та­ции.

Stage

https://docs.gitlab.com/ee/ci/yaml/#stages.

Опция ука­зы­ва­ет, к какой ста­дии отно­сит­ся зада­ние. Например:

Сами же ста­дии опи­сы­ва­ют­ся в общей дирек­ти­ве stages.

Image

https://docs.gitlab.com/ee/ci/yaml/#image.

Зада­ем имя обра­за, если наше зада­ние выпол­ня­ет­ся в кон­тей­не­ре docker:

Before_script

https://docs.gitlab.com/ee/ci/yaml/#before_script.

Дан­ная опция опре­де­ля­ет спи­сок команд, кото­рые долж­ны выпол­нять­ся перед опци­ей script и после полу­че­ния артефактов.

Script

https://docs.gitlab.com/ee/ci/yaml/#script.

Основ­ная часть, где выпол­ня­ют­ся зада­ния сце­на­рия, опи­са­на в опции script. Рас­смот­рим ее подробнее.

1. Опи­са­ние мас­си­ва команд. Мы про­сто пере­чис­ля­ем спис­ком те коман­ды, кото­рые необ­хо­ди­мо после­до­ва­тель­но выпол­нить наше­му сце­на­рию в кон­крет­ной задаче:

2. Длин­ные коман­ды, раз­би­тые на несколь­ко строк. Нам может потре­бо­вать­ся выпол­нить коман­ды в виде скрип­та (с опе­ра­то­ра­ми срав­не­ния, напри­мер). В этом слу­чае будет удоб­на мно­го­строч­ная запись. Ее мож­но ука­зать раз­ны­ми способами.

Инди­ка­тор | :

* для него каж­дая новая стро­ка явля­ет­ся пере­хо­дом к новой коман­де или части опе­ра­то­ра. По сути, это близ­ко к логи­ке скрип­та shell.

Инди­ка­тор > :

* дан­ный инди­ка­тор интер­пре­ти­ру­ет новую коман­ду после пустой строки.

After_script

https://docs.gitlab.com/ee/ci/yaml/#after_script.

Набор команд, кото­рые запус­ка­ют­ся после scripts, даже, при неудач­ном завер­ше­нии последнего.

Artifacts

https://docs.gitlab.com/ee/ci/yaml/#artifacts.

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

1. Напри­мер, так мож­но ука­зать, какие фай­лы будут артефактами:

* в моем при­ме­ре, в арте­фак­ты попа­дут все фай­лы, назва­ние кото­рых закан­чи­ва­ет­ся на txt, а так­же фай­лы ${PKG_NAME}.deb и ${PKG_NAME}.rpm, где ${PKG_NAME} — пере­мен­ная (подроб­нее о пере­мен­ных ниже).

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

2. Так­же мы можем пере­дать систем­ные пере­мен­ные, кото­рые были нами пере­да­ны в файл:


* в дан­ном при­ме­ре мы пере­да­дим систем­ную пере­мен­ную VERSION со зна­че­ни­ем 1.1.1 через файл variables.env.

Extends

https://docs.gitlab.com/ee/ci/yaml/#extends.

Поз­во­ля­ет выне­сти часть сце­на­рия в отдель­ный блок и объ­еди­нить его с зада­ни­ем. Что­бы это луч­ше понять, рас­смот­рим кон­крет­ный пример:

И так, в нашем зада­нии TASK_NAME мы исполь­зу­ем extends. В резуль­та­те, зада­ние при­мет такой вид:


Что произошло:
  • stage: build попа­ло в зада­ние из my_extend.
  • про­изо­шло объ­еди­не­ние variables, ито­го в зада­ние попа­ли VERSIONPASSWORD и USERNAME.
  • script исполь­зу­ет­ся из зада­ния (зна­че­ния клю­чей не объ­еди­ня­ют­ся, при­о­ри­тет за зна­че­ни­ем основ­но­го задания).

Environment

https://docs.gitlab.com/ee/ci/yaml/#environment.

Поз­во­ля­ет ука­зать систем­ную пере­мен­ную, кото­рая будет созда­на для выпол­не­ния задания.

Директивы правил и ограничений

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

Rules

https://docs.gitlab.com/ee/ci/yaml/#rules.

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

When

https://docs.gitlab.com/ee/ci/yaml/#when.

Опре­де­ля­ет усло­вия запус­ка зада­ния, напри­мер, толь­ко руч­ной запуск или через опре­де­лен­ный интер­вал времени.

Needs

https://docs.gitlab.com/ee/ci/yaml/#needs.

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

Правила и условия

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

Rules

Регла­мен­ти­ру­ет раз­лич­ные пра­ви­ла, опре­де­лен­ные с помощью:

  • if.
  • changes.
  • exists.
  • allow_failure.
  • variables.

1. Опе­ра­тор if. Поз­во­ля­ем про­ве­рить усло­вие, напри­мер, если пере­мен­ная рав­на опре­де­лен­но­му значению:

* в дан­ном при­ме­ре ком­мит дол­жен быть выпол­нен в бран­че по умолчанию.

2. Изме­не­ния затро­ну­ли опре­де­лен­ные фай­лы. Про­вер­ка выпол­ня­ет­ся с помо­щью опции changes.

В дан­ном при­ме­ре, файл script.sql:

3. Несколь­ко усло­вий. Усло­вий для нача­ла выпол­не­ния зада­ния может быть несколь­ко. Рас­смот­рим несколь­ко примеров.

а) При усло­вии, что ком­мит выпол­нен в бран­че по умол­ча­нию И изме­не­ния затро­ну­ли файл script.sql:

б) При усло­вии, что ком­мит выпол­нен в бран­че по умол­ча­нию ИЛИ изме­не­ния затро­ну­ли файл script.sql


4. Про­вер­ка на суще­ство­ва­ние фай­ла. Опре­де­ля­ет­ся с помо­щью exists:

* зада­ние будет выпол­нять­ся толь­ко в слу­чае при­сут­ствия фай­ла script.sql.

5. Раз­ре­шить сбой зада­ния. Зада­ет­ся с помо­щью allow_failure:

* в дан­ном при­ме­ре наш кон­вей­ер про­дол­жит рабо­ту, если зада­ние TASK_NAME будет выпол­не­но с ошибкой.

6. Опре­де­ле­ние пере­мен­ной в зави­си­мо­сти от усло­вия. Для это­го исполь­зу­ют­ся вме­сте if и variables:

 

When

Опре­де­ля­ет усло­вия запус­ка зада­ния. Воз­мож­ные значения:

  • on_success (по умол­ча­нию) — если все зада­ния на более ран­них эта­пах завер­ши­лись успеш­но или име­ют allow_failure: true.
  • manual — запуск вруч­ную (в пане­ли pipeline появит­ся кноп­ка запуска).
  • always — запус­кать все­гда, неза­ви­си­мо от преды­ду­щих результатов.
  • on_failure — толь­ко в слу­чае сбоя, хотя бы, одно­го зада­ния на более ран­нем этапе.
  • delayed — отло­жить запуск зада­ния. Кон­тро­ли­ро­вать срок мож­но с помо­щью дирек­ти­вы start_in.
  • never — нико­гда не запус­кать задание.

Раз­бе­рем примеры.

1. Manual:

* зада­ние не нач­нет выпол­нять­ся, пока мы не нажмем кноп­ку запус­ка в GitLab CI/CD.

2. Always:

* зада­ние будет выпол­нять­ся все­гда. Удоб­но, напри­мер, если нуж­но сфор­ми­ро­вать отчет­ный файл, неза­ви­си­мо от резуль­та­тов сборки.

3. On_failure:

* зада­ние будет выпол­нять­ся при нали­чии ошиб­ки на ран­них эта­пах. Мож­но исполь­зо­вать для отправ­ки уведомления.

4. Delayed:

* запуск зада­ния будет отло­жен на 30 минут.

5. Never:

* зада­ние не будет выполняться.

6. Исполь­зо­ва­ние вме­сте с if:

* в дан­ном при­ме­ре зада­ние будет выпол­нять­ся, если ком­мит про­шел в основ­ной вет­ке и если адми­ни­стра­тор под­твер­дил запуск.

Needs

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

Рас­смот­рим примеры.

1. Artifacts. При­ни­ма­ет зна­че­ние true (по умол­ча­нию) и false. Для запус­ка зада­ния нуж­но, что­бы на преды­ду­щих эта­пах были загру­же­ны арте­фак­ты. Запись:

… поз­во­ля­ет начать выпол­не­ние зада­ния без этого.

2. Job. Поз­во­ля­ет начать выпол­не­ние зада­чи толь­ко после завер­ше­ния дру­го­го задания:

* в нашем при­ме­ре зада­ча нач­нет выпол­нять­ся не рань­ше завер­ше­ния зада­чи с назва­ни­ем createBuild.

Дополнительные параметры и переменные

В дан­ном раз­де­ле мы рас­смот­рим раз­лич­ные опции, кото­рые не вошли в дру­гие раз­де­лы, а так­же рабо­ту с переменными.

1. Workflow. Поз­во­ля­ем задать общие пра­ви­ла запус­ка для все­го кон­вей­е­ра. Рас­смот­рим при­мер с офи­ци­аль­но­го сайта:

В дан­ном при­ме­ре конвейер:

  • Не будет запу­щен, если назва­ние ком­ми­та содер­жит текст draft.
  • Будет запу­щен, если пай­плайн сра­бо­тал после merge request.
  • Будет запу­щен, если изме­не­ния вне­се­ны в основ­ную вет­ку репозитория.

2. Зна­че­ния по умол­ча­нию. Зада­ют­ся в дирек­ти­ве default. Опции с дан­ны­ми зна­че­ни­я­ми будут исполь­зо­вать­ся во всех зада­ни­ях или могут быть пере­опре­де­ле­ны на уровне кон­крет­но­го задания.

При­мер:

* мы опре­де­ли­ли опцию с име­нем обра­за (напри­мер, обра­за docker) и тег (теги могут быть необ­хо­ди­мы для запус­ка неко­то­рых runner).

3. Импорт кон­фи­гу­ра­ции из дру­го­го фай­ла yml. Может быть полез­ным, напри­мер, для напи­са­ния общей части сце­на­рия, кото­рую мы захо­тим при­ме­нять ко всем pipeline. Выпол­ня­ет­ся с помо­щью опции include:

* в дан­ном при­ме­ре мы под­клю­чим к наше­му сце­на­рию содер­жи­мое фай­ла Custom/.gitlab-ci.yml.

4. Опре­де­ле­ние и исполь­зо­ва­ние пере­мен­ных. Зада­ют­ся с помо­щью дирек­ти­вы variables.

Мож­но опре­де­лить гло­баль­но для всех заданий:

Или для кон­крет­но­го задания:

Теперь мож­но исполь­зо­вать нашу пере­мен­ную в сце­на­рии. Для это­го ста­вим перед ее назва­ни­ем знак дол­ла­ра, а так­же сто­ит заклю­чить его в фигур­ные скоб­ки, например: