Variablen in GitLab können an mehreren Stellen festgelegt werden:
- In den Gruppeneinstellungen
- In den Projekteinstellungen
- Innerhalb von .gitlab-ci.yml
Dabei können Variablen in den Gruppeneinstellungen und Projekteinstellungen als „Datei“ oder „einfache Variable“ festgelegt werden, und die Optionen „geschützt“ und „maskieren“ können aktiviert werden.

Lassen Sie uns mit einfacher Vererbung beginnen und diese schrittweise komplizierter machen.
Eine endgültige Liste der Prioritätsstufen finden Sie am Ende des Dokuments.
Vererbung mit Gruppen [исходники]
Variablen aus Gruppen werden vererbt, wobei die Regel gilt, dass je näher die Gruppe am Projekt ist, desto wichtiger ist ihr Wert.
Gruppen mit Variablen

.gitlab-ci.yml
image: busybox:latest
variables:
GIT_STRATEGY: none
echo:
stage: test
script:
- echo $MSGDas Ergebnis des Pipelines
$ echo $MSG
BWenn die Variable in Gruppe B nicht angegeben wäre, würden wir den Wert A sehen.
Vererbung von Variablen innerhalb von .gitlab-ci.yml [исходники]
Hier ist alles recht einfach: Man kann eine Variable global festlegen oder sie innerhalb eines Jobs überschreiben.
Gruppen mit Variablen

.gitlab-ci.yml
Erstellen wir jetzt 2 Jobs, wobei wir in einem von ihnen $MSG explizit angeben.
image: busybox:latest
variables:
GIT_STRATEGY: none
MSG: "Benutzerdefiniert in global .gitlab-ci.yml"
echo:
stage: test
script:
- echo $MSG
echo mit Var:
stage: test
variables:
MSG: "Benutzerdefiniert im Job .gitlab-ci.yml"
script:
- echo $MSGDas Ergebnis des Pipelines
- echo:
$ echo $MSG Benutzerdefiniert in globaler .gitlab-ci.yml Job erfolgreich - echo mit Variablen:
$ echo $MSG Benutzerdefiniert in der Job .gitlab-ci.yml Job erfolgreich
Vererbung mit Gruppen und innerhalb der .gitlab-ci.yml [исходники]
Lassen Sie uns die vorherigen 2 Beispiele kombinieren. Gruppenvariablen haben Vorrang vor Variablen innerhalb der .gitlab-ci.yml.
Gruppen mit Variablen

.gitlab-ci.yml
image: busybox:latest
variables:
GIT_STRATEGY: none
MSG: "Benutzerdefiniert in global .gitlab-ci.yml"
echo:
stage: test
script:
- echo $MSG
echo mit Var:
stage: test
variables:
MSG: "Benutzerdefiniert im Job .gitlab-ci.yml"
script:
- echo $MSGDas Ergebnis des Pipelines
- echo:
$ echo $MSG Y Job erfolgreich - echo mit Variablen:
$ echo $MSG Y Job erfolgreich
Vererbung mit Variablen in den Projekteinstellungen [исходники]
Variablen in den Projekteinstellungen haben IMMER die höchste Priorität! Die in der .gitlab-ci.yml angegebenen Variablen spielen keine Rolle.
Gruppen mit Variablen
Gruppenvariablen haben eine geringere Priorität.

.gitlab-ci.yml
Wir verwenden die Datei aus dem vorherigen Beispiel. Hier gibt es wieder Variablen, die innerhalb der .gitlab-ci.yml angegeben sind, aber die Variablen innerhalb der Gruppen haben trotzdem Vorrang.
image: busybox:latest
variables:
GIT_STRATEGY: none
MSG: "Benutzerdefiniert in global .gitlab-ci.yml"
echo:
stage: test
script:
- echo $MSG
echo mit Var:
stage: test
variables:
MSG: "Benutzerdefiniert im Job .gitlab-ci.yml"
script:
- echo $MSGDas Ergebnis des Pipelines
- echo:
$ echo $MSG project-3 Job erfolgreich - echo mit Variablen:
$ echo $MSG project-3 Job erfolgreich
Vererbung mit leerem Wert [исходники]
Ein leerer Wert ist ebenfalls ein Wert
Ein leerer Wert ist nicht Null
Gruppen mit Variablen

.gitlab-ci.yml
image: busybox:latest
variables:
GIT_STRATEGY: none
MSG: "Benutzerdefiniert in global .gitlab-ci.yml"
echo:
stage: test
script:
- echo $MSG
echo mit Var:
stage: test
variables:
MSG: "Benutzerdefiniert im Job .gitlab-ci.yml"
script:
- echo $MSGDas Ergebnis des Pipelines
- echo:
$ echo $MSG Job erfolgreich - echo mit Variablen:
$ echo $MSG Job erfolgreich
Vererbung mit Include und Gruppen [исходники]
Hier versuchen wir, in project-2 project-3 einzufügen
In diesem Fall haben Gruppen Vorrang.
Gruppen mit Variablen

.gitlab-ci.yml
Und wir setzen eine Variable global in der .gitlab-ci.yml
variables:
MSG: "Mit Include .gitlab-ci.yml"
include:
- project: how-is-gitlab-ci-inherit-environment-variables/z/y/project-3
file: '.gitlab-ci.yml'Das Ergebnis des Pipelines
- echo:
$ echo $MSG B Job erfolgreich - echo mit Variablen:
$ echo $MSG B Job erfolgreich
Vererbung mit Include [исходники]
Hier versuchen wir, in project-2 project-3 einzufügen.
Unter der Bedingung, dass weder die Gruppen noch das Projekt irgendwelche Variablen haben.
Gruppen mit Variablen

.gitlab-ci.yml
Wie im vorherigen Beispiel.
variables:
MSG: "Mit Include .gitlab-ci.yml"
include:
- project: how-is-gitlab-ci-inherit-environment-variables/z/y/project-3
file: '.gitlab-ci.yml'Das Ergebnis des Pipelines
- echo:
$ echo $MSG Mit include .gitlab-ci.yml Job erfolgreich - echo mit Variablen:
$ echo $MSG Benutzerdefiniert in der Job .gitlab-ci.yml Job erfolgreich
Das ergibt folgende Prioritäten:
- Variablen in den Projekteinstellungen
- Variablen in Gruppen
- Variablen, die strikt innerhalb des Jobs angegeben sind (einschließlich der eingefügten Dateien)
- Globale Variablen innerhalb der .gitlab-ci.yml
- Globale Variablen innerhalb der eingefügten Dateien
Fazit
Ein weniger offensichtlicher Punkt ist, dass die Regel 'Je näher die Variable am Code, desto wichtiger ist sie' zuerst für Gruppen funktioniert, und danach gilt dasselbe Prinzip für die Variablen innerhalb der .gitlab-ci.yml, jedoch nur unter der Bedingung, dass die Variablen in den Gruppen nicht festgelegt sind.
Ein weiterer wichtiger Punkt ist das Verständnis, dass der globale Raum für die Haupt- und die eingebettete .gitlab-ci.yml gemeinsam ist. Und die Datei, in die das Include erfolgt, hat Vorrang.
Quelle: habr.com
