Git 28
🔀 Git & GitHub · Modulo 5 · Lezione 28
CD: deploy automatico 🚀
GitHub Pages · Deploy automatico dopo il merge · Da commit a sito online in un minuto
🚀 CI verifica che il codice funziona. CD lo mette online. Con GitHub Pages + GitHub Actions, il tuo sito si pubblica automaticamente ogni volta che fai merge in main. Niente upload manuale via FTP, niente “ho dimenticato di aggiornare il server”. Pusha il codice → il sito è online. Questo è il Continuous Deployment nella sua forma più pura.
🎯 Obiettivi della lezione
- Capire cos’è GitHub Pages e come funziona
- Configurare GitHub Pages per il tuo repository
- Creare un workflow di deploy automatico con GitHub Actions
- Combinare CI (test) e CD (deploy) in un’unica pipeline
- Capire il flusso completo: push → test → deploy → sito online
📖 1. Teoria
1.1 — Cos’è GitHub Pages
GitHub Pages è un servizio gratuito di hosting integrato in GitHub. Trasforma un repository in un sito web pubblico accessibile a un URL del tipo tuousername.github.io/nome-repo. Perfetto per siti statici: HTML, CSS, JavaScript.
1.2 — Due modi per configurare Pages
1.3 — Configurare Pages con GitHub Actions
1.4 — Il workflow di deploy per un sito HTML statico
name: Deploy su GitHub Pages
on:
push:
branches: [main]
# Permessi necessari per il deploy su Pages
permissions:
contents: read
pages: write
id-token: write
# Un solo deploy alla volta
concurrency:
group: “pages”
cancel-in-progress: false
jobs:
deploy:
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
– name: Checkout
uses: actions/checkout@v4
– name: Configura Pages
uses: actions/configure-pages@v5
– name: Carica artefatto
uses: actions/upload-pages-artifact@v3
with:
path: “.” ← pubblica tutta la cartella
– name: Deploy su GitHub Pages
id: deployment
uses: actions/deploy-pages@v4
| Chiave | Cosa fa |
|---|---|
| permissions | Concede al workflow i permessi per scrivere su Pages. Senza, il deploy fallisce con “403 Forbidden”. |
| concurrency | Se un deploy è in corso e ne arriva un altro, il secondo aspetta. Evita conflitti. |
| environment | Collega il job all’ambiente “github-pages” — GitHub mostra l’URL nella tab Deployments. |
| configure-pages | Prepara l’ambiente Pages sul runner. |
| upload-pages-artifact | Impacchetta i file da pubblicare. path: "." = tutta la cartella del repo. |
| deploy-pages | Pubblica l’artefatto su GitHub Pages. Il sito è online. |
📌 Se il tuo progetto ha una cartella dist/ o build/ (perché usi un framework con passo di build), cambia path: "." con path: "dist" (o "build"). Se il progetto è HTML/CSS/JS senza build, path: "." pubblica tutto.
1.5 — La pipeline completa: CI + CD
Il vero potere emerge quando combini test e deploy in un’unica pipeline: prima verifica che il codice funzioni (CI), poi lo pubblica (CD). Se i test falliscono, il deploy non parte.
❌ fallito → stop
✅ passato → continua
(solo se test passati)
/nome-repo
name: CI/CD
on:
push:
branches: [main]
permissions:
contents: read
pages: write
id-token: write
concurrency:
group: “pages”
cancel-in-progress: false
jobs:
# === JOB 1: TEST (CI) ===
test:
runs-on: ubuntu-latest
steps:
– uses: actions/checkout@v4
– name: Verifica file essenziali
run: |
for file in index.html style.css; do
test -f “$file” && echo “✅ $file” || (echo “❌ $file mancante” && exit 1)
done
– name: Verifica HTML
run: |
for f in $(find . -name “*.html”); do
grep -qi “doctype” “$f” && echo “✅ $f” || (echo “❌ $f senza DOCTYPE” && exit 1)
done
# === JOB 2: DEPLOY (CD) — solo se test passati ===
deploy:
needs: test
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
– uses: actions/checkout@v4
– uses: actions/configure-pages@v5
– uses: actions/upload-pages-artifact@v3
with:
path: “.”
– name: Deploy
id: deployment
uses: actions/deploy-pages@v4
📌 Il trucco è needs: test. Il job deploy aspetta che test finisca con successo. Se test fallisce, deploy non parte — il sito non viene aggiornato con codice rotto.
1.6 — Verificare il deploy
💻 2. Esempi guidati
Esempio A — Deploy di un sito HTML in 5 minuti
$ cat index.html
<!DOCTYPE html>
<html lang=”it”>
<head><title>Il mio sito</title><link rel=”stylesheet” href=”style.css”></head>
<body><h1>Ciao mondo!</h1></body>
</html>
# 2. Configura Pages su GitHub
# Settings → Pages → Source: “GitHub Actions”
# 3. Crea il workflow di deploy
$ mkdir -p .github/workflows
# Copia il contenuto della sezione 1.4 in .github/workflows/deploy.yml
# 4. Committa e pusha
$ git add . && git commit -m “Aggiungo deploy automatico su Pages”
$ git push
# 5. Aspetta ~1 minuto → vai su Actions → job verde
# 6. Apri https://tuousername.github.io/nome-repo/
# 🎉 Il sito è online!
Esempio B — Aggiornare il sito: il deploy continuo
index.html in locale (es. cambia il testo dell’h1).git add . && git commit -m "Aggiornato titolo" && git pushEsempio C — Pubblicare solo una sottocartella
📁 progetto/
├── 📁 public/ ← questa va pubblicata
│ ├── index.html
│ └── style.css
├── 📁 src/ ← codice sorgente (non pubblicare)
├── 📁 test/ ← test (non pubblicare)
└── README.md
# Nel workflow, cambia path:
– uses: actions/upload-pages-artifact@v3
with:
path: “public” ← pubblica solo public/
🏋️ 3. Esercizi
🟢 Esercizio 1 — Il tuo primo deploy (Facile)
index.html nel repository.b) Configura Pages: Settings → Pages → Source: “GitHub Actions”.
c) Crea il file
.github/workflows/deploy.yml con il contenuto della sezione 1.4.d) Committa e pusha. Vai sulla tab Actions: il workflow è verde?
e) Apri
https://tuousername.github.io/nome-repo/ — il sito è online?f) Modifica index.html, committa e pusha. Il sito si aggiorna in ~1 minuto?
🔵 Esercizio 2 — Pipeline CI + CD (Medio)
b) Pusha su main: entrambi i job (test e deploy) passano?
c) Rinomina
style.css in styles.css. Committa e pusha. Cosa succede?d) Il job test fallisce? Il job deploy parte lo stesso? (Non deve partire —
needs: test.)e) Il sito è rimasto con la versione precedente (funzionante)?
f) Correggi, pusha, verifica che tutto torni verde e il sito si aggiorni.
🟠 Esercizio 3 — Deploy con sottocartella (Medio)
public/ e sposta i file HTML e CSS lì dentro.b) Modifica il workflow: cambia
path: "." in path: "public".c) Committa e pusha. Il sito mostra i file dalla cartella public?
d) Verifica: file come README.md o test.sh non sono visibili sul sito (non sono in public/).
🟣 Esercizio 4 — Pipeline CI/CD completa per il progetto di classe (Difficile)
a) Job 1 — test-struttura: verifica file essenziali, DOCTYPE, no credenziali.
b) Job 2 — test-codice: se il progetto ha JavaScript, esegui i test con Node.js.
c) Job 3 — deploy:
needs: [test-struttura, test-codice]. Pubblica su Pages.d) Trigger: solo
push su main. Le PR attivano solo i test (non il deploy).e) Aggiungi un job separato che si attiva su
pull_request con solo i test (senza deploy).f) Testa la pipeline: apri una PR con un bug → test falliscono → merge bloccato. Correggi → merge → deploy automatico → sito aggiornato.
❓ 4. Quiz di verifica
1. Cos’è GitHub Pages?
Mostra risposta
Un servizio di hosting gratuito integrato in GitHub che trasforma un repository in un sito web pubblico. Il sito è accessibile a https://tuousername.github.io/nome-repo/. Supporta solo siti statici (HTML, CSS, JavaScript) — non applicazioni server-side. Include HTTPS automatico (certificato SSL gratuito) e si aggiorna automaticamente quando il codice cambia. È perfetto per portfolio, documentazione, landing page e progetti scolastici.
2. Qual è la differenza tra “Deploy from a branch” e “GitHub Actions” come source di Pages?
Mostra risposta
“Deploy from a branch” pubblica direttamente i file di un branch (es. main) così come sono — semplice ma non puoi fare test prima del deploy, né passi di build. “GitHub Actions” usa un workflow per costruire e pubblicare il sito — hai pieno controllo: puoi testare, fare build, trasformare file, e il deploy avviene solo se i test passano. Il metodo con Actions è consigliato per i progetti reali perché permette di combinare CI e CD in un’unica pipeline.
3. A cosa serve il blocco permissions nel workflow di deploy?
Mostra risposta
Concede al workflow i permessi necessari per scrivere su GitHub Pages. I 3 permessi sono: contents: read (leggere il codice del repo), pages: write (scrivere su Pages), e id-token: write (autenticazione per il deploy). Senza questi permessi, il deploy fallisce con un errore “403 Forbidden”. Sono necessari perché GitHub Actions ha un modello di sicurezza restrittivo: i workflow non hanno permessi di default e devi dichiararli esplicitamente.
4. Come impedisci che un deploy pubblichi codice rotto?
Mostra risposta
Con needs: test nel job di deploy. Crei due job nel workflow: il primo (test) esegue i test automatici, il secondo (deploy) ha needs: test che lo fa partire solo se test ha successo. Se i test falliscono, il deploy non parte — il sito resta con la versione precedente funzionante. Per le PR, combinare questo con “Require status checks to pass” nelle branch protection rules impedisce anche il merge di codice che non passa i test.
5. Come pubblichi solo una sottocartella del repository (es. public/)?
Mostra risposta
Nello step upload-pages-artifact, cambi il parametro path da "." (tutta la cartella) a "public" (solo la sottocartella). Solo i file in quella cartella verranno pubblicati sul sito. Questo è utile quando il repository contiene sia il codice sorgente (src/, test/) che i file da pubblicare (public/dist/) — non vuoi che test e script siano visibili nel sito. Nei progetti con framework (React, Vue), la build produce una cartella dist/ o build/ che è quella da pubblicare.
6. Dopo il push, quanto tempo ci vuole perché il sito si aggiorni?
Mostra risposta
Tipicamente 1-3 minuti. Il tempo include: l’avvio del runner (~15-30 secondi), l’esecuzione degli step (checkout, eventuale build, upload artefatto, deploy), e la propagazione del deploy. Puoi seguire il progresso in tempo reale nella tab Actions. Se il workflow include anche test, il tempo dipende dalla durata dei test. Una volta che il job deploy è verde, il sito è aggiornato. In rari casi, potresti dover fare un hard refresh nel browser (Ctrl+Shift+R) per vedere le modifiche a causa della cache del browser.
📚 Riepilogo della lezione
- GitHub Pages = hosting gratuito per siti statici, URL:
tuousername.github.io/repo - Configurazione: Settings → Pages → Source: “GitHub Actions”
- 4 actions del deploy:
configure-pages→upload-pages-artifact→deploy-pages - permissions:
contents: read+pages: write+id-token: write - Pipeline CI/CD: test (needs) → deploy — se test fallisce, deploy non parte
- Sottocartella: cambia
path: "."inpath: "public"per pubblicare solo una cartella - Deploy continuo: push → test → deploy → sito online in ~1 minuto
Prossima lezione →
Lezione 29 — Linting e quality check
Controllare la qualità del codice automaticamente. ESLint, HTMLHint, Stylelint.
Integrare i linter nel workflow CI.
Corso Git & GitHub · Per studenti e insegnanti · Lezione 28 di 45