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:
- workflow inicial
- Na aba Actions (conforme imagem abaixo):
- O resultado: workflow run
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.
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).
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.
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
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
- Definir um parâmetro de saída – GitHub
- Outputs (saída) – GitHub
- Usar o set-output num fluxo de trabalho – GitHub