Променливите в Gitlab могат да бъдат зададени на няколко места:
- В настройките на групите
- В настройките на проекта
- Внутре .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 Джобът завърши успешно - echo with vars:
$ echo $MSG Custom in job .gitlab-ci.yml Джобът завърши успешно
Наследяване с групи и вътре в .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 Джобът завърши успешно - echo with vars:
$ echo $MSG Y Джобът завърши успешно
Наследяване с указване на променливи в настройките на проекта [исходници]
Променливите в настройките на проекта винаги имат най-висок приоритет! И променливите, зададени вътре в .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 Джобът завърши успешно - echo with vars:
$ echo $MSG project-3 Джобът завърши успешно
Наследяване с празна стойност [исходници]
Празната стойност – това също е стойност
Празната стойност – това не е 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 Джобът завърши успешно - echo with vars:
$ echo $MSG Джобът завърши успешно
Наследяване с инклуда и групи [исходници]
Тук ще опитаме да инклудаме project-3 в project-2
Групите в този случай имат предимство.
Групи c променливи

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