Cartoon gears and neon rolling marbles rolling through a track

Crie fluxos de trabalho reutilizáveis no GitHub Actions

Bekah Whittle
Bekah Whittle // Director, Field Services // GitHub

Fluxos de trabalho reutilizáveis permitem que você adote o princípio DRY (Don't Repeat Yourself, não se repita), introduza padronização e implemente práticas recomendadas de maneira consistente. Eles facilitam as jornadas dos desenvolvedores, tornando os processos mais simplificados e eficientes, sem impor restrições indevidas. À medida que avançarmos, a Deutsche Vermögensberatung AG (DVAG) se juntará a nós para seus conselhos sobre como tirar o máximo proveito dos fluxos de trabalho reutilizáveis.


Neste guia, você aprenderá:

  • Os usos e benefícios dos fluxos de trabalho reutilizáveis

  • Os componentes essenciais e a sintaxe necessária para criar fluxos de trabalho reutilizáveis

  • A estrutura e a sintaxe do URL para invocar um fluxo de trabalho reutilizável (reusable workflow)

  • Como incorporar fluxo de trabalho reutilizável (reusable workflow) ​​em projetos armazenados em repositórios separados


O que são fluxos de trabalho reutilizáveis (reusable workflows) ​​e como funcionam?

Um fluxo de trabalho reutilizável (reusable workflow) é um arquivo do GitHub Actions que pode ser executado por outros fluxos de trabalho. Um único fluxo de trabalho pode chamar vários fluxos de trabalho reutilizáveis (reusable workflows), com cada referência ocupando apenas uma linha de YAML. Isso significa que o fluxo de trabalho “chamador” pode conter apenas algumas linhas de YAML, mas executar um grande número de tarefas, pois executa cada fluxo de trabalho “chamado” inteiramente, como se seus trabalhos e etapas fizessem parte dele. Além disso, os fluxos de trabalho podem ser aninhados em até quatro níveis.

Quais são os benefícios dos fluxos de trabalho reutilizáveis (reusable workflows)?

Os fluxos de trabalho reutilizáveis (reusable workflows) ​​oferecem vários benefícios:

  • Evitam redundância

  • Aceleram a criação de fluxo de trabalho por meio da reutilização

  • Reduzem a manutenção e melhoram a segurança oferecendo uma biblioteca de fluxos de trabalho reutilizáveis ​​que podem ser mantidos centralmente

  • Promovem o uso de fluxos de trabalho bem projetados, já testados e comprovadamente eficazes

Com esses benefícios em mente, e em combinação com grupos de executores (runner groups), as organizações podem criar caminhos pavimentados para os desenvolvedores que lhes permitam dedicar tempo ao trabalho em questão, em vez de gerenciar a infraestrutura ou recriar fluxos de trabalho existentes.

Centralizamos nossos fluxos de trabalho em um monorepo onde todas as alterações exigem a aprovação do proprietário do código para garantir uniformidade e qualidade ao longo do tempo, ao mesmo tempo em que possibilitamos propriedade especializada para determinados fluxos de trabalho. Usamos controle de versão semântico e evitamos mudanças drásticas ao seguir um esquema de versão 1.x.x. Geralmente lançamos novas versões de fluxo de trabalho semanalmente, usando a funcionalidade auto-merge para manter as atualizações fluindo e testando-as tanto no main branch quanto nos repositórios de teste. Também monitoramos ativamente o uso do fluxo de trabalho em todos os repositórios, para que possamos garantir que eles estejam sendo usados ​​de forma eficaz.

Florian Koch
Florian Koch // IT Platform Lead // Deutsche Vermögensberatung (DVAG)

Componentes de um fluxo de trabalho reutilizável (reusable workflow)

O evento acionador

Para que um fluxo de trabalho seja reutilizável, os valores de on devem incluir workflow_call:

on:
  workflow_call:

Definição de entrada

É possível definir entradas e segredos em um fluxo de trabalho reutilizável (reusable workflow) para recebê-los de um fluxo de trabalho do chamador. Use as palavras-chave inputs e secrets para este propósito. Para obter mais informações, consulte nosso guia sobre como proteger CI/CD com segredos e variáveis. Veja abaixo uma versão comentada de um exemplo de fluxo de trabalho reutilizável (reusable workflow):

on:  # Specifies the event triggering the workflow
  workflow_call:  # Indicates that this is a reusable workflow
    inputs:  # Defines the inputs that can be passed from the caller workflow
      config-path:  # Name of the input
        required: true  # Specifies that this input is mandatory
        type: string  # Specifies the type of the input
    secrets:  # Defines the secrets that can be passed from the caller workflow
      envPAT:  # Name of the secret
        required: true  # Specifies that this secret is mandatory

No exemplo acima, envPAT é um segredo de ambiente que foi adicionado ao ambiente de produção. Portanto, esse ambiente é referenciado dentro do trabalho.

Passagem de segredos nomeados

Para passar entradas nomeadas para um fluxo de trabalho chamado, use a palavra-chave with em um trabalho. Use a palavra-chave secrets para passar segredos nomeados. Para entradas, o tipo de dados do valor de entrada deve corresponder ao tipo especificado no fluxo de trabalho chamado (booleano, número ou string).

jobs:
  call-workflow-passing-data:
    uses: octo-org/example-repo/.github/workflows/reusable-workflow.yml@main
    with:
      config-path: .github/labeler.yml
    secrets:
      envPAT: ${{ secrets.envPAT }}

Os fluxos de trabalho que chamam fluxos de trabalho reutilizáveis (reusable workflows) ​​na mesma organização ou empresa podem usar a palavra-chave inherit para transmitir implicitamente os segredos.

jobs:
  call-workflow-passing-data:
    uses: octo-org/example-repo/.github/workflows/reusable-workflow.yml@main
    with:
      config-path: .github/labeler.yml
    secrets: inherit

Dependemos do Dependabot para distribuir automaticamente atualizações de nossos fluxos de trabalho reutilizáveis para equipes e projetos. Cada versão aciona de forma automática uma pull request nos repositórios do usuário, que acompanhamos rigorosamente em um problema dedicado. Assim sabemos quem atualizou ou não seus fluxos de trabalho e temos uma forma otimizada de garantir que todo mundo esteja informado, usando os fluxos de trabalho mais atuais e efetivos.

Florian Koch
Florian Koch // IT Platform Lead // Deutsche Vermögensberatung (DVAG)

Chamar GitHub Actions reutilizáveis

Você chama um fluxo de trabalho reutilizável (reusable workflow) usando a palavra-chave uses . Ao contrário de quando você usa o GitHub Actions em um fluxo de trabalho, você chama fluxos de trabalho reutilizáveis (reusable workflows) ​​diretamente em um trabalho e não nas etapas do trabalho. Vamos analisar a estrutura da URL para chamar um fluxo de trabalho reutilizável (reusable workflow). No exemplo acima, você verá a linha:

uses: octo-org/example-repo/.github/workflows/reusable-workflow.yml@main

Podemos ver que o código segue uma estrutura específica:

uses: [OWNER/REPOSITORY PATH]/[.github/workflows/WORKFLOW_FILE]@[REF]

Cada segmento desta estrutura tem uma finalidade específica:

1. uses:

Esta é uma palavra-chave na sintaxe do GitHub Actions que indica que a sequência a seguir fará referência a um trecho de código reutilizável, como uma Action ou, neste caso, um fluxo de trabalho reutilizável (reusable workflow).

2. OWNER:

Isso especifica o usuário ou organização do GitHub que possui o repositório onde o fluxo de trabalho reutilizável (reusable workflow) está localizado (ex: octo-org).

3. REPOSITORY PATH:

Este é o caminho para o repositório (ex: example-repo/).

4. .github/workflows/:

Este é um caminho convencional onde o Actions espera encontrar definições de fluxo de trabalho em um repositório. Todos os arquivos YAML do fluxo de trabalho devem estar localizados neste diretório para que sejam reconhecidos e executados pelo Actions.

5. WORKFLOW_FILE:

Isso especifica o arquivo YAML exato que contém a definição do fluxo de trabalho. (ex: reusable-workflow.yml).

6. @REF:

Isso indica o branch, tag ou commit SHA a partir do qual o fluxo de trabalho deve ser usado. É essencial especificar isso para que o Actions saiba qual versão do fluxo de trabalho usar. Isso será particularmente útil se os fluxos de trabalho evoluírem ao longo do tempo e você desejar garantir que uma versão específica seja usada em seu próprio fluxo de trabalho (ex: @main).

Como tornar um fluxo de trabalho reutilizável

Veja aqui um exemplo do fluxo de trabalho build-test-deploy.yml que criamos no módulo Fundamentos de automação. Abaixo, atualizamos o arquivo para aceitar a reutilização. Além de adicionar workflow_call, também definimos parâmetros que nos permitem configurar o node-version. Preste atenção aos comentários descritos no código:

name: build-test-deploy
# Changed 'on' to enable this workflow to be called from other workflows
on:
  workflow_call:
    # Introduced 'inputs' to define parameters that can be passed when calling this workflow
    inputs:
      node-version:
        description: "Node version"
        required: true
        type: string

jobs: 
  build:
    runs-on: ubuntu-latest

    steps: 
      - name: checkout repo
        uses: actions/checkout@v3
      # Modified to use the node-version from the workflow inputs
      - name: use node.js
        uses: actions/setup-node@v3
        with:
          node-version: ${{ inputs.node-version }}

      - run: npm install
      - run: npm run build

  test: 
    needs: build

    runs-on: ubuntu-latest

    steps: 
      - name: checkout repo
        uses: actions/checkout@v3
      # Modified to use the node-version from the workflow inputs
      - name: use node.js
        uses: actions/setup-node@v3
        with:
          node-version: ${{ inputs.node-version }}
          
      - run: npm install
      - run: npm run test

Agora que atualizamos o nosso fluxo de trabalho build-test-deploy para aceitar a reutilização e entendemos como chamar um fluxo de trabalho reutilizável, vamos juntar tudo. No código de exemplo abaixo, chamamos o fluxo de trabalho build-test-deploy de um fluxo de trabalho localizado em um repositório separado:

jobs:
  my-job:
    # Importing a reusable workflow from another repository and branch
    uses: organization/repo/.github/workflows/build-test-deploy.yml@main
    # Passing 'node-version' as an input parameter to the reusable workflow
    with:
      node-version: '18.x'

A seguir: Gerencie e monitore fluxos de trabalho no GitHub Actions

Pronto para otimizar a forma como você gerencia e monitora seus GitHub Actions? Confira nosso guia detalhado. Da análise do status do fluxo de trabalho ao monitoramento do uso de recursos, equiparemos você com as ferramentas necessárias para operar com mais eficiência.