Workflows no Github Actions: como manipular outputs

Neste artigo você vai ver:

Neste artigo vamos nos aprofundar em como usar variáveis de outputs com workflows no Github Actions seguindo a nova sintaxe, explicando como criar e manipular outputs.

O GitHub trouxe recentemente no seu blog, um post avisando que  a sintaxe de uso de output tinha mudado, e que a nomenclatura antiga seria depreciada no dia 31 de Maio de 2023.

Vamos começar com o que são outputs. Em seguida, vamos ver como podem ser úteis dentro dos nossos workflows no Github Actions já com a nomenclatura atual.

Mas o que são outputs?

Outputs são variáveis criadas e manipuladas em tempo de execução de um workflow. Esses parâmetros são determinados de acordo com o contexto do job onde são gerados.

Exemplo: Se você tiver uma ação ou um step  que realiza a adição de duas entradas (x + y = z), você pode criar uma variável do tipo output da soma (z) para outros steps ou job usarem ela como entrada.

Outputs são particularmente úteis quando queremos compartilhar resultados de uma ação com outras etapas de nosso fluxo.

Como criar outputs?

Para criar um output, é preciso seguir uma nomenclatura bem específica, usando a mesma nomenclatura do que para variáveis de ambiente:

run: echo "{name}={value}" >> $GITHUB_OUTPUT

Observação: A sintaxe antiga usava:

run: echo "::set-output name={name}::{value}"

Exemplo de step para configurar um output hardcoded:

- name: Set Sum
   id: abc
   run: echo "SUM=20" >> $GITHUB_OUTPUT 

Aqui, o valor do output SUM “20” é hardcoded, mas seria possível usar o resultado de uma ação anterior para configurar o output, por exemplo:

Exemplo de step para configurar um output dinâmico:

- name: Set IP Address
   id: xyz
   run: echo "ip-address=$(curl -s ifconfig.me)" >> $GITHUB_OUTPUT

Aqui, o valor do output ip-address é determinado na hora da execução do comando curl -s ifconfig.me

Como manipular um output

Conforme comentamos, usamos outputs para compartilhar resultados de uma ação com outras etapas de nosso fluxo. Pode ser em um outro step de nosso job ou em outro job.

1 – Em um step do mesmo job

Caso precisar usar um output em um step posterior ao step onde foi configurado, no mesmo job, basta seguir a nomenclatura de busca do valor de um output:

run: echo "${{ steps.{id-step}.outputs.{output-name} }}"

Usando novamente o exemplo do parágrafo anterior, daria algo assim:

steps:
	- name: Set IP Address
 	  id: xyz
	  run: echo "ip-address::$(curl -s ifconfig.me)" >> $GITHUB_OUTPUT
	- name: Get IP Address
	  run: echo "${{ steps.xyz.outputs.ip-address }}"

2 – Em um outro job

Caso precisar usar um output em um outro job, a nomenclatura será semelhante, com a adição de mais duas configurações:

  • Uma ao nível do job que cria o output.
  • Uma ao nível do job que vai querer usar o output.

Para a primeira configuração, é preciso adicionar um campo outputs ao nível do job:

outputs:
       output-name: ${{ steps.{id-step}.outputs.{output-name} }}

Exemplo de como configurar um output em um job para compartilhar no outro job.

job1:

		runs-on: ubuntu-latest
	outputs:
		ip: ${{ steps.xyz.outputs.ip-address }}
	steps:
		- name: Set IP Address
 		  id: xyz
		  run: echo "ip-address::$(curl -s ifconfig.me)" >> $GITHUB_OUTPUT

Para a segunda configuração (no outro job) é preciso adicionar a relação de dependência com o primeiro job. A nomenclatura de busca do valor do output muda um pouco devido a isso.

Para a dependência entre os jobs, usar:

needs: {job-id}

Para a nomenclatura de busca no segundo job, usar:

run: echo ${{ needs.{job-id}.outputs.{output-name} }}

Exemplo de como usar um output em um outro job

job2:

	runs-on: ubuntu-latest
	needs: job1
	steps:
	       - name: Get IP Address
	          run: echo ${{ needs.job1.outputs.ip }}

