Jak Gitlab-CI dziedziczy zmienne środowiskowe?

Zmienne w Gitlab można zdefiniować w kilku miejscach:

  1. W ustawieniach grup
  2. W ustawieniach projektu
  3. 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ć”.

Jak Gitlab-CI dziedziczy zmienne środowiskowe?

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

Jak Gitlab-CI dziedziczy zmienne środowiskowe?

.gitlab-ci.yml

image: busybox:latest
zmienne:
  GIT_STRATEGY: none

echo:
  etap: test
  skrypt:
    - echo $MSG

Wynik potoku

$ echo $MSG
B

Gdyby 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

Jak Gitlab-CI dziedziczy zmienne środowiskowe?

.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 $MSG

Wynik 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

Jak Gitlab-CI dziedziczy zmienne środowiskowe?

.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 $MSG

Wynik 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.
Jak Gitlab-CI dziedziczy zmienne środowiskowe?

.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 $MSG

Wynik 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

Jak Gitlab-CI dziedziczy zmienne środowiskowe?

.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 $MSG

Wynik 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

Jak Gitlab-CI dziedziczy zmienne środowiskowe?

.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

Jak Gitlab-CI dziedziczy zmienne środowiskowe?

.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:

  1. Zmienne w ustawieniach projektu
  2. Zmienne w grupach
  3. Zmienne ściśle wskazane wewnątrz zadania (w tym także pliki załączone)
  4. Globalne zmienne wewnątrz .gitlab-ci.yml
  5. 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

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster