Basi delle Pipeline
Come Funzionano le Pipeline
PipelineContenitore principale; uno per commit/trigger
StageGruppo di job che girano in parallelo
JobTask singolo (script) all'interno di uno stage
RunnerAgente che esegue i job
Attivare le Pipeline
Push su branchAutomatico (default)
Merge requestVia workflow:rules o only: merge_requests
PianificazioneCI/CD → Pianificazioni nelle impostazioni del progetto
APIPOST /projects/:id/trigger/pipeline
ManualePulsante Esegui Pipeline nel menu CI/CD
.gitlab-ci.yml
Configurazione Minimale
stages: [build, test, deploy] build-job: stage: build script: echo "Compilazione..."
Keyword Globali
stagesDefinisce l'ordine degli stage
defaultValori predefiniti per tutti i job
variablesVariabili CI/CD globali
workflowControlla quando le pipeline vengono create
includeImporta file YAML esterni
Include Template
include: - template: Auto-DevOps.gitlab-ci.yml - local: .ci/lint.yml - project: 'group/shared-ci' file: '/templates/deploy.yml'
Job
Definizione Job
test-unit: stage: test image: node:20 script: - npm ci - npm test
Keyword Job
scriptComandi shell da eseguire (obbligatorio)
before_scriptComandi prima dello script principale
after_scriptComandi dopo (anche in caso di fallimento)
imageImmagine Docker per il job
rulesCondizioni per l'inclusione del job
needsDipendenze DAG (salta l'ordine degli stage)
allow_failureLa pipeline continua anche se il job fallisce
retryNumero di tentativi automatici (0-2)
timeoutDurata massima del job
Regole
deploy: rules: - if: '$CI_COMMIT_BRANCH == "main"' when: manual - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' when: never - when: on_success
Stage
Ordine degli Stage
stages: - lint - build - test - deploy
Stage Predefiniti
.preSempre eseguito per primo
buildStage predefinito 1
testStage predefinito 2
deployStage predefinito 3
.postSempre eseguito per ultimo
DAG con needs
test-api: stage: test needs: ["build-api"] # salta l'attesa dello stage completo test-web: stage: test needs: ["build-web"] # esegue appena build-web è pronto
Variabili
Definire Variabili
variables: NODE_ENV: "production" DB_HOST: "postgres" job: variables: NODE_ENV: "test" # override a livello job
Variabili Predefinite
CI_COMMIT_SHAHash completo del commit
CI_COMMIT_BRANCHNome del branch
CI_COMMIT_TAGNome del tag (se pipeline tag)
CI_PIPELINE_IDID univoco della pipeline
CI_PROJECT_DIRPercorso checkout del repo
CI_MERGE_REQUEST_IIDNumero MR (solo pipeline MR)
CI_REGISTRY_IMAGEPercorso immagine container registry
Protette e Mascherate
ProtettaDisponibile solo su branch/tag protetti
MascherataNascosta nei log del job
FileScritta su file temporaneo; percorso nella variabile
Artifact
Salvare Artifact
build: script: npm run build artifacts: paths: [dist/] expire_in: 1 week
Tipi di Artifact
pathsFile/directory da memorizzare
excludePattern da escludere
expire_inEliminazione automatica dopo la durata
reports:junitXML JUnit per il riepilogo test nella MR
reports:coverage_reportVisualizzazione copertura Cobertura
Report JUnit
test: script: pytest --junitxml=report.xml artifacts: reports: junit: report.xml
Cache
Cache delle Dipendenze
test: cache: key: ${CI_COMMIT_REF_SLUG} paths: [node_modules/] script: npm ci && npm test
Cache vs Artifact
CacheVelocizza i job; non garantita; riuso della stessa chiave
ArtifactPassa file tra job/stage; garantita
Policy Cache
pull-pushScarica + carica (default)
pullSolo scarica (più veloce per i consumatori)
pushSolo carica (per i produttori)
Ambienti
Definire Ambienti
deploy-staging: stage: deploy environment: name: staging url: https://staging.example.com script: ./deploy.sh staging
Funzionalità Ambiente
nameNome ambiente (mostrato nell'interfaccia)
urlLink all'app deployata
on_stopJob da eseguire quando l'ambiente viene fermato
auto_stop_inFermata automatica dopo la durata
action: stopMarca il job come azione di stop
Review App
review: environment: name: review/$CI_COMMIT_REF_SLUG url: https://$CI_COMMIT_REF_SLUG.example.com on_stop: stop-review auto_stop_in: 1 week
Docker
Build e Push Immagine
build-image: image: docker:24 services: [docker:24-dind] script: - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA . - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHA
Servizi (Container Sidecar)
test: image: python:3.12 services: - postgres:16 - redis:7 variables: POSTGRES_DB: testdb POSTGRES_PASSWORD: secret
Docker-in-Docker
docker:24-dindImmagine servizio DinD
DOCKER_TLS_CERTDIRImpostare su '/certs' o '' per config TLS
DOCKER_HOSTtcp://docker:2376 (TLS) o :2375
Pattern Comuni
Monorepo (changes)
test-api: rules: - changes: [api/**/*] test-web: rules: - changes: [web/**/*]
Gate Deploy Manuale
deploy-prod: stage: deploy when: manual rules: - if: '$CI_COMMIT_BRANCH == "main"'
Matrix Parallela
test: parallel: matrix: - PYTHON: ["3.10", "3.11", "3.12"] DB: ["postgres", "sqlite"] script: tox -e py${PYTHON}-${DB}