Как Gitlab-CI наследует переменные окружения?

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

Переменные в Gitlab можно задать в нескольких местах:


  1. В настройках групп
  2. В настройках проекта
  3. Внутри .gitlab-ci.yml

При этом переменные в настройках групп и проекта можно задать как "файл"или "обычную переменную" и поставить галочки "защищено" и "маскировать".



Начнем с простого наследования и будет постепенно усложняться.


С конечным списком уровней приоритетов можно ознакомиться в конце документа.


Наследование с группами [исходники]


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


Группы с переменными


Группы с переменными


.gitlab-ci.yml


image: busybox:latest
variables:
  GIT_STRATEGY: none

echo:
  stage: test
  script:
    - echo $MSG

Результат пайлайна


$ echo $MSG
B

Если бы переменная не была указана в группе B, то мы бы увидели значение А.




Наследование переменных внутри .gitlab-ci.yml [исходники]


Здесь все довольно просто: можно задать глобально переменную, а можно перезаписать ее внутри джобы.


Группы c переменными



.gitlab-ci.yml


Создадим теперь 2 джобы, в одной из них явно укажем $MSG.


image: busybox:latest
variables:
  GIT_STRATEGY: none
  MSG: "Custom in global .gitlab-ci.yml"

echo:
  stage: test
  script:
    - echo $MSG

echo with var:
  stage: test
  variables:
    MSG: "Custom in job .gitlab-ci.yml"
  script:
    - echo $MSG

Результат пайлайна


  • echo:


    $ echo $MSG
    Custom in global .gitlab-ci.yml
    Job succeeded

  • echo with vars:


    $ echo $MSG
    Custom in job .gitlab-ci.yml
    Job succeeded




Наследование с группами и внутри .gitlab-ci.yml [исходники]


Попробуем объединить предыдущие 2 примера. Переменные групп в приоритете перед переменными внутри .gitlab-ci.yml.


Группы c переменными



.gitlab-ci.yml


image: busybox:latest
variables:
  GIT_STRATEGY: none
  MSG: "Custom in global .gitlab-ci.yml"

echo:
  stage: test
  script:
    - echo $MSG

echo with var:
  stage: test
  variables:
    MSG: "Custom in job .gitlab-ci.yml"
  script:
    - echo $MSG

Результат пайлайна


  • echo:


    $ echo $MSG
    Y
    Job succeeded

  • echo with vars:


    $ echo $MSG
    Y
    Job succeeded




Наследование с указанием переменных в настройках проекта [исходники]


Переменные в настройках проекта имеют ВСЕГДА наивысший приоритет! И переменные, указанные внутри .gitlab-ci.yml не играют никакой роли.


Группы c переменными


Переменные групп имеют меньший приоритет.


.gitlab-ci.yml


Воспользуемся файлом из предыдущего примера. Здесь опять есть, переменные, указанные внутри .gitlab-ci.yml, но переменные внутри групп все равно имеют перед ними приоритет.


image: busybox:latest
variables:
  GIT_STRATEGY: none
  MSG: "Custom in global .gitlab-ci.yml"

echo:
  stage: test
  script:
    - echo $MSG

echo with var:
  stage: test
  variables:
    MSG: "Custom in job .gitlab-ci.yml"
  script:
    - echo $MSG

Результат пайлайна


  • echo:


    $ echo $MSG
    project-3
    Job succeeded

  • echo with vars:


    $ echo $MSG
    project-3
    Job succeeded




Наследование с пустым значением [исходники]


Пустое значение – это тоже значение
Пустое значение – это не Null


Группы c переменными



.gitlab-ci.yml


image: busybox:latest
variables:
  GIT_STRATEGY: none
  MSG: "Custom in global .gitlab-ci.yml"

echo:
  stage: test
  script:
    - echo $MSG

echo with var:
  stage: test
  variables:
    MSG: "Custom in job .gitlab-ci.yml"
  script:
    - echo $MSG

Результат пайлайна


  • echo:


    $ echo $MSG
    Job succeeded

  • echo with vars:


    $ echo $MSG
    Job succeeded




Наследование с инклюдом и группами [исходники]


Здесь попробуем в project-2 заинклюдить project-3
Группы в данном случае имеют приоритет.


Группы c переменными



.gitlab-ci.yml


И зададим переменную глобально в .gitlab-ci.yml


variables:
 MSG: "With  include  .gitlab-ci.yml"
include:
 - project: how-is-gitlab-ci-inherit-environment-variables/z/y/project-3
   file: '.gitlab-ci.yml'

Результат пайлайна


  • echo:


    $ echo $MSG
    B
    Job succeeded

  • echo with vars:


    $ echo $MSG
    B
    Job succeeded




Наследование с инклюдом [исходники]


Здесь попробуем в project-2 заинклюдить project-3.
C условием что: ни группы, ни сам проект не имеют никаких переменных.


Группы c переменными



.gitlab-ci.yml


Такой же как в предыдущем примере


variables:
 MSG: "With  include  .gitlab-ci.yml"
include:
 - project: how-is-gitlab-ci-inherit-environment-variables/z/y/project-3
   file: '.gitlab-ci.yml'

Результат пайлайна


  • echo:


    $ echo $MSG
    With include .gitlab-ci.yml
    Job succeeded

  • echo with vars:


    $ echo $MSG
    Custom in job .gitlab-ci.yml
    Job succeeded


Получаются следующие приоритеты:


  1. Переменные в настройках проекта
  2. Переменные в группах
  3. Переменные строго указанные внутри джобы (в том числе и заинклюденные файлы)
  4. Глобальные переменные внутри .gitlab-ci.yml
  5. Глобальные переменные внутри заинклюденных файлов

Заключение


Самым не очевидным моментом является, что правило "чем ближе переменная к коду, тем она главнее" работает сначала для групп, а затем такое же правило и для переменных внутри .gitlab-ci.yml, но только с условием что переменные в группах не заданны.
Далее важным местом является понимание того, что глобальное пространство для основного и заинклюденного .gitlab-ci.yml – общее. И тот файл в который происходит инклюд имеет приоритет.

Источник: https://habr.com/ru/post/491490/


Интересные статьи

Интересные статьи

В 1С-Битрикс: Управление сайтом (как и в Битрикс24) десятки, если не сотни настраиваемых типов данных (или сущностей): инфоблоки, пользователи, заказы, склады, форумы, блоги и т.д. Стр...
Вам приходилось сталкиваться с ситуацией, когда сайт или портал Битрикс24 недоступен, потому что на диске неожиданно закончилось место? Да, последний бэкап съел все место на диске в самый неподходящий...
Каждый лишний элемент на сайте — это кнопка «Не купить», каждая непонятность или трудность, с которой сталкивается клиент — это крестик, закрывающий в браузере вкладку с вашим интернет-магазином.
У нас был сервис на golang, отдельный топик kafka, clickhouse, gitlab-ci и падающий пайплайн, протухший ssh-ключ и вот это вот все, а еще сезон отпусков, жуткие ливни в городе, сломавшийся ноутбу...
В предыдущей статье Где хранятся ваши константы на микроконтроллере CortexM (на примере С++ IAR компилятора), был разобран вопрос о том, как расположить константные объекты в ROM. Теперь же я...