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

Променливите в GitLab могат да бъдат зададени на няколко места:

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

При това променливите в настройките на групи и проекта могат да бъдат зададени като „файл“ или „обикновена променлива“ и да се поставят отметки „защитено“ и „маскирано“.

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

Нека започнем с проста наследственост и постепенно да усложняваме.

С окончателния списък на приоритетите можете да се запознаете в края на документа.

Наследственост с групи [източници]

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

Групи с променливи

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

.gitlab-ci.yml

image: busybox:latest
variables:
  GIT_STRATEGY: none

echo:
  stage: test
  script:
    - echo $MSG

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

$ echo $MSG
B

Ако променливата не беше зададена в група B, щяхме да видим стойността A.

Наследственост на променливите в .gitlab-ci.yml [източници]

Тук всичко е доста просто: можете да зададете глобална променлива или да я презапишете в рамките на джоб.

Групи с променливи

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

.gitlab-ci.yml

Сега ще създадем 2 джоба, в един от които ясно ще зададем $MSG.

image: busybox:latest
variables:
  GIT_STRATEGY: none
  MSG: "Персонализирано в глобалното .gitlab-ci.yml"

echo:
  stage: test
  script:
    - echo $MSG

echo с променлива:
  stage: test
  variables:
    MSG: "Персонализирано в джоба .gitlab-ci.yml"
  script:
    - echo $MSG

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

  • echo:
    $ echo $MSG
    Персонализирано в глобалното .gitlab-ci.yml
    Джобът е успешен
  • echo с променливи:
    $ echo $MSG
    Персонализирано в джоба .gitlab-ci.yml
    Джобът е успешен

Наследственост с групи и в .gitlab-ci.yml [източници]

Нека опитаме да обединим предишните 2 примера. Променливите от групите имат приоритет пред променливите в .gitlab-ci.yml.

Групи с променливи

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

.gitlab-ci.yml

image: busybox:latest
variables:
  GIT_STRATEGY: none
  MSG: "Персонализирано в глобалното .gitlab-ci.yml"

echo:
  stage: test
  script:
    - echo $MSG

echo с променлива:
  stage: test
  variables:
    MSG: "Персонализирано в джоба .gitlab-ci.yml"
  script:
    - echo $MSG

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

  • echo:
    $ echo $MSG
    Y
    Джобът е успешен
  • echo с променливи:
    $ echo $MSG
    Y
    Джобът е успешен

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

Променливите в настройките на проекта винаги имат най-висок приоритет! И променливите, зададени в .gitlab-ci.yml, нямат никакво значение.

Групи с променливи

Променливите от групите имат по-нисък приоритет.
Как Gitlab-CI наследява променливи на средата?

.gitlab-ci.yml

Нека използваме файла от предишния пример. Тук отново има променливи, зададени в .gitlab-ci.yml, но променливите в групите все пак имат приоритет пред тях.

image: busybox:latest
variables:
  GIT_STRATEGY: none
  MSG: "Персонализирано в глобалното .gitlab-ci.yml"

echo:
  stage: test
  script:
    - echo $MSG

echo с променлива:
  stage: test
  variables:
    MSG: "Персонализирано в джоба .gitlab-ci.yml"
  script:
    - echo $MSG

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

  • echo:
    $ echo $MSG
    project-3
    Джобът е успешен
  • echo с променливи:
    $ echo $MSG
    project-3
    Джобът е успешен

Наследственост с празна стойност [източници]

Празната стойност също е стойност
Празната стойност не е Null

Групи с променливи

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

.gitlab-ci.yml

image: busybox:latest
variables:
  GIT_STRATEGY: none
  MSG: "Персонализирано в глобалното .gitlab-ci.yml"

echo:
  stage: test
  script:
    - echo $MSG

echo с променлива:
  stage: test
  variables:
    MSG: "Персонализирано в джоба .gitlab-ci.yml"
  script:
    - echo $MSG

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

  • echo:
    $ echo $MSG
    Джобът е успешен
  • echo с променливи:
    $ echo $MSG
    Джобът е успешен

Наследственост с включване и групи [източници]

Тук ще опитаме да включим project-3 в project-2
Групите в този случай имат приоритет.

Групи с променливи

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

.gitlab-ci.yml

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

variables:
 MSG: "С включване в .gitlab-ci.yml"
include:
 - project: how-is-gitlab-ci-inherit-environment-variables/z/y/project-3
   file: '.gitlab-ci.yml'

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

  • echo:
    $ echo $MSG
    B
    Джобът е успешен
  • echo с променливи:
    $ echo $MSG
    B
    Джобът е успешен

Наследственост с включване [източници]

Тук ще опитаме в project-2 да включим project-3.
При условии, че нито групата, нито самият проект имат каквито и да е променливи.

Групи с променливи

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

.gitlab-ci.yml

Същото както в предишния пример

variables:
 MSG: "С включване в .gitlab-ci.yml"
include:
 - project: how-is-gitlab-ci-inherit-environment-variables/z/y/project-3
   file: '.gitlab-ci.yml'

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

  • echo:
    $ echo $MSG
    С включено .gitlab-ci.yml
    Задачата завърши успешно
  • echo с променливи:
    $ echo $MSG
    Персонализирано в джоба .gitlab-ci.yml
    Джобът е успешен

Получават се следните приоритети:

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

Заключение

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

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster