Personalizar seu fluxo de trabalho com variáveis de ambiente

Concluído

Nesta unidade, você aprenderá a configurar e gerenciar comportamentos específicos do ambiente usando variáveis, contextos e scripts personalizados em fluxos de trabalho do GitHub Actions.

Para implementar esse processo, você aprenderá a:

  • Use variáveis de ambiente padrão e personalizadas.
  • Acesse informações contextuais em fluxos de trabalho.
  • Defina variáveis de ambiente em escopos de fluxo de trabalho diferentes.
  • Use scripts personalizados com a palavra-chave run.
  • Aplicar proteções de ambiente para implantações.

Variáveis de ambiente e contextos padrão

No fluxo de trabalho do GitHub Actions, várias variáveis de ambiente padrão estão disponíveis para uso, mas somente dentro do executor que está executando um trabalho. Essas variáveis padrão diferenciam maiúsculas e minúsculas e se referem aos valores de configuração do sistema e do usuário atual. Recomendamos que você use essas variáveis de ambiente padrão para fazer referência ao sistema de arquivos em vez de usar caminhos de arquivo embutidos em código. Para usar uma variável de ambiente padrão, especifique $ seguido pelo nome da variável de ambiente.

jobs:
  prod-check:
    steps:
      - run: echo "Deploying to production server on branch $GITHUB_REF"

Além das variáveis de ambiente padrão, você pode usar variáveis definidas como contextos. Contextos e variáveis padrão são semelhantes, pois ambos fornecem acesso a informações de ambiente, mas têm algumas diferenças importantes. Embora variáveis de ambiente padrão possam ser usadas somente dentro do executor, você pode usar variáveis de contexto a qualquer momento no fluxo de trabalho. Por exemplo, as variáveis de contexto permitem que você execute uma instrução if para avaliar uma expressão antes de executar o executor.

name: CI
on: push
jobs:
  prod-check:
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - run: echo "Deploying to production server on branch $GITHUB_REF"

Este exemplo está usando o contexto github.ref para verificar o branch que disparou o fluxo de trabalho. Se o branch for main, o executor será executado e imprimirá “Implantando no servidor de produção no branch $GITHUB_REF”. A variável de ambiente padrão $GITHUB_REF é usada no executor para se referir ao branch. Observe que as variáveis de ambiente padrão são todas maiúsculas, já as variáveis de contexto são todas minúsculas.

Informações contextuais disponíveis em um fluxo de trabalho

Use contextos para acessar informações sobre execuções de fluxo de trabalho, variáveis, ambientes de executor, trabalhos e etapas. Cada contexto é um objeto que contém propriedades que podem ser outros objetos ou cadeias de caracteres. Os contextos disponíveis incluem github, , env, vars, job, jobs, steps, runner, secrets, , strategy, matrix, , needse inputs.

A tabela a seguir lista contextos e descrições de fluxo de trabalho:

Contexto Descrição
github Informações sobre a execução do fluxo de trabalho. Para obter mais informações, veja Contexto github.
env Contém variáveis que você define em um fluxo de trabalho, trabalho ou etapa. Para obter mais informações, veja Contexto env.
vars Contém variáveis que você define no repositório, organização ou nível de ambiente. Para obter mais informações, veja Contexto vars.
job Informações sobre o trabalho em execução no momento. Para obter mais informações, veja Contexto job.
jobs Somente para fluxos de trabalho reutilizáveis, contém saídas de trabalhos do fluxo de trabalho reutilizável. Para obter mais informações, veja Contexto jobs.
steps Informações sobre as etapas executadas no trabalho atual. Para obter mais informações, veja Contexto steps.
runner Informações sobre o executor que está executando o trabalho atual. Para obter mais informações, veja Contexto runner.
secrets Contém os nomes e valores de segredos que estão disponíveis para uma execução de fluxo de trabalho. Para obter mais informações, veja Contexto secrets.
strategy Informações sobre a estratégia de execução da matriz para o trabalho atual. Para obter mais informações, veja Contexto strategy.
matrix Contém as propriedades da matriz definidas no fluxo de trabalho que se aplicam ao trabalho atual. Para obter mais informações, veja Contexto matrix.
needs Contém as saídas de todos os trabalhos definidos como uma dependência do trabalho atual. Para obter mais informações, veja Contexto needs.
inputs Contém as entradas de um fluxo de trabalho reutilizável ou disparado manualmente. Para obter mais informações, veja Contexto inputs.

Contextos diferentes estão disponíveis em momentos diferentes em uma execução de fluxo de trabalho. Por exemplo, você pode usar o secrets contexto apenas em locais específicos em uma tarefa. Além disso, você pode usar algumas funções, como a hashFiles função, somente em locais específicos.

