Сегодня за DevOps, GitLab и как сделать комфортный pipeline с выпадающими списками Variables + бонусы.

Из коробки, когда ты жмёшь кнопку Run Pipeline, тебе нужно руками вбивать нужные Variables, например, чтобы указать окружение, в которое будет раскатан релиз.

Каждый раз вбивать руками Variable ENVIRONMENT=stage / production — ну пиздец тяжко и неудобно. А если таких переменных овердохуя, то всё желание пропадает что-то делать.

Хочется, чтобы был выпадающий список со всеми параметрами. Накликал мышкой — и в продакшен.

Выпадающие списки можно делать не только с окружениями, но и добавить банальные вопросы YES/NO и прочее. А затем в секции rules уже всё это разруливать и обрабатывать.

Ниже базовая болванка

Создаём файл .gitlab-ci.yml в корне проекта и добавляем в него:

variables:
  ENVIRONMENT:
    value: "N/A"
    options:
      - "N/A"
      - "STAGE"
      - "PRODUCTION"
    description: "Deployment environment"

.stage_server:
  &stage_server
    WEB_NODE: "xx.xx.xx.xx"
    DB_NODE: "xx.xx.xx.xx"

.production_server:
  &production_server
    WEB_NODE: "xx.xx.xx.xx"
    DB_NODE: "xx.xx.xx.xx"

deploy:
  tags:
    - common-runner
  script:
    - echo $ENVIRONMENT
    - echo "build & deploy here"
  rules:
    - if: '$ENVIRONMENT == "STAGE"'
      variables:
        <<: *stage_server
    - if: '$ENVIRONMENT == "PRODUCTION"'
      variables:
        <<: *production_server

В первой секции variables описываем выпадающий список. Из него будем выбирать мышкой, куда деплоить.

N/A — выбран по умолчанию — добавлено для дураков, которые ничего не выбирают и сразу тыкают Run Pipeline. В таком случае пайплайн зафейлится и ничего не пострадает.

Дальше идут две секции, которые описывают окружения stage и production, там указываем айпишники и вообще всё, что захотим для каждого окружения. Можно флагов навтыкать и прочего говна.

Ну и основная секция deploy: у меня указан раннер с тегом common-runner, а потом полезная нагрузка, которая будет выполнена.

В секции rules зашита логика. В зависимости от того, какое окружение было выбрано из выпадающего списка, применяются настройки либо от stage, либо от production. Короче, инклудится нужное.

Собственно, всё. Если нужно добавить ещё каких-то выпадающих списков, добавляем в первую секцию всё необходимое, аналогично ENVIRONMENT. Ну и потом в rules всё это обрабатываем. Например, так:

- if: '$JOB == "YES" && $ENVIRONMENT == "STAGE"'

В общем, всё элементарно. По итогу получаем незамысловатый пайплайн, всё в одном месте и ничего не раскидано по самому GitLab.

Бонусы

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

Создаём репу dev/pipelines, кидаем туда файл .gitlab-ci.yml, настраиваем в нём всё под свои реалии.

Дальше в нужных проектах добавляем файл .gitlab-ci.yml с таким содержимым:

include:
  - project: "dev/pipelines"
    file: ".gitlab-ci.yml"
Роман Шубин
Роман Шубин
CEO & CTO, Главред в «Цифровой улей»
Задать вопрос
Теперь не надо плодить кучу .gitlab-ci.yml с одинаковым содержимым: всё инклудится из одного места.

Ну и если нужно что-то поменять, меняем один раз, и все проекты автоматически это подхватывают.

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

Хорошего тебе дня, увидимся!