Como o Gitlab-CI herda variáveis ​​de ambiente?

Variáveis ​​​​no Gitlab podem ser definidas em vários locais:

  1. Nas configurações do grupo
  2. Nas configurações do projeto
  3. 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”.

Como o Gitlab-CI herda variáveis ​​de ambiente?

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

Como o Gitlab-CI herda variáveis ​​de ambiente?

.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

Como o Gitlab-CI herda variáveis ​​de ambiente?

.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

Como o Gitlab-CI herda variáveis ​​de ambiente?

.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.
Como o Gitlab-CI herda variáveis ​​de ambiente?

.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

Como o Gitlab-CI herda variáveis ​​de ambiente?

.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

Como o Gitlab-CI herda variáveis ​​de ambiente?

.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

Como o Gitlab-CI herda variáveis ​​de ambiente?

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

  1. Variáveis ​​nas configurações do projeto
  2. Variáveis ​​em grupos
  3. Variáveis ​​estritamente especificadas dentro dos trabalhos (incluindo arquivos incluídos)
  4. Variáveis ​​globais dentro de .gitlab-ci.yml
  5. 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

Adicionar um comentário