Zmienne w Gitlab można zdefiniować w kilku miejscach:
- W ustawieniach grup
- W ustawieniach projektu
- Wewnątrz .gitlab-ci.yml
Zmienne w ustawieniach grup i projektu można zadeklarować jako „plik” lub „zwykłą zmienną” oraz zaznaczyć opcje „chroniona” i „maskować”.

Zacznijmy od prostego dziedziczenia, a następnie stopniowo przejdziemy do bardziej zaawansowanych przykładów.
Ostatnią listę priorytetów można znaleźć na końcu dokumentu.
Dziedziczenie z grupami [źródła]
Zmienne z grup są dziedziczone, przy zasadzie, że im bliżej projektu znajduje się grupa, tym ważniejsza jest jej wartość.
Grupy z zmiennymi

.gitlab-ci.yml
image: busybox:latest
zmienne:
GIT_STRATEGY: none
echo:
etap: test
skrypt:
- echo $MSGWynik potoku
$ echo $MSG
BGdyby zmienna nie była określona w grupie B, zobaczylibyśmy wartość A.
Dziedziczenie zmiennych wewnątrz .gitlab-ci.yml [źródła]
Tutaj wszystko jest dość proste: można zdefiniować zmienną globalnie lub nadpisać ją wewnątrz zadania.
Grupy z zmiennymi

.gitlab-ci.yml
Teraz utwórzmy 2 zadania, w jednym z nich wyraźnie określimy $MSG.
image: busybox:latest
zmienne:
GIT_STRATEGY: none
MSG: "Niestandardowy w globalnym .gitlab-ci.yml"
echo:
etap: test
skrypt:
- echo $MSG
echo z zmienną:
etap: test
zmienne:
MSG: "Niestandardowy w zadaniu .gitlab-ci.yml"
skrypt:
- echo $MSGWynik potoku
- echo:
$ echo $MSG Niestandardowy w globalnym .gitlab-ci.yml Zadanie zakończone powodzeniem - echo z zmiennymi:
$ echo $MSG Niestandardowy w zadaniu .gitlab-ci.yml Zadanie zakończone powodzeniem
Dziedziczenie z grupami i wewnątrz .gitlab-ci.yml [źródła]
Spróbujemy połączyć poprzednie 2 przykłady. Zmienne grup mają wyższy priorytet niż zmienne wewnątrz .gitlab-ci.yml.
Grupy z zmiennymi

.gitlab-ci.yml
image: busybox:latest
zmienne:
GIT_STRATEGY: none
MSG: "Niestandardowy w globalnym .gitlab-ci.yml"
echo:
etap: test
skrypt:
- echo $MSG
echo z zmienną:
etap: test
zmienne:
MSG: "Niestandardowy w zadaniu .gitlab-ci.yml"
skrypt:
- echo $MSGWynik potoku
- echo:
$ echo $MSG Y Zadanie zakończone powodzeniem - echo z zmiennymi:
$ echo $MSG Y Zadanie zakończone powodzeniem
Dziedziczenie z określonymi zmiennymi w ustawieniach projektu [źródła]
Zmienne w ustawieniach projektu ZAWSZE mają najwyższy priorytet! A zmienne zdefiniowane wewnątrz .gitlab-ci.yml nie mają żadnego znaczenia.
Grupy z zmiennymi
Zmienne grup mają niższy priorytet.

.gitlab-ci.yml
Skorzystamy z pliku z poprzedniego przykładu. Tutaj znów są zmienne zapisane wewnątrz .gitlab-ci.yml, ale zmienne w grupach i tak mają przed nimi priorytet.
image: busybox:latest
zmienne:
GIT_STRATEGY: none
MSG: "Niestandardowy w globalnym .gitlab-ci.yml"
echo:
etap: test
skrypt:
- echo $MSG
echo z zmienną:
etap: test
zmienne:
MSG: "Niestandardowy w zadaniu .gitlab-ci.yml"
skrypt:
- echo $MSGWynik potoku
- echo:
$ echo $MSG project-3 Zadanie zakończone powodzeniem - echo z zmiennymi:
$ echo $MSG project-3 Zadanie zakończone powodzeniem
Dziedziczenie z pustą wartością [źródła]
Pusta wartość to także wartość
Pusta wartość to nie Null
Grupy z zmiennymi

.gitlab-ci.yml
image: busybox:latest
zmienne:
GIT_STRATEGY: none
MSG: "Niestandardowy w globalnym .gitlab-ci.yml"
echo:
etap: test
skrypt:
- echo $MSG
echo z zmienną:
etap: test
zmienne:
MSG: "Niestandardowy w zadaniu .gitlab-ci.yml"
skrypt:
- echo $MSGWynik potoku
- echo:
$ echo $MSG Zadanie zakończone powodzeniem - echo z zmiennymi:
$ echo $MSG Zadanie zakończone powodzeniem
Dziedziczenie z inkluzją i grupami [źródła]
Spróbujemy w project-2 zainkludować project-3.
Grupy w tym przypadku mają priorytet.
Grupy z zmiennymi

.gitlab-ci.yml
I zdefiniujemy zmienną globalnie w .gitlab-ci.yml
zmienne:
MSG: "Z zainkludowanym .gitlab-ci.yml"
inkluduj:
- projekt: how-is-gitlab-ci-inherit-environment-variables/z/y/project-3
plik: '.gitlab-ci.yml'Wynik potoku
- echo:
$ echo $MSG B Zadanie zakończone powodzeniem - echo z zmiennymi:
$ echo $MSG B Zadanie zakończone powodzeniem
Dziedziczenie z inkluzją [źródła]
Spróbujemy w project-2 zainkludować project-3.
Pod warunkiem, że ani grupa, ani sam projekt nie mają żadnych zmiennych.
Grupy z zmiennymi

.gitlab-ci.yml
Taki sam jak w poprzednim przykładzie
zmienne:
MSG: "Z zainkludowanym .gitlab-ci.yml"
inkluduj:
- projekt: how-is-gitlab-ci-inherit-environment-variables/z/y/project-3
plik: '.gitlab-ci.yml'Wynik potoku
- echo:
$ echo $MSG Z include .gitlab-ci.yml Zadanie zakończone sukcesem - echo z zmiennymi:
$ echo $MSG Niestandardowy w zadaniu .gitlab-ci.yml Zadanie zakończone powodzeniem
Otrzymujemy następujące priorytety:
- Zmienne w ustawieniach projektu
- Zmienne w grupach
- Zmienne ściśle wskazane wewnątrz zadania (w tym także pliki załączone)
- Globalne zmienne wewnątrz .gitlab-ci.yml
- Globalne zmienne wewnątrz załączonych plików
Podsumowanie
Najbardziej nieoczywistym punktem jest to, że zasada „im bliżej zmienna kodu, tym jest ważniejsza” działa najpierw dla grup, a następnie taka sama zasada dla zmiennych wewnątrz .gitlab-ci.yml, ale tylko pod warunkiem, że zmienne w grupach nie są zadane.
Kolejnym ważnym punktem jest zrozumienie, że globalna przestrzeń dla podstawowego i załączonego .gitlab-ci.yml jest wspólna. A plik, do którego następuje dołączenie, ma pierwszeństwo.
Źródło: habr.com
