Git 25
π Git & GitHub Β· Modulo 5 Β· Lezione 25
Introduzione a GitHub Actions β‘
Cos’Γ¨ la CI/CD Β· Workflow automatici Β· Il tuo primo Action Β· Trigger, job e step
β‘ Finora hai fatto tutto manualmente: test, build, deploy. Da questa lezione, GitHub fa il lavoro per te. GitHub Actions Γ¨ un sistema di automazione integrato nel repository: ogni volta che succede qualcosa (push, PR, merge), GitHub esegue automaticamente i comandi che definisci β test, linting, build, deploy, notifiche. Γ la CI/CD (Continuous Integration / Continuous Delivery) senza uscire da GitHub.
π― Obiettivi della lezione
- Capire cos’Γ¨ la CI/CD e perchΓ© Γ¨ importante
- Conoscere i concetti base di GitHub Actions: workflow, trigger, job, step
- Creare il tuo primo workflow che si attiva a ogni push
- Leggere i log di esecuzione su GitHub
- Capire la struttura di un file YAML di workflow
- Conoscere il marketplace delle Actions
π 1. Teoria
1.1 β Cos’Γ¨ la CI/CD
2. “Funziona sul mio computer!” β
3. Merge in main
4. Il sito si rompe in produzione π₯
5. “Chi ha rotto main?!” π₯
6. 2 ore per trovare il bug
2. GitHub Actions esegue i test automaticamente
3. β Test fallito! La PR mostra il problema
4. Marco corregge prima del merge
5. β Test passati β merge sicuro
6. Main Γ¨ sempre funzionante
1.2 β I concetti base di GitHub Actions
| Concetto | Cos’Γ¨ | Analogia |
|---|---|---|
| Workflow | Un file YAML che definisce un’automazione completa | La “ricetta” β l’intero piano dall’inizio alla fine |
| Trigger (on) | L’evento che fa partire il workflow (push, PR, schedule…) | L'”interruttore” β quando si accende l’automazione |
| Job | Un gruppo di step che eseguono su una macchina virtuale | Un “reparto” della fabbrica β una macchina dedicata |
| Step | Un singolo comando o azione all’interno di un job | Un “passo” della ricetta β un’operazione singola |
| Action | Un componente riusabile creato dalla community (es. actions/checkout) |
Un “attrezzo” prefabbricato β non devi costruirlo tu |
| Runner | La macchina virtuale che esegue il job (fornita gratis da GitHub) | Il “computer in cloud” che fa il lavoro al posto tuo |
1.3 β Dove vivono i workflow
I workflow sono file YAML nella cartella .github/workflows/ del repository. Puoi avere quanti workflow vuoi β ogni file .yml Γ¨ un’automazione indipendente.
βββ π ISSUE_TEMPLATE/ (lezione 24)
βββ PULL_REQUEST_TEMPLATE.md (lezione 24)
βββ π workflows/ β NUOVO! I tuoi workflow vanno qui
βββ ci.yml β test automatici a ogni push
βββ deploy.yml β deploy automatico dopo merge
βββ lint.yml β controllo stile del codice
1.4 β Anatomia di un workflow YAML
name: CI β nome che appare nella tab Actions
on: β TRIGGER: quando si attiva
push:
branches: [main] β solo push su main
pull_request:
branches: [main] β o PR verso main
jobs: β JOB: cosa fare
test: β nome del job
runs-on: ubuntu-latest β la macchina virtuale (runner)
steps: β STEP: i passi del job
– name: Checkout codice
uses: actions/checkout@v4 β action della community
– name: Mostra i file
run: ls -la β comando shell
– name: Verifica che index.html esiste
run: test -f index.html β se il file non esiste, il job fallisce
| Chiave | Cosa significa |
|---|---|
| name | Il nome del workflow β appare nella tab Actions di GitHub |
| on | Il trigger: quale evento fa partire il workflow (push, pull_request, schedule…) |
| jobs | La lista dei job da eseguire. Ogni job ha un nome (es. test) e gira su una macchina separata |
| runs-on | Il sistema operativo del runner: ubuntu-latest, windows-latest, macos-latest |
| steps | I passi del job, eseguiti in ordine. Ogni step ha un name e un run (comando) o uses (action) |
| uses | Usa un’action predefinita (es. actions/checkout@v4 scarica il codice del repo nel runner) |
| run | Esegue un comando shell (es. npm test, python -m pytest, ls -la) |
1.5 β I trigger piΓΉ comuni
| Trigger | Quando si attiva | Caso d’uso |
|---|---|---|
| push | A ogni push sul branch specificato | Test e build dopo il merge |
| pull_request | Quando una PR viene aperta, aggiornata o riaperta | Test prima del merge β il risultato appare nella PR |
| schedule | A orari prestabiliti (cron syntax) | Backup giornaliero, report settimanale |
| workflow_dispatch | Manualmente, con un click dalla tab Actions | Deploy manuale, task una tantum |
| release | Quando viene pubblicata una nuova release | Build e distribuzione dei pacchetti |
1.6 β actions/checkout: l’action che userai sempre
Il runner (la macchina virtuale di GitHub) parte vuoto β non ha il tuo codice. Il primo step di quasi ogni workflow Γ¨ actions/checkout@v4, che scarica il codice del repository nel runner. Senza questo step, i comandi successivi non trovano nessun file.
steps:
– name: Checkout codice
uses: actions/checkout@v4 β scarica il repo nel runner
# Da questo punto in poi, i tuoi file sono disponibili
– name: Verifica
run: ls -la β ora vede index.html, style.css, ecc.
1.7 β Leggere i risultati: la tab Actions
Dopo il push, il workflow si attiva automaticamente. Puoi seguirne l’esecuzione nella tab “Actions” del repository.
π I risultati appaiono anche nelle PR! Se il workflow si attiva su pull_request, il risultato (β
o β) appare direttamente nella pagina della PR, nella sezione “Checks”. Combinato con le branch protection rules (Lezione 20), puoi bloccare il merge se i test falliscono β il pulsante Merge resta grigio finchΓ© tutti i check non sono verdi.
1.8 β Il Marketplace delle Actions
Non devi scrivere tutto da zero β la community ha creato migliaia di actions riusabili. Il GitHub Marketplace Γ¨ il catalogo dove trovarle. Le usi con uses: autore/nome-action@versione.
| Action | Cosa fa | Uso |
|---|---|---|
| actions/checkout@v4 | Scarica il codice del repo nel runner | Sempre β primo step di ogni workflow |
| actions/setup-node@v4 | Installa Node.js (versione a scelta) | Progetti JavaScript/TypeScript |
| actions/setup-python@v5 | Installa Python (versione a scelta) | Progetti Python |
| actions/upload-artifact@v4 | Salva file prodotti dal workflow (report, build) | Salvare output scaricabili |
π» 2. Esempi guidati
Esempio A β Il tuo primo workflow: “Hello GitHub Actions”
$ mkdir -p .github/workflows
# Crea il workflow
$ cat > .github/workflows/hello.yml <<‘EOF’
name: Hello Actions
on:
push:
branches: [main]
jobs:
saluta:
runs-on: ubuntu-latest
steps:
– name: Saluto
run: echo “Ciao! GitHub Actions funziona! π”
– name: Data e ora
run: date
– name: Info sistema
run: uname -a
EOF
$ git add .github/workflows/hello.yml
$ git commit -m “Aggiunto primo workflow GitHub Actions”
$ git push
# Vai su GitHub β tab Actions β vedi “Hello Actions” in esecuzione!
Esempio B β Workflow CI per un progetto web
name: CI β Verifica progetto web
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
verifica:
runs-on: ubuntu-latest
steps:
– name: Checkout codice
uses: actions/checkout@v4
– name: Verifica che i file essenziali esistono
run: |
echo “Verifico file essenziali…”
test -f index.html || (echo “β index.html mancante!” && exit 1)
test -f style.css || (echo “β style.css mancante!” && exit 1)
test -f README.md || (echo “β README.md mancante!” && exit 1)
echo “β Tutti i file essenziali presenti!”
– name: Verifica HTML valido (base)
run: |
echo “Verifico tag HTML…”
grep -q “<html” index.html || (echo “β Tag html mancante!” && exit 1)
grep -q “</html>” index.html || (echo “β Tag html non chiuso!” && exit 1)
echo “β Struttura HTML base OK!”
– name: Conta le righe del progetto
run: |
echo “π Statistiche del progetto:”
echo “HTML: $(find . -name ‘*.html’ | xargs wc -l | tail -1) righe”
echo “CSS: $(find . -name ‘*.css’ | xargs wc -l | tail -1) righe”
echo “JS: $(find . -name ‘*.js’ | xargs wc -l | tail -1) righe”
π Il pipe | dopo run: permette di scrivere comandi su piΓΉ righe. Senza il pipe, puoi scrivere un solo comando per run:. Con il pipe, scrivi un intero script bash. Il exit 1 fa fallire lo step (e quindi il job) β Γ¨ il modo per segnalare un errore.
Esempio C β Workflow con attivazione manuale
name: Report progetto
on:
workflow_dispatch: β attivazione manuale!
jobs:
report:
runs-on: ubuntu-latest
steps:
– uses: actions/checkout@v4
– name: Genera report
run: |
echo “π Report del progetto β $(date)”
echo “File: $(find . -type f | wc -l)”
echo “Commit: $(git log –oneline | wc -l)”
echo “Branch: $(git branch -r | wc -l)”
echo “Ultimo commit: $(git log -1 –format=’%s (%an, %ar)’)”
workflow_dispatch aggiunge un pulsante “Run workflow” nella tab Actions. Utile per task che non devono partire automaticamente ma solo quando li avvii tu.ποΈ 3. Esercizi
π’ Esercizio 1 β Il tuo primo workflow (Facile)
.github/workflows/hello.yml.b) Committa e pusha.
c) Vai sulla tab Actions di GitHub. Vedi il workflow “Hello Actions” in esecuzione?
d) Clicca sul workflow β clicca sul job “saluta” β leggi i log di ogni step.
e) Il pallino Γ¨ verde (β )? Il messaggio “Ciao!” appare nei log?
π΅ Esercizio 2 β CI per progetto web (Medio)
.github/workflows/ci.yml usando l’Esempio B.b) Committa e pusha. Il workflow parte?
c) Se il tuo repository ha
index.html, style.css e README.md, il workflow dovrebbe passare (verde).d) Ora rinomina temporaneamente
style.css in styles.css, committa e pusha. Il workflow fallisce (rosso)?e) Leggi i log: quale step Γ¨ fallito? Cosa dice il messaggio di errore?
f) Correggi (rinomina indietro), committa e pusha. Torna verde?
π Esercizio 3 β CI sulla Pull Request (Medio)
pull_request.b) Crea un branch, fai una modifica, pusha, apri una PR.
c) Nella pagina della PR, scorri fino alla sezione “Checks”. Il workflow CI Γ¨ in esecuzione?
d) Se passa, vedi il pallino verde β . Se fallisce, vedi il rosso β.
e) Se hai le branch protection rules attive (Lezione 20), configura “Require status checks to pass” e seleziona il tuo workflow CI. Ora il merge Γ¨ bloccato se i test falliscono!
π£ Esercizio 4 β Scrivi un workflow personalizzato (Difficile)
check.yml che verifica il tuo progetto con almeno 5 controlli:a) Verifica che i file essenziali esistano (personalizzali per il tuo progetto).
b) Verifica che il README contenga il nome del progetto (usa
grep).c) Verifica che non ci siano file
.env nel repository (sicurezza!).d) Conta i file per tipo (HTML, CSS, JS) e stampa un riepilogo.
e) Verifica che il file
.gitignore esista e contenga node_modules.f) Il workflow deve attivarsi sia su push che su pull_request verso main.
g) Committa, pusha, verifica che funzioni. Poi fai fallire intenzionalmente un controllo e verifica che il workflow diventi rosso.
β 4. Quiz di verifica
1. Cos’Γ¨ la CI/CD e perchΓ© Γ¨ utile?
Mostra risposta
CI (Continuous Integration) = il codice viene automaticamente testato a ogni push o PR. Se i test falliscono, il team lo sa subito β il bug viene corretto prima del merge. CD (Continuous Delivery/Deployment) = dopo il merge, il codice viene automaticamente distribuito (pubblicato su un sito, rilasciato come app). Insieme eliminano i processi manuali e garantiscono che main sia sempre funzionante e aggiornato. Senza CI/CD, i bug si accumulano e vengono scoperti troppo tardi; con CI/CD, ogni modifica Γ¨ verificata immediatamente.
2. Qual Γ¨ la differenza tra un “job” e uno “step” in GitHub Actions?
Mostra risposta
Un job Γ¨ un gruppo di step che gira su una macchina virtuale dedicata (runner). Un step Γ¨ un singolo comando o azione all’interno del job. I job possono girare in parallelo (ciascuno sul proprio runner) o in sequenza. Gli step di un job girano sempre in sequenza sullo stesso runner. Un workflow puΓ² avere piΓΉ job (es. un job per i test, uno per il build); ogni job ha piΓΉ step (es. checkout, installazione, test).
3. A cosa serve actions/checkout@v4 e perchΓ© Γ¨ quasi sempre il primo step?
Mostra risposta
Scarica il codice del repository nel runner (la macchina virtuale). Il runner parte vuoto β non ha nessun file del tuo progetto. Senza actions/checkout, i comandi successivi (come npm test o test -f index.html) non troverebbero nessun file e fallirebbero. Γ il primo step perchΓ© tutti gli step successivi hanno bisogno dei file del progetto. L’unica eccezione sono step che non toccano il codice (es. inviare una notifica).
4. Qual Γ¨ la differenza tra uses e run in uno step?
Mostra risposta
uses esegue un’action predefinita creata dalla community o da GitHub β un componente riusabile con nome e versione (es. actions/checkout@v4). run esegue un comando shell diretto β qualsiasi comando che scriveresti nel terminale (es. npm test, ls -la, echo "hello"). In uno step usi o uses o run, mai entrambi. La scelta dipende da cosa devi fare: se esiste un’action per quel compito, usa uses; altrimenti scrivi il comando con run.
5. In quale cartella devono stare i file dei workflow?
Mostra risposta
In .github/workflows/ alla radice del repository. Ogni file .yml in questa cartella Γ¨ un workflow indipendente. Il nome del file non conta (puoi chiamarlo ci.yml, test.yml, deploy.yml β quello che preferisci). Il nome visualizzato nella tab Actions Γ¨ quello specificato dalla chiave name: nel file YAML, non il nome del file. Puoi avere quanti workflow vuoi β ogni file Γ¨ un’automazione separata con i propri trigger e job.
6. Il workflow fallisce. Come trovi il problema?
Mostra risposta
Vai nella tab Actions di GitHub β clicca sul workflow fallito (pallino rosso) β clicca sul job fallito β si aprono i log di ogni step. Lo step fallito ha un’icona rossa β espandilo per vedere l’output del comando e il messaggio di errore. L’errore ti dice cosa Γ¨ andato storto: file mancante, test fallito, comando non trovato. Correggi il problema in locale, committa, pusha β il workflow riparte automaticamente. Nelle PR, il risultato aggiornato appare nella sezione “Checks”.
π Riepilogo della lezione
- CI = test automatici a ogni push. CD = deploy automatico dopo il merge.
- Workflow = file YAML in
.github/workflows/ - Struttura: name β on (trigger) β jobs β steps
- Trigger comuni:
push,pull_request,workflow_dispatch(manuale) uses= action predefinita Β·run= comando shellactions/checkout@v4= primo step di ogni workflow (scarica il codice nel runner)- Risultati nella tab Actions e nella sezione Checks delle PR
run: |per comandi multi-riga Β·exit 1per far fallire- Il Marketplace ha migliaia di actions pronte all’uso
Prossima lezione β
Lezione 26 β Workflow YAML
Approfondimento sulla sintassi YAML. Job multipli e dipendenze.
Variabili d’ambiente. Matrici di test. Condizioni (if).
Corso Git & GitHub Β· Per studenti e insegnanti Β· Lezione 25 di 45