DEV Community

Priscila Oliveira
Priscila Oliveira

Posted on

Automação de Daily no Slack com GitHub Actions e Python

📌 Introdução

Se você trabalha com metodologias ágeis, sabe como as dailies são essenciais para manter o time alinhado. Mas e se você pudesse automatizar o lembrete e a escolha do apresentador de cada dia?

O DailyBot resolve isso! 🎉

Ele é um bot automatizado para Slack, que anuncia diariamente a reunião e seleciona automaticamente quem será o próximo apresentador. Tudo isso rodando de forma totalmente automatizada com Python, GitHub Actions e a API do Slack.

Este artigo vai te guiar pelo passo a passo para criar, configurar e automatizar o DailyBot no seu time!

O projeto original se encontra no Github, fique à vontade para abrir issues e pull requests no GitHub!


🛠 Tecnologias Utilizadas

Vamos usar as seguintes ferramentas para implementar o bot:

  • Python 3.9 → Para programar o bot.
  • Slack API → Para postar mensagens no canal do time.
  • GitHub Actions → Para rodar o bot automaticamente todos os dias úteis.
  • Requests (Python) → Para enviar requisições à API do Slack.

📂 Estrutura do Projeto

O projeto segue uma estrutura organizada para facilitar a manutenção:

.
├── .github/workflows/       # Configuração do GitHub Actions
│   ├── ci.yaml              # Workflow para execução automatizada
├── scripts/                 # Diretório para scripts Python
│   ├── daily_slack.py       # Script responsável pelo envio da mensagem para o Slack
├── .gitignore               # Arquivo para ignorar arquivos desnecessários no repositório
├── LICENSE                  # Licença do projeto
├── README.md                # Documentação do projeto
Enter fullscreen mode Exit fullscreen mode

Agora, vamos ao código! 💻


📢 Criando o Bot no Slack

Antes de rodarmos o DailyBot, precisamos criar um bot no Slack para gerar as credenciais necessárias.

1️⃣ Criando um App no Slack

  1. Acesse 🔗 Create a Slack App.
  2. Clique em "Create New App" e escolha "From Scratch".
  3. Dê um nome ao seu bot (exemplo: DailyBot) e selecione o workspace do seu time.
  4. Vá até OAuth & Permissions e adicione os seguintes escopos:
    • chat:write → Para enviar mensagens no canal.
    • chat:write.public → Para postar em canais públicos.
    • users:read → Para listar os membros do time.
  5. Instale o aplicativo no workspace e copie o Bot User OAuth Token (SLACK_TOKEN).

Agora que o bot já está no Slack, vamos programá-lo! 🛠️


⚙️ Configurando o Script em Python

Crie o arquivo scripts/daily_slack.py e adicione o seguinte código:

import requests
import os
from datetime import datetime

# Obtendo as variáveis de ambiente
SLACK_TOKEN = os.getenv("SLACK_TOKEN")
CHANNEL_ID = os.getenv("CHANNEL_ID")
SLACK_MEMBERS = os.getenv("SLACK_MEMBERS").split(",")

# Calculando o apresentador do dia
execution_number = datetime.utcnow().timetuple().tm_yday  
next_index = (execution_number - 1) % len(SLACK_MEMBERS)  
presenter = f"<@{SLACK_MEMBERS[next_index]}>"

# Mensagem para o Slack
message = (
    f"🎤 Olá pessoal! \n"
    f"Quem apresentará hoje: {presenter}!"
)

# Configuração da API do Slack
url = "https://slack.com/api/chat.postMessage"
headers = {"Authorization": f"Bearer {SLACK_TOKEN}", "Content-Type": "application/json"}
data = {"channel": CHANNEL_ID, "text": message}

# Enviando a mensagem para o Slack
response = requests.post(url, json=data, headers=headers)
print("Mensagem enviada:", response.json())
Enter fullscreen mode Exit fullscreen mode

🔍 Como Funciona a Lógica do Script?

Esse script segue uma lógica simples e eficiente para alternar automaticamente o apresentador da daily.

Passo a passo:

  1. Carregamos as variáveis de ambiente → O token do bot (SLACK_TOKEN), o ID do canal (CHANNEL_ID) e a lista de membros (SLACK_MEMBERS).
  2. Calculamos o dia do ano atual → O execution_number retorna um valor de 1 a 365.
  3. Selecionamos o próximo apresentador → Usamos o operador módulo % para percorrer ciclicamente a lista de membros.
  4. Criamos a mensagem com o apresentador do dia → O Slack usa <@userID> para mencionar um usuário.
  5. Enviamos a mensagem usando a API do Slack.

Exemplo prático:

Se a lista de apresentadores for:

export SLACK_MEMBERS="U12345,U67890,U54321"
Enter fullscreen mode Exit fullscreen mode

O apresentador será alternado conforme o dia do ano:

Dia do Ano Apresentador
1 (Jan) U12345
2 (Jan) U67890
3 (Jan) U54321
4 (Jan) U12345 (reinicia)

Essa abordagem garante que o bot sempre escolhe o próximo da fila, sem repetições ou sorteios aleatórios. 🔄


🔄 Automatizando com GitHub Actions

Agora, vamos configurar o GitHub Actions para rodar esse bot automaticamente todos os dias úteis.

📌 Criando o Workflow .github/workflows/ci.yaml

Crie o arquivo .github/workflows/ci.yaml e adicione:

name: Daily Slack Notification

on:
  schedule:
    - cron: "30 12 * * 1-5" # Executa às 12:30 (UTC) de segunda a sexta
  workflow_dispatch: # Permite execução manual via GitHub Actions

jobs:
  daily-slack-notification:
    name: Enviar Notificação para o Slack
    runs-on: ubuntu-latest

    steps:
      - name: Checkout do repositório
        uses: actions/checkout@v4

      - name: Configurar Python
        uses: actions/setup-python@v4
        with:
          python-version: "3.9"

      - name: Instalar dependências
        run: pip install requests

      - name: Executar script Python
        run: python scripts/daily_slack.py
Enter fullscreen mode Exit fullscreen mode

📌 Como funciona esse Workflow?

✔️ Execução automática → O cron agendado faz o bot rodar de segunda a sexta às 12:30 UTC.

✔️ Execução manual → Você pode rodar a ação manualmente via GitHub Actions.

✔️ Instalação automática de dependências → O bot instala requests antes de rodar o script.


🎯 Conclusão

Agora você sabe como:

✅ Criar um bot no Slack para anunciar dailies.

✅ Escrever um script Python para enviar mensagens automaticamente.

✅ Configurar um workflow no GitHub Actions para automação diária.

✅ Alternar automaticamente o apresentador da daily com uma lógica eficiente.

Agora sua equipe nunca mais esquecerá a daily e quem irá apresenta-la! 🚀

Se tiver dúvidas ou sugestões, deixe um comentário. Se gostou do artigo, compartilhe com seu time! 😊🔥

Top comments (0)