Perfect een Slack-bot maken om GitHub Actions aan te roepen via Hubot

Als je GitHub Actions gebruikt als je build- en release-pijplijn en je team ook Slack gebruikt, wist je dan dat je Slack nooit eens hoeft te verlaten? Maak een Slack-bot om GitHub Actions-workflows rechtstreeks vanuit Slack automatisch aan te roepen!

In deze tutorial ga je leren hoe je een nieuwe Slack-chatbot opzet met de botbouwtool genaamd Hubot en automatisch een GitHub Actions-workflow start om code naar een server te implementeren.

Laten we beginnen!

Vereisten

Deze tutorial zal een praktische demonstratie zijn. Als je wilt meedoen, zorg er dan voor dat je het volgende hebt:

  • 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.
  • SSH-inloggegevens om verbinding te maken met de server waarop je code zult implementeren.
  • A code editor of your choice that understands YAML like Visual Studio Code.

Het maken van een Project en GitHub Actions Workflow

Voordat je GitHub Actions-workflows snel kunt aanroepen vanuit Slack, moet je eerst de workflow maken.

Om de workflow te maken, laten we een projectmap maken om alle bestanden in te bewaren waarmee je zult werken.

1. Open je favoriete terminaltoepassing.

2. Voer nu de onderstaande reeks commando’s uit om de projectmap genaamd Hubot te maken en er naartoe te navigeren.

mkdir ~/Hubot # Maak een map met de naam Hubot
cd ~/Hubot    # Verander de map naar Hubot

3. Voer vervolgens npm init uit om een Node.JS package.json bestand te maken. Door npm init uit te voeren, wordt een standaard Node.JS-project gemaakt dat het package.json bestand bevat met diverse informatie over het project en eventuele afhankelijke NPM-pakketten.

npm init      # Initialiseert package.json bestand

4. Maak nu een workflows map en het deploy.yml werkstroom bestand. Het werkstroombestand is een reeks stappen die in een volgorde zijn gedefinieerd die GitHub Actions zal volgen.

mkdir .github/workflows && touch deploy.yml

5. Definieer vervolgens elk van de GitHub-geheimen die je workflow zal lezen. De workflow die je gaat maken, zal naar deze geheimen verwijzen. Aangezien je je serveradres, gebruikersnaam, wachtwoord en poort van je server nodig hebt voor SSH, laten we GitHub-geheimen maken.

Bezoek deze URL https://github.com/jouwgebruikersnaam/jouwrepository/settings/secrets/actions waar je je GitHub-geheimen zult toevoegen. Vervang jouwgebruikersnaam door je GitHub-gebruikersnaam en jouwrepository door je GitHub-repository.

Klik op de knop Nieuw repositorygeheim, zoals hieronder weergegeven, om informatie over het geheim dat je toevoegt in te vullen.

Adding GitHub Secrets

6. Vul nu de velden Naam en Waarde van het geheim in en klik op Geheim toevoegen om het op te slaan. De pagina wordt omgeleid naar de GitHub-geheimpagina waar je al je geheimen zult zien. Om meer geheimen toe te voegen, klik je op de knop Nieuw repositorygeheim zoals je eerder hebt gedaan.

Zorg ervoor dat je geheimen opslaat voor de gegeven variabelen met exact dezelfde naam, omdat je naar dezelfde variabelen zult verwijzen, namelijk HOST, USERNAME, PASSWORD en PORT.

Filling up Information for a GitHub Secret
Viewing All GitHub Secrets

7. Open tot slot het ~/Hubot/.github/workflows/deploy.yml-workflowbestand in je code-editor en kopieer/plak de volgende code. De onderstaande code is de workflow die wordt uitgevoerd telkens wanneer je later de workflow via Slack activeert.

Wanneer je de workflow oproept, zullen er een paar acties plaatsvinden:

  • GitHub Actions zal het onderstaande werkstroombestand parsen om SSH in te schakelen naar het doelhost dat is gedefinieerd in het geheime HOST met de USERNAME en PASSWORD gedefinieerd als geheimen.
  • De werkstroom zal vervolgens de inhoud van de GitHub-repo voor een specifieke tak ($branchName) downloaden door git pull origin$branchName uit te voeren. Zorg ervoor dat de taknaam de code bevat die je wilt implementeren.
  • Je zult een Workflow Package gebruiken van Github Marketplace genaamd ssh-remote-commands. Deze package heeft een handige wrapper om te omzeilen waar je alleen de host, gebruikersnaam, wachtwoord, poort en opdracht hoeft op te geven die op productie moet worden uitgevoerd.