Segue o workflow completo para quem quiser experimentar:

Exemplo prático de como manipular outputs no Github Actions

Aqui vou mostrar um exemplo com algumas maneiras de usar o output em um workflow:

  1. workflow inicial
  2. Na aba Actions (conforme imagem abaixo):
Primeira imagem do conteúdo "Workflows no Github Actions: Como manipular outputs": Ilustração da interface gráfica do Github num repositório de POC onde mostra os registros de execução do workflow de outputs
  1. O resultado: workflow run
Segunda imagem do conteúdo "Workflows no Github Actions: Como manipular outputs": Ilustração da interface gráfica do Github num repositório de POC onde mostra a estrutura e as dependências entre os jobs do workflow anterior no Github Actions.

Podemos observar que os 3 primeiros jobs são relacionados, o job 1 cria 2 outputs (hello e world) usados no job 2 (para mostrar “hello world“), e o job 3 aguarda a execução do job 1 e do job 2  para ser executado.

Terceira imagem do conteúdo "Workflows no Github Actions: Como manipular outputs": Ilustração da interface gráfica do Github num repositório de POC onde mostra o resultado dos jobs 1, 2 e 3 no workflow anterior no Github Actions.

O job 4 é a execução do exemplo do artigo, com a criação do output de ip-address e seu uso em outros steps (de 2 formas, criando um json ou não).

Quarta imagem do conteúdo "Workflows no Github Actions: Como manipular outputs": Ilustração da interface gráfica do Github num repositório de POC onde mostra o resultado do job 4 no workflow anterior no Github Actions.

O job 5 mostra como usar um output para decidir qual operação realizar. Neste caso, é gerado um número aleatoriamente, e se ele for maior do que um certo valor (neste caso, 1) ele executa um step, senão ele executa um outro step. Usando uma condição através de um if usando o valor do output.

Quinta imagem do conteúdo "Workflows no Github Actions: Como manipular outputs": Ilustração da interface gráfica do Github num repositório de POC onde mostra o resultado do job 5 no workflow anterior no Github Actions.

Finalmente, o job 6 mostra como concatenar um output composto de várias linhas em uma única linha. Neste caso, várias sintaxes são possíveis:

        run: |
          MESSAGE=$(cat << EOF
          first line
          second line
          third line
          EOF
          )
          echo TEST=$MESSAGE >> $GITHUB_OUTPUT

Ou

   run: |
      echo "TEST=first line \
      second line \
      third line" >> $GITHUB_OUTPUT
Última ilustração da interface gráfica do Github num repositório de POC onde mostra o resultado do job 6 no workflow anterior no Github Actions.

Variáveis de outputs com workflows no Github Actions: mais facilidade para o seu dia a dia

Por hoje é isso! Espero que este artigo tenha deixado mais claro como usar outputs no Github Actions para usar com seus workflows nos seus repositórios do Github.

Quem quiser aprofundar no Github Actions para testar o que foi explicado aqui e muito mais, é só criar seu repositório com seus workflows e experimentar. Isso, pois o plano FREE da plataforma permite você testar seus fluxos de trabalhos em repositórios públicos sem limites de tempo.

Deixo aqui registrado um repositório pessoal, onde testei vários tipos de implementações e eventos diferentes com Github Actions, caso queira fazer um fork.

Lembrando que a documentação do Github Actions em português é muito boa e vale uma lida.

Gostou do conteúdo “Workflows no Github Actions: Como manipular outputs”? Então deixe o seu comentário!

Referências

Capa do artigo "Workflows no Github Actions: Como manipular outputs" ue mostra um homem de camisa branca trabalhando de um notebook em uma mesa, ao fundo vemos uma xícara de café e um vaso de flores.
foto Guillaume Falourd
Back-end Developer
Zupper tentando transformar o complexo em simples através de conteúdos diversificados, com intuito de impactar o mercado de TI e as pessoas ao seu redor da melhor forma possível.

Artigos relacionados

Este site utiliza cookies para proporcionar uma experiência de navegação melhor. Consulte nossa Política de Privacidade.