Como notificar o status da sua pipeline usando Github Actions e Discord
Tags: discord, githubactions, cicd, devops
Published: 2023-04-27 18:04:37

Github Actions foi uma das melhores ferramentas que descobri e estudei recentemente. A possibilidade de poder escrever pipelines customizadas para cada situação e modificar cada processo de forma quase artesanal para o projeto é simplesmente incrível.

Não é de se esperar menos que perfeição e variedade no quesito plugins quando falamos sobre uma tecnologia produzida e distribuída pelo próprio Github. O Github Actions possui integração com inúmeros serviços externos e podemos exceder na criatividade e sofisticação durante os passos da pipe.

Nesse artigo vamos explorar as possibilidades usando curl e a API do Discord, sem um plugin propriamente dito, mas que exerce o mesmo papel de um. Primeiramente, vamos começar configurando o ambiente dentro do aplicativo do Discord.

O primeiro passo para fazer a integração, é escolher o canal de texto do seu servidor do Discord onde as mensagens de log serão enviadas. Entre em Editar Canal e vá em Integrações. Lá você vai encontrar a seção de Webhooks.

![Seção de Webhooks do canal](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0xgwlj0mxtvuiioahc8j.png)

Webhook é a feature do Discord que nos possibilita a integrar produtos e plataformas externas com os canais de texto sem precisar de nenhuma forma de autenticação, funcionando como um widget ou um plugin externo.

Clique em criar um novo hook e clique no item criado para ver seus detalhes. Copie o URL do Webhook e agora já podemos partir para a configuração do Github Actions.

Com o repositório criado, vá na pasta do seu projeto e crie o diretório `.github/workflows` e lá dentro crie o arquivo de configuração da Action que será criada, o nome do arquivo é de sua escolha, mas certifique-se de que sua extensão seja YAML. Nesse exemplo, vamos criar um arquivo chamado `notificar-discord.yaml`.

Dentro do arquivo, vamos usar o código abaixo:
```yaml
name: Build and Notify
on:
  pull_request:
  push:
    branches:
      - main
jobs:
  lint:
    name: Quality Tests
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Install dependencies
        run: npm install
      - name: Build project
        run: npm run build
      - name: Notify Discord
        env:
          DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
          TARGET_BRANCH: ${{ secrets.TARGET_BRANCH }}
        run: |
          curl -X POST -H "Content-Type: application/json" \
          -d '{"content": "Build feita com sucesso! ✅ \nStatus: `${{ job.status }}` \nAutor: @${{ github.actor }}"}' \
          $DISCORD_WEBHOOK_URL

```

A Action criada no arquivo acima tem o seguinte fluxo:

- Ouvir mudanças na branch main (você pode mudar para a branch que preferir)
- Checar o repositório e fazer o checkout
- Buildar a aplicação
- Enviar a mensagem pelo Discord

⚠️ Caso ocorra erros durante o pipeline, a mensagem não será enviada e a Action será apontada como falha.

Para que a Action funcione corretamente, precisamos ir na seção de Secrets do Github e definir o DISCORD_WEBHOOK_URL, que é o URL do Webhook criado previamente. Navegue até a página de [Secrets do repositório](https://github.com/{seu_user}/{nome_do_repo}/settings/secrets/actions) e crie o seu novo secret contendo o URL do Webhook criado.

Ao configurar os Secrets, sua pipeline com o Github Actions estará pronta para ser testada. Então vamos lá, crie um commit qualquer e faça o push para a branch escolhida no arquivo YAML.

Assim que o commit for feito, vá até sua [página de Actions](https://github.com/{seu_user}/{nome_do_repo}/actions) e veja os detalhes da sua pipeline. 

Se tudo der certo, vá até o canal escolhido no Discord e você vai encontrar a mensagem enviada pelo bot criado juntamente com o Webhook.

![Mensagem enviada pelo Webhook](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v877mq36ea8qcdolo5ym.png)

Então é isso! xD 
Essa é uma das features que descobri recentemente enquanto automatizava o CI/CD do meu projeto e resolvi compartilhar com vocês