Zorg ervoor dat je server git geïnstalleerd heeft met de benodigde aanmeldingsgegevens om de code uit de GitHub-repository te halen

# Naam waarnaar veel meer programmatisch wordt verwezen 
name: deploy 
on:
  # Het evenement respository_dispatch betekent bij elke API-trigger, 
  # wordt dit hele bestand uitgevoerd
  repository_dispatch: 
    types: [deploy-service]
# Er kunnen meerdere taken zijn, maar momenteel, 
# deze tutorial zal slechts op één werken
jobs:
  deploy:
    name: Deploy
    # De naam van het basisbeeld waarin alle code in YAML wordt uitgevoerd
    runs-on: ubuntu-latest
    steps:
    - name: executing remote ssh commands using password
      # appleboy/ssh-action@master is een open-source pakket 
      # dat zich via ssh aanmeldt bij een server en het script uitvoert
      uses: appleboy/ssh-action@master
      # Dit zijn over het algemeen de variabelen die het pakket nodig heeft 
      # om in te loggen op de server en het script uit te voeren
      with:
       # De geheimen zijn de variabelen van 
       # https://docs.github.com/en/actions/security-guides/encrypted-secrets

       # Uw host van de server opgeslagen in github-geheimen met dezelfde naam HOST
        host: ${{ secrets.HOST }} 
        # Uw gebruikersnaam van de server om in te loggen 
        # die is opgeslagen in github-geheimen met de naam USERNAME
        username: ${{ secrets.USERNAME }} 
        # Het wachtwoord van uw server om in te loggen 
        # dat is opgeslagen in github-geheimen met de naam PASSWORD        
        password: ${{ secrets.PASSWORD }} 
        # De poort van uw server om in te loggen 
        # die is opgeslagen in github-geheimen met de naam PORT
        port: ${{ secrets.PORT }}  
        # deploy-app.sh kan van alles zijn, zoals code ophalen van GitHub
        # en uw webserver of wachtrijen opnieuw starten, alles
        # Zorg ervoor dat u het repository hebt gekloond op uw server  
        # U kunt zoveel script uitvoeren als u wilt
        script: git pull origin {{ github.event.client_payload.branch 

Het handmatig uitvoeren van de workflow

Je hebt nu de GitHub Actions-workflow aangemaakt om via Slack aan te roepen. Maar op dit moment staat je code alleen op je lokale machine. Om de workflow te activeren, moet je de code naar GitHub pushen.

Het uitvoeren van de reeks commando’s hieronder vertelt git waar de code vandaan moet worden gepusht en getrokken, in dit voorbeeld, vanuit je externe GitHub-opslagplaats. Vervang in het git remote add origin-commando hieronder jegebruikersnaam en jerepository door je GitHub-gebruikersnaam en opslagplaats

# Open github.com en maak een opslagplaats
git init # Initialiseert git
git remote add origin https://github.com/yourusername/yourrepository.git
git add . # Voegt nieuw gemaakte bestanden toe aan git om te volgen
git commit -m "Created GitHub workflow file"
git push -u origin master

Laten we eerst testen of je code werkt. Roep je code handmatig aan met het populaire curl hulpprogramma.

Voer het onderstaande commando uit om een ​​postverzoek te doen naar je GitHub-opslagplaats https://github.com/username/repository/dispatches URL om GitHub te vertellen om een ​​Workflow-bestand deploy.yml te activeren dat je eerder hebt aangemaakt. Vervang gebruikersnaam door je werkelijke GitHub-gebruikersnaam en opslagplaats door je GitHub-opslagplaats.

Vervang $github_personal_token in de onderstaande code door je persoonlijke token.

# Maakt een postverzoek naar de url https://github.com/username/repository/dispatches
curl-X POST  https://github.com/username/repository/dispatches \
# Voegt een header toe voor het accepteren van het inhoudstype
-H 'Accept: application/vnd.github.everest-preview+json' \
# Voegt een header toe voor autorisatie
-H "Authorization: token $github_personal_token" \
# Voegt json-inhoud toe aan de body van het postverzoek, zodat je meerdere parameters kunt verzenden
# vanuit dit gegevensgedeelte en je verschillende acties kunt uitvoeren op basis van argumenten
--data '{"event_type": "deploy-service", "client_payload": {"environment": "'"$1"'", "ref": "'"$2"'"}}' #Je kunt de naam van de omgeving en ref doorgeven als een branche naam, zodat je weet op welke server je welke branche moet implementeren

Maak Slack Bot met Hubot

Aangezien je handmatig de GitHub Action Workflow kon triggeren, is dat een goed begin. Laten we nu proberen dezelfde handmatige stappen te automatiseren via Slack Bot. Je zult een Slack Bot maken die luistert naar jouw commando en de GitHub Action met argumenten triggert.

Je hebt twee opties om een Slack Bot te maken, ofwel vanaf nul of een vooraf gebouwd hubot-pakket voor slack-workspaces. In deze tutorial gebruik je een vooraf gebouwd Bot-pakket genaamd Hubot. Hubot is een open-source automatiseringstool die integreert met chatdiensten zoals Slack, Discord, Gitter, TeamSpeak, enz.

Het maken van een aangepaste bot zonder het gebruik van een app zoals Hubot kost veel tijd. Waarom? Omdat je alle installatieprocessen , het luisteren naar webhooks en het hosten van de bot zelf moet afhandelen. In deze tutorial zul je daarom de Hubot Slack app gebruiken om al die processen te vereenvoudigen.

Het installeren van Hubot met Npm

Aangezien je Hubot gebruikt om een Slack Bot te maken, laten we eerst Hubot downloaden en installeren op je lokale machine. Hubot zal de verbinding vormen tussen Slack en GitHub-acties.

1. Navigeer in je terminal (cd) naar je projectmap (~/Hubot).

cd ~/Hubot

2. Installeer het yo en generator-hubot pakket wereldwijd (-g) op je lokale machine met het onderstaande npm install commando. Het yo pakket helpt je bij het installeren van nieuwe projecten door projecten te genereren in elke taal (Web, Java, Python, C#, enz.). Het generator-hubot pakket gebruikt het yo pakket om alle afhankelijkheden samen met de initiële configuratie te installeren.

Nadat het is geïnstalleerd, kun je het yo commando overal uitvoeren, omdat het wereldwijd is geïnstalleerd.

npm install -g yo generator-hubot

3. Nu, maak een basis Hubot boilerplate met de volgende opdracht. Een boilerplate is een sectie code die op veel plaatsen is opgenomen. Zonder een boilerplate moet je altijd code vanaf het begin schrijven.

De onderstaande opdracht maakt een basis Hubot boilerplate aan in je projectdirectory. De Hubot boilerplate koppelt aan Slack (--adapter=slack), zodat de Bot berichten in het Slack-kanaal kan beluisteren en erop kan reageren. yo hubot --adapter=slack

yo hubot --adapter=slack

Hubot toevoegen aan je Slack Workspace

Nu Hubot is geïnstalleerd op je lokale machine, moet je Hubot configureren om met Slack te communiceren.

Laten we Hubot installeren in je Slack Workspace.

1. Open je webbrowser en ga naar de beheerinstellingen van je Slack met de URL, zoals https://workspacename.slack.com/admin/settings. Vervang workspacename door de daadwerkelijke naam van je Slack Workspace.

Klik op Configure apps aan de linkerkant, zoals hieronder weergegeven, zodat je kunt zoeken naar Hubot in de marktplaats. Slack heeft een marktplaats waar je vooraf gebouwde toepassingen kunt vinden.

Accessing Slack Admin Settings

2. Klik op de zoekbalk en typ hubot om naar Hubot te zoeken in de marktplaats en selecteer Hubot.

Klik nu op de knop Toevoegen aan Slack, zoals je hieronder ziet, om Hubot toe te voegen aan je Slack Workspace.

Searching Hubot and Adding it to Slack Workspace

3. Tenslotte, vul enkele algemene informatie in over je Bot, zoals de naam (deployerhubot) en het pictogram. Let op de API Token omdat je deze later zult gebruiken in Hubot Deployer om de Bot te activeren vanuit je eerder gemaakte Hubot-project.

Setting up Bot Information and Taking Note of the API Token

Testen van de integratie van GitHub Actions Workflow met Slack

Je hebt nu Hubot geïnstalleerd op je Slack Workspace, dus laten we de bot testen door te luisteren en berichten te verzenden naar het kanaal. Maar eerst moet je de Bot activeren.

1. Voer de onderstaande opdracht uit in de hoofdmap van het project om de Bot voor Slack te activeren (--adapter slack) vanuit je Hubot repo (./bin/hubot). Zorg ervoor dat je de $token vervangt door de API-token die je eerder hebt genoteerd

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

2. Voer de onderstaande opdracht uit om de Bot (botgebruikersnaam) uit te nodigen (/invite) naar je Slack-kanaal. Vervang botgebruikersnaam door de naam van de Bot die je hebt geregistreerd in stap drie van de sectie “Hubot toevoegen aan je Slack Workspace”.

/invite deployerhubot

Noem nu een Bot met een tekst in Slack, zoals @deployerhubot ping, om te testen of de integratie werkt. Als de Bot antwoordt met PONG, zoals hieronder wordt getoond, dan ben je klaar.

Testing Hubot and Slack Integration

Als de Bot niet reageert, ga dan naar je GitHub repository in je webbrowser en klik op het Actions-tabblad. Je kunt zien welke workflow is mislukt omdat het een rond rood vinkje heeft. Klik op de mislukte workflow om te zien wat de fout heeft veroorzaakt en los het op.

Viewing Failed Workflows

Hieronder zie je dat het probleem ligt bij het uitvoeren van externe SSH-commando’s met een wachtwoord. Nadat je het workflow hebt opgelost, ga terug naar stap 3 en controleer of de Bot reageert met PONG.

Navigating to GitHub repository to fix failed workflow

Het starten van een GitHub Actions-workflow vanuit Slack

Nu je je Slack Bot hebt geactiveerd, is het tijd om een GitHub Actions-workflow vanuit Slack te starten!

Je hebt de flexibiliteit nodig om de opgegeven branch naar een opgegeven server te implementeren, zoals het ophalen van de code van de opgegeven branch. Je leert de Bot om automatisch te reageren wanneer iemand ***@*bot deploy API feature-x naar productie typt op een Slack-kanaal. Je kunt de omgevingsnaam valideren waarin mensen later alleen bepaalde omgevingen en branches kunnen implementeren.

Om de reacties van de Bot te automatiseren:

1. Maak een map met de naam ~/Hubot/scripts. De ~/Hubot/scripts-map is waar je een script opslaat dat je GitHub-workflow activeert.

2. Maak in je code-editor een bestand met de naam bot.js binnen de map ~/Hubot/scripts. Kopieer nu de onderstaande code en plak deze in het bestand bot.js.

De onderstaande code stelt de Bot in staat om naar chatberichten op het Slack-kanaal te luisteren en activeert vervolgens de workflow om een reactie naar het Slack-kanaal te sturen.

const validServices = ['api','app'];
const validEnvironments = ['production'];
robot.hear (`@${process.env.BOT_ID}`,async (bot) => {
    // De bot is alleen geïnteresseerd in het beluisteren van berichten 
    // zoals @deploy api featurex naar productie 
    // Het instellen van herbruikbare variabelen
	  const payload = bot.message.text.split(" ")
    const service = payload[2];
    const branch = payload[3];
    const environment = payload[5];
    const username = bot.message.user.name;
    // Gebruiker informeren dat we bezig zijn met verwerken
    bot.send(`Roger that! Please wait.`);
// Valideren of de gebruikte opdracht geldig is of niet 
// Omdat de gebruiker ook ongeldige opdrachten kan gebruiken 
if(!validateCommand(bot,username,service,branch,environment)) {
      return;
    }
    // Als de opdracht geldig lijkt, activeer dan een workflow
    await triggerWorkflow(bot,username,service,environment,branch)
    
    // Gebruiker informeren dat de workflow succesvol is gestart
    bot.send(`Github Action has been triggered successfully`);
  })
  const validateCommand = (bot,username,service,branch,environment) => {
    // Beperk de services, omdat gebruikers services kunnen gebruiken die niet zijn vermeld 
    // Die zal proberen een workflow te starten en een foutmelding krijgt
    if(!validServices.includes(service)) {
       bot.send(`${service} is not availble, Only ${validServices.join(', ')} are available`);
      return false;
      }
      // Beperk de omgeving, omdat gebruikers een ongeldige lijst met omgevingen kunnen gebruiken
      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 {
      // Dit is dezelfde handmatige workflow-triggercode omgezet 
      // van curl naar daadwerkelijke javascript post-aanvraag
      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. Tenslotte, stuur het @botgebruikersnaam implementeren api staging naar dev-bericht in Slack, en je zult een vergelijkbare reactie zien, zoals hieronder getoond.

Workflow-bestanden kunnen worden geactiveerd bij verschillende GitHub-evenementen, zoals code pushen naar een bepaalde branch, tags maken, pull-aanvragen maken, URL’s aanvragen en nog veel meer.

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

Conclusie

Tijdens deze tutorial heb je geleerd over GitHub Workflow, van het handmatig activeren van Slack-reacties met codes tot het bouwen van een chatbot. Je hebt ook geleerd dat het hebben van een chatbot in Slack je in staat stelt taken te automatiseren door GitHub-acties workflow aan te roepen.

Zal je deze nieuwe kennis naar een hoger niveau tillen, misschien door een Herinneringsbot toe te voegen of interactieve berichten te maken?

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