Как 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, щяхме да видим стойността А.

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

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

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

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

.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
    Джобът завърши успешно
  • echo with vars:
    $ echo $MSG
    Custom in job .gitlab-ci.yml
    Джобът завърши успешно

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

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

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

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

.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
    Джобът завърши успешно
  • echo with vars:
    $ echo $MSG
    Y
    Джобът завърши успешно

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

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

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

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

.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
    Джобът завърши успешно
  • echo with vars:
    $ echo $MSG
    project-3
    Джобът завърши успешно

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

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

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

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

.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
    Джобът завърши успешно
  • echo with vars:
    $ echo $MSG
    Джобът завърши успешно

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

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

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

Как 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 with vars:
    $ echo $MSG
    B
    Джобът завърши успешно

Наследяване с инклуда [исходници]

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

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

Как 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 with vars:
    $ echo $MSG
    Custom in job .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