Variáveis no Gitlab podem ser definidas em vários locais:
- Nas configurações do grupo
- Nas configurações do projeto
- Dentro de .gitlab-ci.yml
Neste caso, as variáveis nas configurações do grupo e do projeto podem ser definidas como “arquivo” ou “variável regular” e marcar as caixas de seleção “protegido” e “máscara”.
Vamos começar com uma herança simples e gradualmente ela se tornará mais complexa.
A lista final de níveis de prioridade pode ser encontrada no final do documento.
Herança com grupos [fontes]
As variáveis dos grupos são herdadas, com a regra de que quanto mais próximo o grupo estiver do projeto, mais importante será o seu valor.
Grupos com variáveis
.gitlab-ci.yml
image: busybox:latest
variables:
GIT_STRATEGY: none
echo:
stage: test
script:
- echo $MSG
Resultado do pipeline
$ echo $MSG
B
Se a variável não tivesse sido especificada no grupo B, teríamos visto o valor A.
Herdando variáveis dentro de .gitlab-ci.yml [fontes]
Tudo é muito simples aqui: você pode definir uma variável globalmente ou sobrescrevê-la dentro do trabalho.
Grupos com variáveis
.gitlab-ci.yml
Vamos agora criar 2 jobs, em um deles indicaremos explicitamente $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
Resultado do pipeline
- eco:
$ echo $MSG Custom in global .gitlab-ci.yml Job succeeded
- ecoar com vars:
$ echo $MSG Custom in job .gitlab-ci.yml Job succeeded
Herança com grupos e dentro de .gitlab-ci.yml [fontes]
Vamos tentar combinar os 2 exemplos anteriores. Variáveis de grupo têm precedência sobre variáveis dentro de .gitlab-ci.yml.
Grupos com variáveis
.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
Resultado do pipeline
- eco:
$ echo $MSG Y Job succeeded
- ecoar com vars:
$ echo $MSG Y Job succeeded
Herança com especificação de variáveis nas configurações do projeto [fontes]
Variáveis nas configurações do projeto SEMPRE têm a maior prioridade! E as variáveis especificadas dentro de .gitlab-ci.yml não desempenham nenhuma função.
Grupos com variáveis
Variáveis de grupo têm prioridade mais baixa.
.gitlab-ci.yml
Vamos usar o arquivo do exemplo anterior. Aqui, novamente, existem variáveis especificadas dentro de .gitlab-ci.yml, mas variáveis dentro de grupos ainda têm precedência sobre elas.
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
Resultado do pipeline
- eco:
$ echo $MSG project-3 Job succeeded
- ecoar com vars:
$ echo $MSG project-3 Job succeeded
Herança com valor vazio [fontes]
Um valor vazio também é um valor
Um valor vazio não é nulo
Grupos com variáveis
.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
Resultado do pipeline
- eco:
$ echo $MSG Job succeeded
- ecoar com vars:
$ echo $MSG Job succeeded
Herança com inclusão e grupos [fontes]
Aqui tentaremos incluir o projeto-2 no projeto-3
Os grupos neste caso têm prioridade.
Grupos com variáveis
.gitlab-ci.yml
E defina a variável globalmente em .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'
Resultado do pipeline
- eco:
$ echo $MSG B Job succeeded
- ecoar com vars:
$ echo $MSG B Job succeeded
Herança com inclusão [fontes]
Aqui tentaremos incluir o projeto-2 no projeto-3.
Com a condição de que: nem os grupos nem o projeto em si possuem variáveis.
Grupos com variáveis
.gitlab-ci.yml
Igual ao exemplo anterior
variables:
MSG: "With include .gitlab-ci.yml"
include:
- project: how-is-gitlab-ci-inherit-environment-variables/z/y/project-3
file: '.gitlab-ci.yml'
Resultado do pipeline
- eco:
$ echo $MSG With include .gitlab-ci.yml Job succeeded
- ecoar com vars:
$ echo $MSG Custom in job .gitlab-ci.yml Job succeeded
Os resultados são os seguintes prioridades:
- Variáveis nas configurações do projeto
- Variáveis em grupos
- Variáveis estritamente especificadas dentro dos trabalhos (incluindo arquivos incluídos)
- Variáveis globais dentro de .gitlab-ci.yml
- Variáveis globais dentro de arquivos incluídos
Conclusão
O ponto menos óbvio é que a regra “quanto mais próxima uma variável está do código, mais importante ela é” funciona primeiro para grupos e depois a mesma regra para variáveis dentro de .gitlab-ci.yml, mas apenas sob a condição que as variáveis nos grupos não são especificadas.
A seguir, um ponto importante é entender que o espaço global para o .gitlab-ci.yml principal e incluído é comum. E o arquivo em que ocorre a inclusão tem prioridade.
Fonte: habr.com