A tabela a seguir lista as restrições para cada contexto e função especial em um fluxo de trabalho. Os contextos listados estão disponíveis apenas para a chave de fluxo de trabalho indicada. Você não pode usá-los em nenhum outro lugar. Você pode usar uma função em qualquer lugar, a menos que ela esteja listada na tabela a seguir.

Chave do fluxo de trabalho Contexto Funções especiais
run-name github, inputs, vars Nenhum
concurrency github, inputs, vars Nenhum
env github, secrets, , inputsvars Nenhum
jobs.<job_id>.concurrency github, needs, strategy, matrix, , inputsvars Nenhum
jobs.<job_id>.container github, needs, strategy, matrix, , varsinputs Nenhum
jobs.<job_id>.container.credentials github, needs, strategy, matrix, , env, vars, , secretsinputs Nenhum
jobs.<job_id>.container.env.<env_id> github, needs, strategy, matrix, job, , runner, env, , vars, secrets, inputs Nenhum
jobs.<job_id>.container.image github, needs, strategy, matrix, , varsinputs Nenhum
jobs.<job_id>.continue-on-error github, needs, strategy, vars, , matrixinputs Nenhum
jobs.<job_id>.defaults.run github, needs, strategy, matrix, , env, vars, inputs Nenhum
jobs.<job_id>.env github, needs, strategy, matrix, , vars, secrets, inputs Nenhum
jobs.<job_id>.environment github, needs, strategy, matrix, , varsinputs Nenhum
jobs.<job_id>.environment.url github, needs, strategy, matrix, job, , runner, env, , vars, steps, inputs Nenhum
jobs.<job_id>.if github, needs, , varsinputs always, canceled, , successfailure
jobs.<job_id>.name github, needs, strategy, matrix, , varsinputs Nenhum
jobs.<job_id>.outputs.<output_id> github, needs, strategy, matrix, job, , runner, , env, vars, secrets, , steps, inputs Nenhum
jobs.<job_id>.runs-on github, needs, strategy, matrix, , varsinputs Nenhum
jobs.<job_id>.secrets.<secrets_id> github, needs, strategy, matrix, , secrets, inputs, vars Nenhum
jobs.<job_id>.services github, needs, strategy, matrix, , varsinputs Nenhum
jobs.<job_id>.services.<service_id>.credentials github, needs, strategy, matrix, , env, vars, , secretsinputs Nenhum
jobs.<job_id>.services.<service_id>.env.<env_id> github, needs, strategy, matrix, job, , runner, env, , vars, secrets, inputs Nenhum
jobs.<job_id>.steps.continue-on-error github, needs, strategy, matrix, job, , runner, , env, vars, secrets, , steps, inputs hashFiles
jobs.<job_id>.steps.env github, needs, strategy, matrix, job, , runner, , env, vars, secrets, , steps, inputs hashFiles
jobs.<job_id>.steps.if github, needs, strategy, matrix, job, , runner, env, , vars, steps, inputs always, canceled, success, failure, hashFiles
jobs.<job_id>.steps.name github, needs, strategy, matrix, job, , runner, , env, vars, secrets, , steps, inputs hashFiles
jobs.<job_id>.steps.run github, needs, strategy, matrix, job, , runner, , env, vars, secrets, , steps, inputs hashFiles
jobs.<job_id>.steps.timeout-minutes github, needs, strategy, matrix, job, , runner, , env, vars, secrets, , steps, inputs hashFiles
jobs.<job_id>.steps.with github, needs, strategy, matrix, job, runner, env, vars, secrets, steps, inputs hashFiles
jobs.<job_id>.steps.working-directory github, needs, strategy, matrix, job, runner, env, vars, secrets, steps, inputs hashFiles
jobs.<job_id>.strategy github, necessidades, vars, inputs, Nenhum
jobs.<job_id>.timeout-minutes github, needs, strategy, matrix, , varsinputs Nenhum
jobs.<job_id>.with.<with_id> github, needs, strategy, matrix, , inputsvars Nenhum
on.workflow_call.inputs.<inputs_id>.default github, inputs, vars Nenhum
on.workflow_call.outputs.<output_id>.value github, trabalhos, vars, inputs Nenhum

Variáveis de ambiente personalizadas

Semelhante ao uso de variáveis de ambiente padrão, você pode usar variáveis de ambiente personalizadas em seu arquivo de fluxo de trabalho. Para criar uma variável personalizada, você precisa defini-la no arquivo de fluxo de trabalho usando o contexto env. Se você quiser usar o valor de uma variável de ambiente dentro de um executor, use o método normal do sistema operacional do executor para ler as variáveis de ambiente.

name: CI
on: push
jobs:
  prod-check:
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - run: echo "Nice work, $First_Name. Deploying to production server on branch $GITHUB_REF"
        env:
          First_Name: Mona

Definir variáveis de ambiente personalizadas em um fluxo de trabalho

