Wie übernimmt Gitlab-CI Umgebungsvariablen?

Variablen in GitLab können an mehreren Stellen festgelegt werden:

  1. In den Gruppeneinstellungen
  2. In den Projekteinstellungen
  3. 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.

Wie übernimmt Gitlab-CI Umgebungsvariablen?

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

Wie übernimmt Gitlab-CI Umgebungsvariablen?

.gitlab-ci.yml

image: busybox:latest
variables:
  GIT_STRATEGY: none

echo:
  stage: test
  script:
    - echo $MSG

Das Ergebnis des Pipelines

$ echo $MSG
B

Wenn 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

Wie übernimmt Gitlab-CI Umgebungsvariablen?

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

Das 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

Wie übernimmt Gitlab-CI Umgebungsvariablen?

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

Das 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.
Wie übernimmt Gitlab-CI Umgebungsvariablen?

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

Das 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

Wie übernimmt Gitlab-CI Umgebungsvariablen?

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

Das 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

Wie übernimmt Gitlab-CI Umgebungsvariablen?

.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

Wie übernimmt Gitlab-CI Umgebungsvariablen?

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

  1. Variablen in den Projekteinstellungen
  2. Variablen in Gruppen
  3. Variablen, die strikt innerhalb des Jobs angegeben sind (einschließlich der eingefügten Dateien)
  4. Globale Variablen innerhalb der .gitlab-ci.yml
  5. 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

Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server 🔥 Kaufen Sie zuverlässiges Hosting für Websites mit DDoS-Schutz, VPS VDS-Server | ProHoster