- PVSM.RU - https://www.pvsm.ru -

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

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

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

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

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

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

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

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

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

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

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

.gitlab-ci.yml [2]

image: busybox:latest
variables:
  GIT_STRATEGY: none

echo:
  stage: test
  script:
    - echo $MSG

Результат пайлайна [3]

$ echo $MSG
B

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


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

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

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

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

.gitlab-ci.yml [2]

Создадим теперь 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

Результат пайлайна [5]

  • 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 [исходники] [6]

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

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

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

.gitlab-ci.yml [2]

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

Результат пайлайна [7]

  • echo:

    $ echo $MSG
    Y
    Job succeeded

  • echo with vars:

    $ echo $MSG
    Y
    Job succeeded


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

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

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

Переменные групп имеют меньший приоритет.
Как Gitlab-CI наследует переменные окружения? - 5

.gitlab-ci.yml [2]

Воспользуемся файлом из предыдущего примера. Здесь опять есть, переменные, указанные внутри .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

Результат пайлайна [9]

  • echo:

    $ echo $MSG
    project-3
    Job succeeded

  • echo with vars:

    $ echo $MSG
    project-3
    Job succeeded


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

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

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

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

.gitlab-ci.yml [2]

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

Результат пайлайна [11]

  • echo:

    $ echo $MSG
    Job succeeded

  • echo with vars:

    $ echo $MSG
    Job succeeded


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

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

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

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

.gitlab-ci.yml [12]

И зададим переменную глобально в .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'

Результат пайлайна [13]

  • echo:

    $ echo $MSG
    B
    Job succeeded

  • echo with vars:

    $ echo $MSG
    B
    Job succeeded


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

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

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

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

.gitlab-ci.yml [12]

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

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

Результат пайлайна [15]

  • 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 – общее. И тот файл в который происходит инклюд имеет приоритет.

Автор: Дмитрий Жиляев

Источник [16]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/git/348888

Ссылки в тексте:

[1] [исходники]: https://gitlab.com/how-is-gitlab-ci-inherit-environment-variables/a/b/project-8

[2] .gitlab-ci.yml: https://gitlab.com/how-is-gitlab-ci-inherit-environment-variables/a/b/project-8/-/blob/master/.gitlab-ci.yml

[3] Результат пайлайна: https://gitlab.com/how-is-gitlab-ci-inherit-environment-variables/a/b/project-8/-/jobs/460514261

[4] [исходники]: https://gitlab.com/how-is-gitlab-ci-inherit-environment-variables/d/project-4

[5] Результат пайлайна: https://gitlab.com/how-is-gitlab-ci-inherit-environment-variables/d/project-4/pipelines/123507496

[6] [исходники]: https://gitlab.com/how-is-gitlab-ci-inherit-environment-variables/z/y/project-1

[7] Результат пайлайна: https://gitlab.com/how-is-gitlab-ci-inherit-environment-variables/z/y/project-1/pipelines/123486449

[8] [исходники]: https://gitlab.com/how-is-gitlab-ci-inherit-environment-variables/z/y/project-3

[9] Результат пайлайна: https://gitlab.com/how-is-gitlab-ci-inherit-environment-variables/z/y/project-3/pipelines/123583808

[10] [исходники]: https://gitlab.com/how-is-gitlab-ci-inherit-environment-variables/z/y/project-5

[11] Результат пайлайна: https://gitlab.com/how-is-gitlab-ci-inherit-environment-variables/z/y/project-5/pipelines/123503127

[12] .gitlab-ci.yml: https://gitlab.com/how-is-gitlab-ci-inherit-environment-variables/d/project-6/-/blob/master/.gitlab-ci.yml

[13] Результат пайлайна: https://gitlab.com/how-is-gitlab-ci-inherit-environment-variables/a/b/project-2/pipelines/123509948

[14] [исходники]: https://gitlab.com/how-is-gitlab-ci-inherit-environment-variables/d/project-6

[15] Результат пайлайна: https://gitlab.com/how-is-gitlab-ci-inherit-environment-variables/d/project-6/pipelines/123509858

[16] Источник: https://habr.com/ru/post/491490/?utm_source=habrahabr&utm_medium=rss&utm_campaign=491490