Você pode definir variáveis de ambiente com escopo para todo o fluxo de trabalho usando env no nível superior do arquivo de fluxo de trabalho. Delimite o conteúdo de uma tarefa em um fluxo de trabalho usando jobs.<job_id>.env. Você pode definir o escopo de uma variável de ambiente em uma etapa específica dentro de um trabalho usando jobs.<job_id>.steps[*].env.

Aqui está um exemplo que mostra todos os três cenários em um arquivo de fluxo de trabalho:

name: Greeting on variable day

on:
  workflow_dispatch

env:
  DAY_OF_WEEK: Monday

jobs:
  greeting_job:
    runs-on: ubuntu-latest
    env:
      Greeting: Hello
    steps:
      - name: "Say Hello Mona it's Monday"
        run: echo "$Greeting $First_Name. Today is $DAY_OF_WEEK!"
        env:
          First_Name: Mona

Usar um contexto padrão em um fluxo de trabalho

A plataforma GitHub define variáveis de ambiente padrão. Eles não são definidos em um fluxo de trabalho, mas você pode usar uma variável de ambiente padrão em um fluxo de trabalho no contexto apropriado. A maioria dessas variáveis, exceto CI, começam com GITHUB_* ou RUNNER_*. Os dois últimos tipos não podem ser substituídos. Além disso, essas variáveis padrão têm uma propriedade de contexto correspondente e de nome semelhante. Por exemplo, a RUNNER_* série de variáveis padrão tem uma propriedade de contexto correspondente de runner.*.

Aqui está um exemplo de como acessar variáveis padrão em um fluxo de trabalho aplicando estes métodos:

on: workflow_dispatch

jobs:
  if-Windows-else:
    runs-on: macos-latest
    steps:
      - name: condition 1
        if: runner.os == 'Windows'
        run: echo "The operating system on the runner is $env:RUNNER_OS."
      - name: condition 2
        if: runner.os != 'Windows'
        run: echo "The operating system on the runner is not Windows, it's $RUNNER_OS."

Para obter mais informações, veja Variáveis de ambiente padrão.

Passar variáveis de ambiente personalizadas para um fluxo de trabalho

Você pode transmitir variáveis de ambiente personalizadas de uma etapa de um trabalho de fluxo de trabalho para as etapas seguintes no trabalho. Gere um valor em uma etapa de um trabalho e atribua o valor a uma variável de ambiente existente ou nova. Em seguida, você escreve o par variável/valor no arquivo de ambiente GITHUB_ENV. Use o arquivo de ambiente em uma ação ou em um comando de shell no trabalho de fluxo de trabalho usando a palavra-chave run.

A etapa que cria ou atualiza a variável de ambiente não tem acesso ao novo valor, mas todas as etapas subsequentes em um trabalho têm acesso.

Veja um exemplo:

steps:
  - name: Set the value
    id: step_one
    run: |
      echo "action_state=yellow" >> "$GITHUB_ENV"
  - name: Use the value
    id: step_two
    run: |
      printf '%s\n' "$action_state" # This will output 'yellow'

Adicionar proteções de ambiente

Você pode adicionar regras de proteção para ambientes definidos para seu repositório GitHub.

Para adicionar um ambiente, no seu repositório:

  1. Selecione Configurações.

    Barra de menus de uma interface da Web com guias como Código, Problemas e Wiki. As Configurações estão realçadas.

  2. No painel esquerdo, selecione Ambiente.

    Captura de tela de um menu Configurações em Geral com seções para Access, Code e automação, Segurança e Integrações. A opção Ambientes está realçada.

  3. Selecione o botão Novo ambiente para adicionar e configurar um ambiente e adicionar proteções.

    Captura de tela da página Configurações do repositório GitHub mostrando a seção Ambientes com uma mensagem indicando que não existem ambientes e um botão Novo ambiente realçado.

Sobre os ambientes

Use ambientes para descrever um destino de implantação geral, como produção, preparo ou desenvolvimento. Quando um fluxo de trabalho do GitHub Actions é implantado em um ambiente, o ambiente aparece na página principal do repositório. Você pode usar ambientes para exigir aprovação para que um trabalho prossiga, restringir quais branches podem iniciar um fluxo de trabalho, bloquear implantações usando regras de proteção de implantação personalizadas ou limitar o acesso a segredos.

Cada trabalho em um fluxo de trabalho pode referenciar um ambiente. Todas as regras de proteção definidas para o ambiente devem ser atendidas antes que um trabalho que referencie o ambiente seja enviado a um executor. O trabalho pode acessar os segredos do ambiente somente depois que o trabalho é enviado para um executor.

Quando um fluxo de trabalho faz referência a um ambiente, o ambiente aparece nas implantações do repositório.

Regras de proteção do ambiente

