Cancelando releases pendentes no GitHub Actions

Digamos que você tem um pipeline no GitHub Actions com três estágios (Desenvolvimento, Testes, Produção). E que para publicar em Produção, você depende de aprovação manual, enquanto que nos ambientes de Dev e Teste você faz continuous deployment.

Se você fizer alterações constantes no seu código e, portanto, rodar seu pipeline várias vezes, vai acabar com várias releases “paradas”. Você sabe o que acontece com as releases antigas quando você finalmente aprova uma release mais recente?

Nada. Absolutamente nada. E isso pode ser um problema.

Entendendo o problema

Quando você faz alterações constantes e frequentes em seu código, cada push dispara o seu pipeline de CI/CD no GitHub Actions. Ele executa os estágios de Desenvolvimento e Testes automaticamente, mas fica em espera no estágio de Produção até que a aprovação manual seja concedida. Isso significa que se você fizer várias alterações ao longo do dia, você vai acabar com várias versões de “release” pendentes na etapa de Produção.

O problema surge quando você aprova uma dessas releases pendentes - geralmente a mais recente. As releases mais antigas, aquelas que foram construídas e testadas, mas nunca liberadas, permanecem na fila. Elas não são canceladas ou descartadas automaticamente pelo GitHub Actions.

Isso pode ser problemático por algumas razões. Em primeiro lugar, elas podem causar confusão. Se você ou outros membros de sua equipe olharem para o histórico de execução do pipeline, verão uma longa lista de releases pendentes, sem uma indicação clara de qual foi realmente liberada. Mas, o mais problemático: nada impede que você aprove uma release mais recente e depois, por engano, aprove uma release mais antiga. Imagina? Publicar uma versão antiga do seu código em Produção por cima da versão mais recente?!

Como Cancelar Releases Pendentes

Isso acontecia comigo no projeto do TfsCmdlets. Por isso, acabei implementando esta solução no meu pipeline para cancelar todas as releases pendentes quando uma nova fosse aprovada.

A configuração é feita utilizando o próprio YAML de configuração do pipeline. Eis um exemplo de como isso pode ser feito:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
name: Cancel Old Runs

on: 
  workflow_dispatch:
  push:
    branches:
      - main

jobs:
  cancel-runs:
    name: Cancel Old Runs
    runs-on: ubuntu-latest
    steps:
    - name: Cancel Old Runs
      uses: styfle/[email protected]
      with:
        access_token: $

Este código faz uso da ação cancel-workflow-action, que permite cancelar execuções de workflow anteriores. Com essa configuração, sempre que você fizer um push para a branch main ou disparar o workflow manualmente, todas as execuções anteriores do mesmo workflow serão canceladas.

Tenha em mente que isso é apenas um exemplo, e você pode precisar ajustar este código para que ele funcione perfeitamente com a configuração específica do seu projeto. No entanto, o conceito principal permanece o mesmo: é possível e recomendável cancelar automaticamente as releases pendentes mais antigas sempre que uma nova release for aprovada.

Conclusão

Se você tem um pipeline de CI/CD no GitHub Actions que depende de aprovação manual para publicar em Produção, é provável que você tenha várias releases pendentes na fila. Para cancelar todas as releases mais antigas quando aprovar um deploy em Produção, você pode utilizar a ação cancel-workflow-action.

Espero que este artigo tenha sido útil. Se você tiver alguma dúvida ou sugestão, deixe um comentário abaixo. Até a próxima!

Um abraço,
Igor Abade



19/07/2023 | Por Igor Abade V. Leite | Em Técnico | Tempo de leitura: 3 mins.

Postagens relacionadas