Basi del Workflow
Workflow Minimale
# .github/workflows/ci.yml name: CI on: push jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - run: echo "Hello from CI"
Concetti Chiave
WorkflowFile YAML in .github/workflows/ che definisce l'automazione
EventTrigger che avvia un workflow (push, PR, pianificazione, ecc.)
JobSet di step che girano sullo stesso runner
StepTask individuale — esegue un comando o usa un'action
RunnerVM che esegue i job (ubuntu-latest, macos-latest, windows-latest)
ActionUnità di codice riutilizzabile referenziata con uses:
Trigger
Eventi Comuni
on: push: branches: [main] pull_request: branches: [main] schedule: - cron: "0 6 * * 1" # ogni lunedì alle 6 AM UTC workflow_dispatch: # trigger manuale
Filtri Evento
branches:Trigger solo per branch specifici
paths:Trigger solo quando i file corrispondenti cambiano
tags:Trigger su push di tag (v*)
types: [opened, synchronize]Filtra tipi di attività PR
branches-ignore:Esclude branch specifici
paths-ignore:Esclude percorsi file specifici
Job e Step
Configurazione Job
jobs: test: runs-on: ubuntu-latest needs: build # dipende dal job build if: github.ref == 'refs/heads/main' timeout-minutes: 10 steps: - uses: actions/checkout@v4 - run: npm test
Tipi di Step
run:Esegue un comando shell
uses:Usa un'action pubblicata
with:Passa input a un'action
name:Nome visualizzato nell'interfaccia
id:Riferimento output step via steps..outputs
if:Esecuzione condizionale
continue-on-error: trueNon fallire il job se lo step fallisce
Action
Usare le Action
steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: node-version: 20 - uses: ./.github/actions/my-action # action locale
Action Popolari
actions/checkout@v4Clona il codice del repository
actions/setup-node@v4Installa Node.js
actions/setup-python@v5Installa Python
actions/upload-artifact@v4Carica artifact di build
actions/download-artifact@v4Scarica artifact da un altro job
actions/cache@v4Mette in cache le dipendenze tra le esecuzioni
actions/github-script@v7Esegue JS con il client API GitHub
Variabili d'Ambiente
Impostare Variabili
env: # livello workflow NODE_ENV: production jobs: build: env: # livello job CI: true steps: - run: echo "$MY_VAR" env: # livello step MY_VAR: hello
Variabili Predefinite
github.shaSHA del commit che ha avviato il workflow
github.refRef del branch o tag (refs/heads/main)
github.repositoryNome owner/repo
github.actorUtente che ha avviato il workflow
github.event_nameEvento che ha avviato il workflow
runner.osOS del runner (Linux, macOS, Windows)
Segreti
Usare i Segreti
steps: - run: deploy --token "$TOKEN" env: TOKEN: ${{ secrets.DEPLOY_TOKEN }} - uses: some/action@v1 with: api-key: ${{ secrets.API_KEY }}
Regole Segreti
secrets.GITHUB_TOKENToken auto-generato con scope al repository
Settings → SecretsAggiungi segreti nelle impostazioni repo o org
MascheramentoI valori segreti vengono mascherati automaticamente nei log
Segreti ambienteCon scope a un ambiente di deployment
Segreti organizzazioneCondivisi tra i repo nell'organizzazione
Matrix Strategy
Build a Matrix
jobs: test: strategy: matrix: os: [ubuntu-latest, macos-latest] node: [18, 20] runs-on: ${{ matrix.os }} steps: - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node }}
Opzioni Matrix
matrix:Definisce combinazioni di variabili da espandere
include:Aggiunge combinazioni extra alla matrix
exclude:Rimuove combinazioni specifiche
fail-fast: falseContinua altri job se uno fallisce
max-parallel: 2Limita i job matrix concorrenti
Caching
Cache delle Dipendenze
- uses: actions/cache@v4 with: path: ~/.npm key: npm-${{ hashFiles('package-lock.json') }} restore-keys: npm-
Caching Integrato
- uses: actions/setup-node@v4 with: node-version: 20 cache: npm # cache automatica per npm/yarn/pnpm - uses: actions/setup-python@v5 with: python-version: "3.12" cache: pip # cache automatica per pip
Artifact
Upload e Download
- uses: actions/upload-artifact@v4 with: name: build-output path: dist/ retention-days: 7 - uses: actions/download-artifact@v4 with: name: build-output
Note sugli Artifact
retention-daysEliminazione automatica dopo N giorni (default 90)
pathFile o directory da caricare (supporta glob)
Cross-jobCarica in un job, scarica in un altro con needs:
compression-levelDa 0 (nessuna) a 9 (massima), default 6
Pattern Comuni
Deployment Condizionale
- name: Deploy in produzione if: github.ref == 'refs/heads/main' run: ./deploy.sh - name: Commenta PR if: github.event_name == 'pull_request' run: gh pr comment $PR --body "Build passed"
Espressioni Utili
success()True se tutti gli step precedenti sono passati
failure()True se uno step precedente è fallito
always()Esegui indipendentemente dallo stato (cleanup)
cancelled()True se il workflow è stato annullato
contains(github.ref, 'release')Controllo contiene stringa
startsWith(github.ref, 'refs/tags')Controllo prefisso stringa
hashFiles('**/lock*')SHA-256 dei file (per chiavi cache)