Al giorno d'oggi, quando parliamo di DevOps, non possiamo prescindere dall'affrontare il tema di Infrastructure As Code (IaC), in cui andiamo a definire l'infrastruttura come codice, in modo tale che sia versionata e gestita dal source control esattamente come il codice applicativo. Strumenti come Terraform, infatti, sono piuttosto diffusi, ma la loro governance diventa sempre più complessa al crescere dell'infrastruttura stessa.
Una azione che ci può venire comoda quando uniamo il mondo di Terraform con le GitHub Actions, è fare in modo di elencare le change che stiamo andando ad applicare, così che sia più facile, visivamente, capire qual è l'output di un plan senza dover necessariamente analizzare tutti i log del workflow. Supponiamo quindi di avere uno o più file Terraform e di dover fare il deploy in Azure dell'infrastruttura:
steps:
- uses: actions/checkout@v4
- run: terraform init
id: init
env:
ARM_CLIENT_ID: ${{ secrets.ARM_CLIENT_ID }}
ARM_CLIENT_SECRET: ${{ secrets.ARM_CLIENT_SECRET }}
ARM_TENANT_ID: ${{ secrets.ARM_TENANT_ID }}
ARM_SUBSCRIPTION_ID: ${{ secrets.ARM_SUBSCRIPTION_ID }}
- run: terraform fmt -check
- run: terraform validate -no-color
- name: Terraform Plan
id: plan
env:
ARM_CLIENT_ID: ${{ secrets.ARM_CLIENT_ID }}
ARM_CLIENT_SECRET: ${{ secrets.ARM_CLIENT_SECRET }}
ARM_TENANT_ID: ${{ secrets.ARM_TENANT_ID }}
ARM_SUBSCRIPTION_ID: ${{ secrets.ARM_SUBSCRIPTION_ID }}
run: terraform plan -no-colorIn questi primi passaggi, eseguiamo solo il clone del codice sorgente in locale e, quindi, lanciamo i comandi base di terraform per generare il piano delle modifiche che andrà ad applicare all'infrastruttura su Azure. In questo caso, non c'è una grande variazione rispetto a ciò che faremo localmente, se non che il workflow potrà essere condiviso da tutta l'organizzazione.
L'output del plan, però, rimane nascosto (a meno di utilizzare altri strumenti come Terraform Cloud o altri) all'interno del workflow, mentre sarebbe decisamente più comodo averlo disponibile su una issue o sulla pull request che ha triggerato il workflow. Per questo, è sufficiente aggiungere uno step che legge l'output dello step che ha eseguito il plan e mandarlo come risposta:
- name: Add Plan Comment
uses: actions/github-script@v7
env:
PLAN: "terraform\n${{ steps.plan.outputs.stdout }}"
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
script: |
const output = `#### Terraform plan ??\`${{ steps.init.outcome }}\`
#### Terraform Plan 📖\`${{ steps.plan.outcome }}\`
Show Output
\`\`\`${process.env.PLAN}\`\`\`
*Pusher: @${{ github.actor }}, Action: \`${{ github.event_name }}\`, Workflow: \`${{ github.workflow }}\`*`;
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: output
})
Con un po' di manipolazione si possono far vedere solamente le diff in markdown, piuttosto che operazioni più complesse, a nostro gusto.
L'output generato sarà simile al seguente:

Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
Keynote .NET Conference Italia 2025
Blue/Green Release in locale con .NET Aspire
Integrare il Docker Model Runner in un workflow di GitHub
Creare una cache temporanea in JavaScript
Gestione dei codeowners in GitHub
Cambiamenti in OpenAPI per la documentazione di ASP.NET
Centralizzare gli endpoint AI Foundry con Azure API Management
Cache temporanea in Javascript con oggetti
Definire il colore di una scrollbar HTML tramite CSS
Self-healing degli unit test con Copilot in GitHub
Utilizzare zizmor per rendere più sicuri i workflow di GitHub
DevSecOps per .NET: dalla teoria alla pratica


