Le variabili in Gitlab possono essere impostate in diversi posti:
- Nelle impostazioni del gruppo
- Nelle impostazioni del progetto
- All'interno di .gitlab-ci.yml
In questo caso, le variabili nelle impostazioni del gruppo e del progetto possono essere impostate come "file" o "variabile normale" e selezionare le caselle di controllo "protetto" e "maschera".
Iniziamo con l'ereditarietà semplice e diventerà gradualmente più complessa.
L'elenco definitivo dei livelli di priorità si trova alla fine del documento.
Eredità con i gruppi [fonti]
Le variabili dei gruppi vengono ereditate, con la regola che più il gruppo è vicino al progetto, più importante è il suo valore.
Gruppi con variabili
.gitlab-ci.yml
image: busybox:latest
variables:
GIT_STRATEGY: none
echo:
stage: test
script:
- echo $MSG
Risultato della pipeline
$ echo $MSG
B
Se la variabile non fosse stata specificata nel gruppo B, avremmo visto il valore A.
Ereditare variabili all'interno di .gitlab-ci.yml [fonti]
Qui tutto è abbastanza semplice: puoi impostare una variabile a livello globale o sovrascriverla all'interno del lavoro.
Gruppi con variabili
.gitlab-ci.yml
Creiamo ora 2 job, in uno di essi indicheremo esplicitamente $MSG.
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
Risultato della pipeline
- eco:
$ echo $MSG Custom in global .gitlab-ci.yml Job succeeded
- echo con vars:
$ echo $MSG Custom in job .gitlab-ci.yml Job succeeded
Ereditarietà con gruppi e all'interno di .gitlab-ci.yml [fonti]
Proviamo a combinare i 2 esempi precedenti. Le variabili di gruppo hanno la precedenza sulle variabili all'interno di .gitlab-ci.yml.
Gruppi con variabili
.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
Risultato della pipeline
- eco:
$ echo $MSG Y Job succeeded
- echo con vars:
$ echo $MSG Y Job succeeded
Ereditarietà con la specifica delle variabili nelle impostazioni del progetto [fonti]
Le variabili nelle impostazioni del progetto hanno SEMPRE la massima priorità! E le variabili specificate all'interno di .gitlab-ci.yml non svolgono alcun ruolo.
Gruppi con variabili
Le variabili di gruppo hanno una priorità inferiore.
.gitlab-ci.yml
Usiamo il file dell'esempio precedente. Anche in questo caso ci sono variabili specificate all'interno di .gitlab-ci.yml, ma le variabili all'interno dei gruppi hanno comunque la precedenza su di esse.
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
Risultato della pipeline
- eco:
$ echo $MSG project-3 Job succeeded
- echo con vars:
$ echo $MSG project-3 Job succeeded
Eredità con valore vuoto [fonti]
Anche un valore vuoto è un valore
Un valore vuoto non è Null
Gruppi con variabili
.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
Risultato della pipeline
- eco:
$ echo $MSG Job succeeded
- echo con vars:
$ echo $MSG Job succeeded
Ereditarietà con include e gruppi [fonti]
Qui proveremo a includere il progetto-2 nel progetto-3
I gruppi in questo caso hanno la priorità.
Gruppi con variabili
.gitlab-ci.yml
E imposta la variabile globalmente in .gitlab-ci.yml
variables:
MSG: "With include .gitlab-ci.yml"
include:
- project: how-is-gitlab-ci-inherit-environment-variables/z/y/project-3
file: '.gitlab-ci.yml'
Risultato della pipeline
- eco:
$ echo $MSG B Job succeeded
- echo con vars:
$ echo $MSG B Job succeeded
Eredità con include [fonti]
Qui proveremo a includere il progetto-2 nel progetto-3.
Con la condizione che: né i gruppi né il progetto stesso hanno variabili.
Gruppi con variabili
.gitlab-ci.yml
Come nell'esempio precedente
variables:
MSG: "With include .gitlab-ci.yml"
include:
- project: how-is-gitlab-ci-inherit-environment-variables/z/y/project-3
file: '.gitlab-ci.yml'
Risultato della pipeline
- eco:
$ echo $MSG With include .gitlab-ci.yml Job succeeded
- echo con vars:
$ echo $MSG Custom in job .gitlab-ci.yml Job succeeded
I risultati sono i seguenti priorità:
- Variabili nelle impostazioni del progetto
- Variabili nei gruppi
- Variabili rigorosamente specificate all'interno dei lavori (inclusi i file inclusi)
- Variabili globali all'interno di .gitlab-ci.yml
- Variabili globali all'interno dei file inclusi
conclusione
Il punto meno ovvio è che la regola “più una variabile è vicina al codice, più è importante” funziona prima per i gruppi, e poi la stessa regola per le variabili all’interno di .gitlab-ci.yml, ma solo a condizione che le variabili nei gruppi non sono specificate.
Successivamente, un punto importante è capire che lo spazio globale per il file .gitlab-ci.yml principale e incluso è comune. E il file in cui avviene l'inclusione ha la priorità.
Fonte: habr.com