Le variabili in Gitlab possono essere impostate in diversi luoghi:
- 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 si possono attivare le opzioni "protetto" e "mascherare".

Iniziamo con l'ereditarietà semplice e poi ci complicheremo gradualmente.
L'elenco finale dei livelli di priorità è disponibile alla fine del documento.
Ereditarietà con i gruppi [sorgenti]
Le variabili dai gruppi sono ereditate, seguendo la regola che più un 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 $MSGRisultato della pipeline
$ echo $MSG
BSe la variabile non fosse stata specificata nel gruppo B, avremmo visto il valore A.
Ereditarietà delle variabili all'interno di .gitlab-ci.yml [sorgenti]
Qui è tutto piuttosto semplice: puoi definire una variabile globalmente, oppure sovrascriverla all'interno di un job.
Gruppi con variabili

.gitlab-ci.yml
Creiamo ora 2 job, in uno dei quali specificheremo chiaramente $MSG.
image: busybox:latest
variables:
GIT_STRATEGY: none
MSG: "Personalizzato in .gitlab-ci.yml globale"
echo:
stage: test
script:
- echo $MSG
echo con var:
stage: test
variables:
MSG: "Personalizzato in job .gitlab-ci.yml"
script:
- echo $MSGRisultato della pipeline
- echo:
$ echo $MSG Personalizzato in .gitlab-ci.yml globale Job completato con successo - echo con variabili:
$ echo $MSG Personalizzato in job .gitlab-ci.yml Job completato con successo
Ereditarietà con i gruppi e all'interno di .gitlab-ci.yml [sorgenti]
Proviamo a combinare i precedenti 2 esempi. Le variabili dei gruppi hanno priorità rispetto alle variabili all'interno di .gitlab-ci.yml.
Gruppi con variabili

.gitlab-ci.yml
image: busybox:latest
variables:
GIT_STRATEGY: none
MSG: "Personalizzato in .gitlab-ci.yml globale"
echo:
stage: test
script:
- echo $MSG
echo con var:
stage: test
variables:
MSG: "Personalizzato in job .gitlab-ci.yml"
script:
- echo $MSGRisultato della pipeline
- echo:
$ echo $MSG Y Job completato con successo - echo con variabili:
$ echo $MSG Y Job completato con successo
Ereditarietà specificando variabili nelle impostazioni del progetto [sorgenti]
Le variabili nelle impostazioni del progetto hanno SEMPRE la massima priorità! E le variabili definite all'interno di .gitlab-ci.yml non hanno alcun peso.
Gruppi con variabili
Le variabili dei gruppi hanno una priorità inferiore.

.gitlab-ci.yml
Utilizziamo il file dall'esempio precedente. Qui ci sono ancora variabili definite all'interno di .gitlab-ci.yml, ma le variabili all'interno dei gruppi hanno comunque priorità su di esse.
image: busybox:latest
variables:
GIT_STRATEGY: none
MSG: "Personalizzato in .gitlab-ci.yml globale"
echo:
stage: test
script:
- echo $MSG
echo con var:
stage: test
variables:
MSG: "Personalizzato in job .gitlab-ci.yml"
script:
- echo $MSGRisultato della pipeline
- echo:
$ echo $MSG project-3 Job completato con successo - echo con variabili:
$ echo $MSG project-3 Job completato con successo
Ereditarietà con valore vuoto [sorgenti]
Un valore vuoto è comunque un valore
Un valore vuoto non è Null
Gruppi con variabili

.gitlab-ci.yml
image: busybox:latest
variables:
GIT_STRATEGY: none
MSG: "Personalizzato in .gitlab-ci.yml globale"
echo:
stage: test
script:
- echo $MSG
echo con var:
stage: test
variables:
MSG: "Personalizzato in job .gitlab-ci.yml"
script:
- echo $MSGRisultato della pipeline
- echo:
$ echo $MSG Job completato con successo - echo con variabili:
$ echo $MSG Job completato con successo
Ereditarietà con inclusione e gruppi [sorgenti]
Qui proveremo a includere project-3 in project-2
I gruppi in questo caso hanno priorità.
Gruppi con variabili

.gitlab-ci.yml
E impostiamo una variabile globalmente in .gitlab-ci.yml
variables:
MSG: "Con inclusione in .gitlab-ci.yml"
include:
- project: how-is-gitlab-ci-inherit-environment-variables/z/y/project-3
file: '.gitlab-ci.yml'Risultato della pipeline
- echo:
$ echo $MSG B Job completato con successo - echo con variabili:
$ echo $MSG B Job completato con successo
Ereditarietà con inclusione [sorgenti]
Qui proveremo ad includere project-3 in project-2.
A condizione che: né i gruppi né il progetto stesso abbiano variabili.
Gruppi con variabili

.gitlab-ci.yml
Identico all'esempio precedente
variables:
MSG: "Con inclusione in .gitlab-ci.yml"
include:
- project: how-is-gitlab-ci-inherit-environment-variables/z/y/project-3
file: '.gitlab-ci.yml'Risultato della pipeline
- echo:
$ echo $MSG Con include .gitlab-ci.yml Job riuscito - echo con variabili:
$ echo $MSG Personalizzato in job .gitlab-ci.yml Job completato con successo
Risultano i seguenti priorità:
- Variabili nelle impostazioni del progetto
- Variabili nei gruppi
- Variabili specificamente indicate all'interno del job (compresi 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" si applica prima ai gruppi e poi la stessa regola vale anche per le variabili all'interno di .gitlab-ci.yml, ma solo a condizione che le variabili nei gruppi non siano definite.
Un altro punto importante è capire che lo spazio globale per il principale e per il .gitlab-ci.yml incluso è comune. E il file in cui avviene l'inclusione ha la priorità.
Fonte: habr.com
