ChatOps con GitHub

di Matteo Tumiati, in DevOps,

Anche se non è un tema nuovo, poichè le sue origini risalgono circa al 2013, ChatOps è una nuova metodologia che sta emergendo sempre di più per facilitare il lavoro delle persone che si interfacciano con la tecnologia. Consente, in breve, di utilizzare i messaggi per comunicare in modo automatico con una persona, che può essere il developer di un team, piuttosto che il manager. In base al livello di automation che abbiamo previsto, potrebbe addirittura rimpiazzare quasi del tutto le email.

Vediamone un esempio concreto. Assumiamo di aver creato una pull request, in cui siamo andati a cambiare dei file di Terraform. Questo implica che l'infrastruttura potrebbe variare di costo, pertanto potrebbe essere utile chiedere, in un messaggio nella issue aperta in GitHub, quali sono i costi attualmente sostenuti e previsti per il mese corrente prima di approvare la change e metterla in produzione.

Il tutto parte dal trigger, che deve essere relativo ad un evento su un commento, il cui body è qualcosa che possiamo intercettare ed elaborare in modo preciso.

name: (ChatOps) Cost estimation

on: 
  issue_comment:    
    types: [created] 

jobs:
  cost-estimation:
    runs-on: ubuntu-latest
    if: contains(github.event.comment.body, 'What are the costs for this month?')

In questo esempio siamo stati molto stringenti, ma è normale che con il linguaggio che usiamo tutti i giorni potrebbero esserci diverse variazioni a questo. Al momento questo check ci serve solo per capire se il workflow deve poter girare oppure no, perchè commenti nelle issue potrebbero essercene decine o centinaia al giorno, per cui vogliamo filtrare l'esecuzione il prima possibile, ma è altrettanto efficace integrare LUIS (language understanding) per impostare diverse frasi.

A questo punto è consigliabile rispondere immediatamente con un messaggio temporaneo, che indica che stiamo processando i costi. Infatti, il workflow potrebbe metterci diversi minuti per l'esecuzione, ma non vogliamo dare l'impressione agli utenti che non siamo responsivi.

steps:
- name: Create placeholder comment
  uses: peter-evans/create-or-update-comment@v2
  with:
    issue-number: ${{ github.event.issue.number }}
    body: |
      The costs are being calculated... hold on :money_with_wings:

A questo punto usiamo la nostra logica per connetterci ad Azure e calcolare i costi e, infine, postiamo un messaggio riassuntivo sempre nella issue di riferimento.

- name: Azure login
  uses: Azure/login@v1
  with:
    creds: ${{ secrets.AZURE_CREDENTIALS }}
    
- name: Get spending
  shell: pwsh
  run: |
    $fileSummaryPath = "${{ github.workspace }}/summary.md"
    "The actual costs are circa $actual ¤." >> $fileSummaryPath
    "The expected costs for the given month are $estimatedCosts ¤. $spendingEmoji" >> $fileSummaryPath

- name: Prepare summary for reporting
  id: get-comment-body
  run: |
    body="$(cat ${{ github.workspace }}/summary.md)"
    body="${body//'%'/'%25'}"
    body="${body//$'\n'/'%0A'}"
    body="${body//$'\r'/'%0D'}" 
    echo "::set-output name=body::$body"

- name: Create comment
  uses: peter-evans/create-or-update-comment@v2
  with:
    issue-number: ${{ github.event.issue.number }}
    body: ${{ steps.get-comment-body.outputs.body }}

Il risultato finale sarà simile al seguente.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi