Criar perfeitamente um Bot do Slack para Invocar Ações do GitHub via Hubot

Se você usar o GitHub Actions como sua linha de construção e lançamento e sua equipe também usar o Slack, você sabia que nem mesmo precisa sair do Slack? Crie um bot do Slack para invocar fluxos de trabalho do GitHub Actions diretamente do Slack automaticamente!

Neste tutorial, você aprenderá como configurar um novo chatbot do Slack usando a ferramenta de construção de bot chamada Hubot e iniciar automaticamente um fluxo de trabalho do GitHub Actions para implantar código em um servidor.

Vamos começar!

Pré-requisitos

Este tutorial será uma demonstração prática. Se você deseja acompanhar, certifique-se de ter o seguinte:

  • A Slack Workspace
  • A GitHub account and a GitHub personal token
  • A Linux server to deploy code to – This tutorial will use Ubuntu 19.
  • A local Linux machine – This tutorial will use Ubuntu so that all local commands will be Linux. If you’re running another operating system, the commands may be slightly different.
  • Credenciais SSH para conectar ao servidor onde você irá implantar o código.
  • A code editor of your choice that understands YAML like Visual Studio Code.

Criando um Projeto e Fluxo de Trabalho do GitHub Actions

Antes de poder invocar rapidamente fluxos de trabalho do GitHub Actions a partir do Slack, você deve primeiro criar o fluxo de trabalho.

Para criar o fluxo de trabalho, vamos criar uma pasta de projeto para conter todos os arquivos com os quais você estará trabalhando.

1. Abra sua aplicação de terminal favorita.

2. Agora execute a série de comandos abaixo para criar a pasta do projeto chamada Hubot e navegue até ela.

mkdir ~/Hubot # Crie um diretório chamado Hubot
cd ~/Hubot    # Mude o diretório para Hubot

3. Em seguida, execute npm init para criar um arquivo package.json do Node.JS. Executar npm init cria um projeto padrão do Node.JS que inclui o arquivo package.json que contém várias informações sobre o projeto e quaisquer pacotes NPM dependentes.

npm init      # Inicializa o arquivo package.json

4. Agora, crie um diretório fluxos de trabalho e o arquivo deploy.yml de fluxo de trabalho. O arquivo de fluxo de trabalho é uma série de etapas definidas em sequência que as Ações do GitHub seguirão.

mkdir .github/workflows && touch deploy.yml

5. Em seguida, defina cada um dos segredos do GitHub que seu fluxo de trabalho irá ler. O fluxo de trabalho que você está prestes a criar fará referência a esses segredos. Como você precisará do endereço do seu servidor, nome de usuário, senha e porta do seu servidor para SSH, vamos criar segredos do GitHub.

Visite este URL https://github.com/seunomeusuario/seurepositorio/configuracoes/segredos/acoes onde você irá adicionar seus segredos do GitHub. Substitua seunomeusuario pelo seu nome de usuário do GitHub e seurepositorio pelo seu repositório do GitHub.

Clique no botão Novo segredo do repositório, conforme mostrado abaixo, para preencher as informações sobre o segredo que você está adicionando.

Adding GitHub Secrets

6. Agora preencha os campos Nome e Valor do segredo e clique em Adicionar segredo para salvá-lo. A página será redirecionada para a página de segredos do GitHub, onde você verá todos os seus segredos. Para adicionar mais segredos, clique no botão Novo segredo do repositório como fez anteriormente.

Certifique-se de salvar os segredos para as variáveis fornecidas com o mesmo nome exato, pois você estará referenciando as mesmas variáveis, que são HOST, USERNAME, PASSWORD e PORTA.

Filling up Information for a GitHub Secret
Viewing All GitHub Secrets

7. Finalmente, abra o arquivo de fluxo de trabalho ~/Hubot/.github/workflows/deploy.yml no seu editor de código, e copie/cole o seguinte código. O código abaixo é o fluxo de trabalho que será executado sempre que você acionar o fluxo de trabalho via Slack mais tarde.

Ao invocar o fluxo de trabalho, algumas ações serão realizadas:

  • O GitHub Actions irá analisar o arquivo de fluxo de trabalho abaixo para se conectar via SSH no host alvo definido no segredo HOST com o USERNAME e PASSWORD definidos como segredos.
  • O fluxo de trabalho então irá baixar o conteúdo do repositório do GitHub para um ramo específico ($branchName) executando git pull origin$branchName. Certifique-se de que o nome do ramo contenha o código que você deseja implantar.
  • Você estará usando um Pacote de Fluxo de Trabalho do GitHub Marketplace chamado ssh-remote-commands. Este pacote possui um bom wrapper para contornar onde você só precisa fornecer o host, nome de usuário, senha, porta e comando a ser executado na produção.