As regras de proteção da implantação do ambiente exigem o cumprimento de condições específicas para que um trabalho que referencia o ambiente prossiga. Você pode usar regras de proteção de implantação para exigir uma aprovação manual, atrasar uma tarefa ou restringir o ambiente a ramos específicos. Você também pode criar e implementar regras de proteção personalizadas alimentadas pelos Aplicativos do GitHub para usar sistemas de parceiros para controlar implantações que fazem referência a ambientes configurados no GitHub.

Aqui está uma explicação dessas regras de proteção:

  • Regras de proteção de revisores necessárias. Use essa regra para exigir que uma pessoa ou equipe específica aprove trabalhos de fluxo de trabalho que fazem referência ao ambiente. Você pode listar até seis usuários ou equipes como revisores. Os revisores devem ter pelo menos permissões de leitura para o repositório. Apenas um revisor necessário deve aprovar o trabalho para que ele prossiga.

    Você também pode impedir autoavaliações para implantações em um ambiente protegido. Se você habilitar essa configuração, os usuários que iniciam uma implantação não poderão aprovar o trabalho de implantação, mesmo que sejam um revisor necessário. Ao permitir revisões coletivas, garante-se que mais de uma pessoa revise as implantações em ambientes protegidos.

    Para obter mais informações sobre como examinar trabalhos que fazem referência a um ambiente com revisores necessários, consulte Implantações de Revisão.

  • Regras de projeção do temporizador de espera. Você pode usar uma regra de proteção de temporizador de espera para atrasar um trabalho por um período específico após o trabalho ser disparado inicialmente antes que a implantação do ambiente continue. O tempo (em minutos) deve ser um inteiro entre 1 e 43.200 (30 dias). O tempo de espera não conta para o seu tempo faturável.

  • Regras de proteção de branch e tag. Você pode usar regras de proteção de branch e tag de implantação para restringir quais branches e tags são usados para implantação no ambiente. Você tem várias opções para regras de proteção de marca e branch de implantação para um ambiente.

    • Nenhuma restrição estabelece nenhuma limitação sobre qual ramificação ou tag pode ser implantada no ambiente.
    • Apenas branches protegidos permitem somente branches com regras de proteção habilitadas para implantação no ambiente. Se nenhuma regra de proteção de branch for definida para qualquer branch no repositório, todos os branches poderão ser implantados. A configuração de branches e tags selecionadas garante que somente branches e tags que correspondam aos padrões de nome que você especificou possam ser implantados no ambiente.
    • Se você especificar releases/* como uma regra de branch de tag de implantação, somente um branch ou uma tag com um nome que começa com releases/ pode ser implantado no ambiente. (Caracteres curinga não corresponderão a /. Para fazer a correspondência de branches ou tags que começam com release/ e que contêm outra barra "/" única, use release/*/*.) Se você adicionar main como uma regra de branch, um branch chamado main também poderá ser implantado no ambiente.
  • Regras de proteção de implantação personalizadas. Você pode criar regras de proteção personalizadas para bloquear implantações para usar serviços de parceiro. Por exemplo, você pode usar sistemas de observabilidade, sistemas de gerenciamento de alterações, sistemas de qualidade de código ou outras configurações manuais que você usa para avaliar a preparação e fornecer aprovações automatizadas para implantações no GitHub.

    Depois de criar regras de proteção de implantação personalizadas e instalá-las em um repositório, você poderá habilitar a regra de proteção de implantação personalizada para qualquer ambiente no repositório.

    Captura de tela que mostra a página Configurações para configurar o Environment1 com opções para revisores, temporizador de espera, regras personalizadas e restrições de branch.

Observação

Se você tiver um plano GitHub Free, GitHub Pro ou GitHub Team, as regras de projeção de implantação de ambiente só estarão disponíveis para repositórios públicos, exceto pelas regras de proteção de ramificação e de tag. Para usuários com planos GitHub Pro ou GitHub Team, as regras de proteção de branch e tag também estão disponíveis para repositórios privados.

Scripts no seu fluxo de trabalho

Nos exemplos de snippets de fluxo de trabalho anteriores, a palavra-chave run é usada para imprimir uma cadeia de caracteres de texto. Como a palavra-chave run instrui o trabalho a executar um comando no executor, você usa a palavra-chave run para executar ações ou scripts.

jobs:
  example-job:
    steps:
      - run: npm install -g bats

Neste exemplo, você usa o npm para instalar o bats pacote de teste de software usando a run palavra-chave. Você também pode executar um script como uma ação. Você pode armazenar o script em seu repositório, geralmente feito em um diretório .github/scripts/ e, em seguida, fornecer o caminho e o tipo de shell usando a palavra-chave run.

jobs:
  example-job:
    steps:
      - name: Run build script
        run: ./.github/scripts/build.sh
        shell: bash