Wie erbt Gitlab-CI Umgebungsvariablen?

Variablen in Gitlab können an mehreren Stellen gesetzt werden:

  1. In Gruppeneinstellungen
  2. In den Projekteinstellungen
  3. Innerhalb von .gitlab-ci.yml

In diesem Fall können Variablen in den Gruppen- und Projekteinstellungen als „Datei“ oder „reguläre Variable“ festgelegt werden und die Kontrollkästchen „geschützt“ und „Maske“ aktiviert werden.

Wie erbt Gitlab-CI Umgebungsvariablen?

Beginnen wir mit der einfachen Vererbung und sie wird nach und nach komplexer.

Die endgültige Liste der Prioritätsstufen finden Sie am Ende des Dokuments.

Vererbung mit Gruppen [Quellen]

Variablen von Gruppen werden vererbt, wobei die Regel gilt, dass ihr Wert umso wichtiger ist, je näher die Gruppe am Projekt liegt.

Gruppen mit Variablen

Wie erbt Gitlab-CI Umgebungsvariablen?

.gitlab-ci.yml

image: busybox:latest
variables:
  GIT_STRATEGY: none

echo:
  stage: test
  script:
    - echo $MSG

Pipeline-Ergebnis

$ echo $MSG
B

Wenn die Variable nicht in Gruppe B angegeben worden wäre, hätten wir den Wert A gesehen.

Erben von Variablen in .gitlab-ci.yml [Quellen]

Hier ist alles ganz einfach: Sie können eine Variable global setzen oder sie innerhalb des Jobs überschreiben.

Gruppen mit Variablen

Wie erbt Gitlab-CI Umgebungsvariablen?

.gitlab-ci.yml

Lassen Sie uns nun zwei Jobs erstellen. In einem davon geben wir explizit $MSG an.

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

Pipeline-Ergebnis

  • Echo:
    $ echo $MSG
    Custom in global .gitlab-ci.yml
    Job succeeded
  • Echo mit Vars:
    $ echo $MSG
    Custom in job .gitlab-ci.yml
    Job succeeded

Vererbung mit Gruppen und innerhalb von .gitlab-ci.yml [Quellen]

Versuchen wir, die beiden vorherigen Beispiele zu kombinieren. Gruppenvariablen haben Vorrang vor Variablen in .gitlab-ci.yml.

Gruppen mit Variablen

Wie erbt Gitlab-CI Umgebungsvariablen?

.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

Pipeline-Ergebnis

  • Echo:
    $ echo $MSG
    Y
    Job succeeded
  • Echo mit Vars:
    $ echo $MSG
    Y
    Job succeeded

Vererbung mit Angabe von Variablen in den Projekteinstellungen [Quellen]

Variablen in Projekteinstellungen haben IMMER die höchste Priorität! Und die in .gitlab-ci.yml angegebenen Variablen spielen keine Rolle.

Gruppen mit Variablen

Gruppenvariablen haben eine niedrigere Priorität.
Wie erbt Gitlab-CI Umgebungsvariablen?

.gitlab-ci.yml

Verwenden wir die Datei aus dem vorherigen Beispiel. Auch hier sind Variablen in .gitlab-ci.yml angegeben, aber Variablen innerhalb von Gruppen haben immer noch Vorrang vor ihnen.

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

Pipeline-Ergebnis

  • Echo:
    $ echo $MSG
    project-3
    Job succeeded
  • Echo mit Vars:
    $ echo $MSG
    project-3
    Job succeeded

Vererbung mit leerem Wert [Quellen]

Auch ein leerer Wert ist ein Wert
Ein leerer Wert ist nicht Null

Gruppen mit Variablen

Wie erbt Gitlab-CI Umgebungsvariablen?

.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

Pipeline-Ergebnis

  • Echo:
    $ echo $MSG
    Job succeeded
  • Echo mit Vars:
    $ echo $MSG
    Job succeeded

Vererbung mit Include und Gruppen [Quellen]

Hier werden wir versuchen, Projekt-2 in Projekt-3 einzubinden
Gruppen haben in diesem Fall Vorrang.

Gruppen mit Variablen

Wie erbt Gitlab-CI Umgebungsvariablen?

.gitlab-ci.yml

Und legen Sie die Variable global in .gitlab-ci.yml fest

variables:
 MSG: "With  include  .gitlab-ci.yml"
include:
 - project: how-is-gitlab-ci-inherit-environment-variables/z/y/project-3
   file: '.gitlab-ci.yml'

Pipeline-Ergebnis

  • Echo:
    $ echo $MSG
    B
    Job succeeded
  • Echo mit Vars:
    $ echo $MSG
    B
    Job succeeded

Vererbung mit include [Quellen]

Hier werden wir versuchen, Projekt-2 in Projekt-3 einzubinden.
Mit der Bedingung, dass weder die Gruppen noch das Projekt selbst Variablen haben.

Gruppen mit Variablen

Wie erbt Gitlab-CI Umgebungsvariablen?

.gitlab-ci.yml

Das Gleiche wie im vorherigen Beispiel

variables:
 MSG: "With  include  .gitlab-ci.yml"
include:
 - project: how-is-gitlab-ci-inherit-environment-variables/z/y/project-3
   file: '.gitlab-ci.yml'

Pipeline-Ergebnis

  • Echo:
    $ echo $MSG
    With include .gitlab-ci.yml
    Job succeeded
  • Echo mit Vars:
    $ echo $MSG
    Custom in job .gitlab-ci.yml
    Job succeeded

Die Ergebnisse sind wie folgt Prioritäten:

  1. Variablen in Projekteinstellungen
  2. Variablen in Gruppen
  3. Innerhalb von Jobs streng spezifizierte Variablen (einschließlich enthaltener Dateien)
  4. Globale Variablen in .gitlab-ci.yml
  5. Globale Variablen in eingebundenen Dateien

Abschluss

Der nicht offensichtlichste Punkt ist, dass die Regel „Je näher eine Variable am Code liegt, desto wichtiger ist sie“ zuerst für Gruppen und dann dieselbe Regel für Variablen in .gitlab-ci.yml gilt, jedoch nur unter der Bedingung dass die Variablen in den Gruppen nicht angegeben sind.
Als nächstes ist es wichtig zu verstehen, dass der globale Speicherplatz für die Hauptdatei und die enthaltene Datei .gitlab-ci.yml gemeinsam ist. Und die Datei, in der die Aufnahme erfolgt, hat Vorrang.

Source: habr.com

Kommentar hinzufügen