Променливите в GitLab могат да бъдат зададени на няколко места:
- В настройки на групи
- В настройки на проекта
- В рамките на .gitlab-ci.yml
При това променливите в настройките на групи и проекта могат да бъдат зададени като „файл“ или „обикновена променлива“ и да се поставят отметки „защитено“ и „маскирано“.

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

.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.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.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.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.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.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.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 Джобът е успешен
Получават се следните приоритети:
- Променливи в настройките на проекта
- Променливи в групите
- Променливи, строго указани вътре в джобовете (включително и включените файлове)
- Глобални променливи в .gitlab-ci.yml
- Глобални променливи в включените файлове
Заключение
Най-малко очевидният момент е, че правилото "колкото по-близо е променлива до кода, толкова по-важна е" работи първо за групите, а след това същото правило важи и за променливите вътре в .gitlab-ci.yml, но само при условие, че променливите в групите не са зададени.
Следва важното място за разбирането, че глобалното пространство за основния и включения .gitlab-ci.yml е общо. И файлът, в който се извършва вклучването, има приоритет.
Източник: habr.com
