Saídas (outputs) e dependências

Às vezes precisamos passar informações de uma etapa para outra e até de um job para outro. Para resolver esse problema, podemos utilizar as saídas (outputs).

É importante notar que os outputs são apenas strings e ficam armazenados em um arquivo de saída do workflow. O caminho deste arquivo está disponível através da variável GITHUB_OUTPUT e este arquivo é compartilhado por todas as etapas de um job.

Para definir uma saída de um job, basta usar o atributo outputs. Para acessar, utilizamos o steps.<nome da etapa>.outputs.<nome da saída> ou needs.<nome do job>.outputs.<nome da saída>.

name: Job com uma saída
# ...

jobs:
  job1:
    runs-on: ubuntu-latest
    outputs:
      olamundo: ${{ steps.etapa1.outputs.ola }}
    steps:
      - id: etapa1
        run: echo 'ola=mundo' >> $GITHUB_OUTPUT
  job2:
    runs-on: ubuntu-latest
    needs: job1
    steps:
      - env:
           SAIDA1: ${{ needs.job1.outputs.ola }}
        run: echo "Olá $SAIDA1"

Observe que na linha needs: job1 definimos que o job2 só será executado após uma execução bem sucedida do job1. Caso essa dependência não fosse definida, o job2 seria executado de forma paralela ao job1 e o comportamento do nosso workflow poderia não ser o desejado.

Perceba que na definição do output, utilizamos a keyword run para executar um comando dentro do runner. Para quem não é muito chegado no bash, utilizamos um print com o comando echo e redirecionamos a saída para o arquivo presente em $GITHUB_OUTPUT.

Alguns casos de uso

Gerar tag do projeto utilizando a versão do package.json

# ...
    steps:
    # ... Checkout e configuração de credenciais do git
      - name: Atualiza versão
        run: npm version minor
      - name: Versão do projeto
        id: version
        run: echo version=$(npm pkg get version | sed 's/"//g') >> $GITHUB_OUTPUT
      - name: Cria tag com a nova versão
        env:
          VERSION= ${{ steps.version.outputs.version }}
        run: |
          git tag -a "v$VERSION"
          git push --tags

Referências

  1. Documentação oficial: Definindo saídas para trabalhos