Certifique-se de que seu servidor tenha o git instalado com as credenciais de login necessárias para puxar o código do repositório do GitHub

# Nome que será referenciado para realizar muito mais com ele programaticamente 
name: deploy 
on:
  # O evento respository_dispatch significa que a cada acionamento da API, 
  # este arquivo inteiro é executado
  repository_dispatch: 
    types: [deploy-service]
# Pode haver vários trabalhos, mas atualmente, 
# este tutorial só funcionará com um
jobs:
  deploy:
    name: Deploy
    # O nome da imagem base onde todo o código em YAML é executado
    runs-on: ubuntu-latest
    steps:
    - name: executing remote ssh commands using password
      # appleboy/ssh-action@master é um pacote de código aberto 
      # que faz login em um servidor via ssh e executa o script
      uses: appleboy/ssh-action@master
      # Geralmente, essas são as variáveis que o pacote precisa 
      # para fazer login no servidor e executar o script
      with:
       # Os segredos são as variáveis de 
       # https://docs.github.com/en/actions/security-guides/encrypted-secrets

       # Seu host do servidor armazenado em segredos do github com o mesmo nome HOST
        host: ${{ secrets.HOST }} 
        # O nome de usuário do seu servidor para fazer login 
        # que está armazenado em segredos do github com o nome USERNAME
        username: ${{ secrets.USERNAME }} 
        # A senha do seu servidor para fazer login 
        # que está armazenada em segredos do github com o nome PASSWORD        
        password: ${{ secrets.PASSWORD }} 
        # A porta do seu servidor para fazer login 
        # que está armazenada em segredos do github com o nome PORT
        port: ${{ secrets.PORT }}  
        # deploy-app.sh pode ser qualquer coisa, como você pode baixar código do GitHub
        # e reiniciar seu servidor web ou filas, qualquer coisa
        # Certifique-se de ter clonado o repositório em seu servidor  
        # Você pode executar quantos scripts quiser
        script: git pull origin {{ github.event.client_payload.branch 

Executando o Fluxo de Trabalho Manualmente

Agora você criou o fluxo de trabalho do GitHub Actions para invocar via Slack. Mas neste ponto, seu código está apenas em sua máquina local. Para acionar o fluxo de trabalho, você precisará enviar o código para o GitHub.

Executar a série de comandos abaixo informa ao git de onde o código deve ser enviado e puxado, neste exemplo, do seu repositório remoto no GitHub. No comando git remote add origin abaixo, substitua seunomedeusuário e seurepositório pelo seu nome de usuário e repositório no GitHub

# Abra github.com e crie um repositório
git init # Inicializa o git
git remote add origin https://github.com/yourusername/yourrepository.git
git add . # Adiciona os arquivos recém-criados para o git rastrear
git commit -m "Created GitHub workflow file"
git push -u origin master

Vamos primeiro testar se o seu código funciona. Invoque seu código manualmente usando a popular ferramenta curl.

Execute o comando abaixo para fazer uma solicitação de postagem no seu Repositório do GitHub https://github.com/nomedeusuário/repositório/dispatches URL para informar ao GitHub para acionar um arquivo de fluxo de trabalho deploy.yml que você criou anteriormente. Substitua nomedeusuário pelo seu nome de usuário real do GitHub e repositório pelo seu repositório do GitHub.

Substitua $github_personal_token no código abaixo pelo seu token pessoal.

# Faz uma solicitação de postagem no url https://github.com/username/repository/dispatches 
curl-X POST  https://github.com/username/repository/dispatches \
# Adiciona cabeçalho para aceitar tipo de conteúdo
-H 'Accept: application/vnd.github.everest-preview+json' \
# Adiciona cabeçalho para autorização
-H "Authorization: token $github_personal_token" \
# Adiciona conteúdo json em um corpo de solicitação de postagem para que você possa enviar vários parâmetros 
# a partir desta seção de dados e você pode realizar várias ações com base em argumentos
--data '{"event_type": "deploy-service", "client_payload": {"environment": "'"$1"'", "ref": "'"$2"'"}}' # Você pode passar o nome do ambiente & ref como um nome de branch para que você saiba em qual branch implantar em qual servidor

Criar Slack Bot com Hubot

Já que você conseguiu acionar o Fluxo de Trabalho de Ação do GitHub manualmente, isso é um bom começo. Agora vamos tentar automatizar as mesmas etapas manuais via Slack Bot. Você criará um Slack Bot, que ouve seu comando e aciona a Ação do GitHub com argumentos.

Você tem duas opções para criar um Slack Bot, seja do zero ou um pacote hubot pré-construído para espaços de trabalho do slack. Neste tutorial, você usará um pacote de Bot pré-construído chamado Hubot. Hubot é uma ferramenta de automação de código aberto que se integra a serviços de chat como Slack, Discord, Gitter, TeamSpeak, etc.

Criar um bot personalizado sem usar um aplicativo como o Hubot leva muito tempo. Por quê? Porque você lidará com todos os processos de configuração, ouvindo webhooks e hospedando o bot. Portanto, neste tutorial, você usará o aplicativo Hubot Slack para simplificar todos esses processos.

Instalando o Hubot com Npm

Como você está usando o Hubot para criar um bot do Slack, primeiro baixe e instale o Hubot em sua máquina local. O Hubot será o conector que vincula o Slack e as ações do GitHub.

1. No seu terminal, navegue (cd) até o diretório do seu projeto (~/Hubot).

cd ~/Hubot

2. Instale globalmente o pacote yo e generator-hubot em sua máquina local com o comando npm install -g abaixo. O pacote yo ajuda a instalar novos projetos gerando projetos em qualquer linguagem (Web, Java, Python, C#, etc.). O pacote generator-hubot usa o pacote yo para instalar todas as dependências junto com as configurações iniciais.

Uma vez instalado, você pode executar o comando yo de qualquer lugar, pois foi instalado globalmente.

npm install -g yo generator-hubot

3. Agora, crie um modelo básico do Hubot com o seguinte comando. Um modelo básico é uma seção de código incluída em muitos lugares. Sem um modelo básico, você sempre precisa escrever o código do zero.

O comando abaixo cria um modelo básico do Hubot no diretório do seu projeto. O modelo do Hubot conecta-se ao Slack (--adapter=slack) para que o Bot possa ouvir e responder às mensagens dentro do canal do Slack. yo hubot --adapter=slack

yo hubot --adapter=slack

Adicionando o Hubot ao seu Espaço de Trabalho no Slack

Agora que o Hubot está instalado em sua máquina local, você precisa configurar o Hubot para se comunicar com o Slack.

Vamos instalar o Hubot no seu Espaço de Trabalho do Slack.

1. Abra seu navegador da web e acesse as configurações de administração do Slack com a URL, como https://nomedoespaco.slack.com/admin/settings. Substitua nomedoespaco pelo nome real do seu Espaço de Trabalho do Slack.

Clique no Configurar aplicativos on no painel esquerdo, conforme mostrado abaixo, para que você possa procurar pelo Hubot no marketplace. O Slack possui um marketplace onde você pode encontrar aplicativos pré-construídos.

Accessing Slack Admin Settings

2. Clique na barra de pesquisa e digite hubot para buscar o Hubot no marketplace e selecione Hubot.

Agora, clique no botão Adicionar ao Slack, como mostrado abaixo, para adicionar o Hubot ao seu Espaço de Trabalho no Slack.

Searching Hubot and Adding it to Slack Workspace

3. Por fim, preencha algumas informações gerais sobre o seu Bot, como o nome (deployerhubot) e o ícone. Observe o Token da API, pois você o utilizará posteriormente no Hubot Deployer para ativar o Bot no seu projeto Hubot criado anteriormente.

Setting up Bot Information and Taking Note of the API Token

Testando a Integração do Fluxo de Trabalho do GitHub Actions com o Slack

Agora você tem o Hubot instalado no seu Espaço de Trabalho do Slack. Vamos testar o bot ouvindo e enviando mensagens para o canal. Mas primeiro, você precisa ativar o Bot.

1. Execute o comando abaixo no diretório raiz do projeto para ativar o Bot para o Slack (--adapter slack) a partir do seu repositório Hubot (./bin/hubot). Certifique-se de substituir $token pelo token da API que você anotou anteriormente

HUBOT_SLACK_TOKEN=$token ./bin/hubot --adapter slack

2. Execute o comando abaixo para convidar (/invite) o Bot (botusername) para o seu canal no Slack. Substitua botusername pelo nome do Bot que você registrou na terceira etapa da seção “Adicionando o Hubot ao seu Espaço de Trabalho no Slack”.

/invite deployerhubot

Agora, mencione um Bot com um texto no Slack, como @deployerhubot ping, para testar se a integração está funcionando. Se o Bot responder PONG, como mostrado abaixo, então está tudo pronto.

Testing Hubot and Slack Integration

Se o Bot não responder, vá para o repositório GitHub no seu navegador e clique na guia Actions. Você pode identificar qual fluxo de trabalho falhou, pois terá um distintivo de verificação vermelho redondo. Clique no fluxo de trabalho falho para ver o que causou o problema e corrija-o.

Viewing Failed Workflows

Abaixo, você pode ver que a falha está em executar comandos SSH remotos usando senha. Depois de corrigir o fluxo de trabalho, volte para o passo 3 e veja se o Bot responde PONG.

Navigating to GitHub repository to fix failed workflow

Iniciando um Fluxo de Trabalho do GitHub Actions a partir do Slack

Agora que você ativou seu Bot do Slack, é hora de iniciar o fluxo de trabalho do GitHub Actions a partir do Slack!

Você precisa da flexibilidade para implantar o branch dado em um servidor específico, como puxar os códigos do branch dado. Você vai ensinar o Bot a responder automaticamente quando alguém digitar ***@*bot deploy recurso-x para produção em um Canal do Slack. Você pode validar o nome do ambiente, onde posteriormente as pessoas só poderão implantar certos ambientes e branches.

Para automatizar as respostas do Bot:

1. Crie um diretório chamado ~/Hubot/scripts. O diretório ~/Hubot/scripts é onde você vai salvar um script que dispara seu fluxo de trabalho do GitHub.

2. No seu editor de código, crie um arquivo chamado bot.js dentro do diretório ~/Hubot/scripts. Agora copie o código abaixo e cole dentro do arquivo bot.js.

O código abaixo permite que o Bot ouça as mensagens de chat no Canal do Slack e, em seguida, dispara o fluxo de trabalho para enviar uma resposta ao Canal do Slack.

const validServices = ['api','app'];
const validEnvironments = ['production'];
robot.hear (`@${process.env.BOT_ID}`,async (bot) => {
    // O bot está apenas interessado em ouvir mensagens 
    // como @deploy api featurex para produção 
    // Configurando variável reutilizável
	  const payload = bot.message.text.split(" ")
    const service = payload[2];
    const branch = payload[3];
    const environment = payload[5];
    const username = bot.message.user.name;
    // Informar ao usuário que estamos processando
    bot.send(`Roger that! Please wait.`);
// Validar se o comando usado é válido ou não 
// porque o usuário pode usar comandos inválidos também 
if(!validateCommand(bot,username,service,branch,environment)) {
      return;
    }
    // Se o comando parecer válido, então disparar um fluxo de trabalho
    await triggerWorkflow(bot,username,service,environment,branch)
    
    // Informar ao usuário que o fluxo de trabalho foi acionado com sucesso
    bot.send(`Github Action has been triggered successfully`);
  })
  const validateCommand = (bot,username,service,branch,environment) => {
    // Limitar os serviços, pois os usuários podem usar serviços que não estão listados 
    // O que tentará acionar o fluxo de trabalho e receberá um erro
    if(!validServices.includes(service)) {
       bot.send(`${service} is not availble, Only ${validServices.join(', ')} are available`);
      return false;
      }
      // Limitar o ambiente, pois os usuários podem usar uma lista inválida de ambientes também
      if(!validEnvironments.includes(environment)) {
        bot.send(`${environment} is not availble. Only ${validEnvironments.join(', ')} are available`);
        return false;
      }
      return true;
  }

  const triggerWorkflow = (bot,username,service,environment,branch) => {
    try {
      // Este é o mesmo código de acionamento de fluxo de trabalho manual convertido 
      // de curl para uma solicitação de postagem javascript real
      const data = await axios.post(`https://api.github.com/repos/yourusername/yourreponame/dispatches`,{
        'event_type': 'deploy-service',
        'client_payload': {'environment': environment, 'ref': branch}
      },{headers:{
      Authorization: `token ${token}`,
      }})
    }
      catch(e) {
        bot.send(`Sorry @${username} could not trigger github action. Please check my logs ${e.message}`);
      }
  }

3. Finalmente, envie a mensagem @nomedobot deploy api staging para dev no Slack, e você verá uma resposta semelhante, conforme mostrado abaixo.

Os arquivos de fluxo de trabalho podem ser acionados por vários Eventos do GitHub, como enviar código para uma determinada branch, criar tags, criar solicitações de pull, solicitar alguns URLs e muito mais.

send the @botusername deploy api staging to dev message in slack

Conclusão

Ao longo deste tutorial, você aprendeu sobre o Fluxo de Trabalho do GitHub, desde acionar manualmente respostas do Slack com códigos até construir um chatbot. Você também aprendeu que ter um chatbot no Slack permite automatizar tarefas invocando fluxos de trabalho de ações do GitHub.

Você levará esse novo conhecimento a um novo patamar, talvez adicionando um Bot de Lembretes ou criando mensagens interativas?

Source:
https://adamtheautomator.com/create-slack-bot/