Creare Pipeline GitLab: Guida Semplice

GitLab CI/CD è un sistema integrato di Continuous Integration e Continuous Deployment che permette di automatizzare il ciclo di sviluppo software attraverso pipeline definite in codice. Questa guida fornisce una panoramica tecnica dei componenti fondamentali e un tutorial pratico per l’implementazione.

Introduzione

Architettura GitLab CI/CD

GitLab CI/CD implementa un modello di automazione basato su pipeline dichiarative definite tramite file YAML. Il sistema è composto da:

  • GitLab Server: Coordina l’esecuzione delle pipeline e gestisce il repository
  • GitLab Runners: Agenti di esecuzione che processano i job in ambienti isolati
  • Pipeline: Sequenze di stage contenenti job paralleli o sequenziali
  • Artifacts: Output persistenti dei job utilizzabili in fasi successive

Continuous Integration (CI)

L’integrazione continua automatizza la validazione del codice ad ogni commit attraverso:

  • Compilazione automatica del codice sorgente
  • Esecuzione di test suite (unit, integration, end-to-end)
  • Analisi statica del codice e controlli di sicurezza
  • Generazione di report di copertura e qualità

Continuous Deployment (CD)

Il deployment continuo gestisce la distribuzione automatica del software attraverso:

  • Build di artifact e container per deployment
  • Gestione di ambienti multipli (staging, production)
  • Strategie di deployment (blue-green, canary, rolling)
  • Monitoring post-deployment e rollback automatici

Componenti Tecnici del Sistema

Declarative Pipeline: Le pipeline sono definite come codice nel file .gitlab-ci.yml utilizzando sintassi YAML standard.

Container-based Execution: Ogni job viene eseguito in un container Docker isolato con immagini configurabili.

Parallel Execution: I job all’interno dello stesso stage vengono eseguiti in parallelo per ottimizzare i tempi.

Artifact Management: Sistema di storage temporaneo per condividere file e report tra job e stage differenti.

Variable Interpolation: Gestione di variabili d’ambiente, segreti e configurazioni attraverso un sistema di scope gerarchico.

Casi d’Uso Tipici

  • Build Automation: Compilazione di applicazioni multi-linguaggio (Node.js, Python, Java, Go)
  • Testing Pipeline: Esecuzione automatica di test suite con report di copertura
  • Quality Gates: Controlli automatici di code quality, security scanning, dependency checking
  • Multi-Environment Deployment: Gestione di deployment su staging e production
  • Infrastructure as Code: Provisioning automatico di infrastruttura cloud
  • Notification Systems: Integrazione con sistemi di alerting e comunicazione team

Requisiti Tecnici

Per implementare pipeline GitLab CI/CD sono necessari:

  • Repository GitLab: Progetto su GitLab.com o istanza self-hosted con permessi di scrittura
  • GitLab Runner: Executor disponibile (shared runner o dedicato)
  • Conoscenze YAML: Sintassi base per la definizione delle pipeline
  • Ambiente di sviluppo: Applicazione con build system configurato
  • Docker Knowledge: Comprensione base di container per l’esecuzione dei job

Teoria: Fondamenti della Pipeline Gitlab

Come Funziona il File .gitlab-ci.yml: La Base di Tutto

Il cuore di ogni pipeline GitLab CI/CD è il file .gitlab-ci.yml. Questo file, scritto in formato YAML, deve essere posizionato nella directory root del tuo repository e contiene tutte le istruzioni per automatizzare il tuo progetto.

Struttura Base del File .gitlab-ci.yml

Ecco la struttura fondamentale che ogni file .gitlab-ci.yml dovrebbe avere:

# Definizione degli stage (fasi) della pipeline
stages:
  - build
  - test
  - deploy

# Variabili globali
variables:
  NODE_VERSION: "18"
  
# Job di build
build_job:
  stage: build
  image: node:18
  script:
    - npm install
    - npm run build
  artifacts:
    paths:
      - dist/
    expire_in: 1 hour

# Job di test
test_job:
  stage: test
  image: node:18
  script:
    - npm install
    - npm run test
  coverage: '/Lines\s*:\s*(\d+\.\d+)%/'

# Job di deploy
deploy_job:
  stage: deploy
  script:
    - echo "Deploying to production"
    - # Comandi di deployment
  only:
    - main

Componenti Principali della Pipeline GitLab CI/CD

1. Stages (Fasi): L’Ordine di Esecuzione

Gli stages definiscono le fasi sequenziali della tua pipeline. Ogni stage viene eseguito dopo il completamento con successo del precedente.

stages:
  - validate    # Validazione del codice (linting, format check)
  - build      # Compilazione e creazione degli artifact
  - test       # Esecuzione dei test automatici
  - security   # Controlli di sicurezza e vulnerability scanning
  - deploy     # Deployment negli ambienti target

Come Funzionano gli Stages:

  • I job all’interno dello stesso stage vengono eseguiti in parallelo
  • Se un job fallisce, gli stage successivi non vengono eseguiti
  • È possibile personalizzare questo comportamento con allow_failure: true

2. Jobs: Le Singole Operazioni

I jobs sono le singole operazioni eseguite all’interno di ogni stage. Ogni job viene eseguito in un ambiente isolato (container Docker).

lint_code:
  stage: validate          # A quale stage appartiene
  image: node:18          # Immagine Docker da utilizzare
  before_script:          # Comandi da eseguire prima dello script principale
    - npm install
  script:                 # Comandi principali del job
    - npm run lint
    - npm run format:check
  after_script:           # Comandi da eseguire dopo lo script (sempre)
    - echo "Linting completed"
  allow_failure: false    # Il job deve avere successo per continuare

Elementi Chiave di un Job:

  • stage: Definisce in quale fase viene eseguito
  • image: Specifica l’ambiente di esecuzione (Docker image)
  • script: Contiene i comandi da eseguire
  • before_script/after_script: Comandi pre e post esecuzione

3. Variables: Parametrizzazione della Pipeline

Le variables permettono di parametrizzare la configurazione e riutilizzare valori in tutta la pipeline.

# Variabili globali (disponibili in tutti i job)
variables:
  DATABASE_URL: "postgres://user:pass@localhost/db"
  API_VERSION: "v1"
  NODE_ENV: "production"

# Variabili specifiche di un job
build_app:
  stage: build
  variables:
    BUILD_ENV: "staging"    # Disponibile solo in questo job
  script:
    - echo "Building for $BUILD_ENV environment"
    - echo "API Version: $API_VERSION"

Tipi di Variabili:

  • Variabili di progetto: Configurate nell’interfaccia GitLab
  • Variabili di gruppo: Ereditate da tutti i progetti del gruppo
  • Variabili predefinite: Fornite automaticamente da GitLab (es. $CI_COMMIT_SHA)
  • Variabili protette: Disponibili solo su branch/tag protetti

4. Artifacts: Condivisione di File tra Job

Gli artifacts sono file generati dai job che possono essere utilizzati in stage successivi o scaricati dall’interfaccia GitLab.

build_app:
  stage: build
  script:
    - npm run build        # Genera file nella cartella dist/
    - npm run test:unit    # Genera report di copertura
  artifacts:
    paths:
      - dist/             # Cartella con i file compilati
      - coverage/         # Report di copertura
    reports:
      coverage_report:
        coverage_format: cobertura
        path: coverage/cobertura-coverage.xml
    expire_in: 1 week     # Gli artifact vengono eliminati dopo 1 settimana
    when: on_success      # Salva solo se il job ha successo

# Job successivo che utilizza gli artifacts
deploy_app:
  stage: deploy
  dependencies:
    - build_app           # Specifica da quale job prendere gli artifacts
  script:
    - ls dist/            # I file di build_app sono disponibili
    - rsync -av dist/ /var/www/html/

Configurazioni Avanzate degli Artifacts:

  • expire_in: Durata di conservazione (es. 1 hour, 1 day, 1 week)
  • when: Quando salvare (on_success, on_failure, always)
  • reports: Integrazione con report specifici (copertura, test, sicurezza)

Come creare la tua prima pipeline

Tutorial Step-by-Step: Pipeline Semplice

Passo 1: Creare il File .gitlab-ci.yml

  1. Naviga nella root del tuo repository GitLab
  2. Crea un nuovo file chiamato .gitlab-ci.yml
  3. Inizia con questa configurazione base:
stages:
  - test
  - build

hello_world:
  stage: test
  script:
    - echo "Hello, GitLab CI/CD!"
    - echo "Current date: $(date)"
    - echo "Repository: $CI_PROJECT_NAME"

simple_build:
  stage: build
  script:
    - echo "Building application..."
    - mkdir -p build
    - echo "Build completed at $(date)" > build/info.txt
    - echo "Git commit: $CI_COMMIT_SHA" >> build/info.txt
  artifacts:
    paths:
      - build/
    expire_in: 1 hour

Passo 2: Commit e Push

git add .gitlab-ci.yml
git commit -m "Add basic GitLab CI/CD pipeline"
git push origin main

Passo 3: Verificare l’Esecuzione

  1. Vai su CI/CD → Pipelines nel tuo progetto GitLab
  2. Dovresti vedere la pipeline in esecuzione automaticamente
  3. Clicca sulla pipeline per vedere il dettaglio di ogni job
  4. Monitora i log cliccando sui singoli job
  5. Verifica che gli artifacts siano stati creati nella sezione “Job artifacts”

Conclusioni

In questo articolo abbiamo esplorato i componenti fondamentali delle pipeline GitLab CI/CD e la loro implementazione pratica. Abbiamo analizzato l’architettura del sistema, dai concetti base di stages e jobs fino alla gestione di artifacts e variabili.

La parte teorica ha coperto la struttura del file .gitlab-ci.yml e i quattro pilastri delle pipeline: stages per l’organizzazione sequenziale, jobs per l’esecuzione parallela, variables per la parametrizzazione e artifacts per la persistenza dei dati tra fasi.

Il tutorial pratico ha dimostrato l’implementazione step-by-step di una pipeline funzionale, dalla creazione del file di configurazione alla verifica dell’esecuzione tramite interfaccia GitLab. L’esempio ha illustrato come configurare job di test e build con artifacts, fornendo una base solida per pipeline più complesse.

La configurazione delle variabili di progetto ha completato il quadro tecnico, mostrando come gestire parametri sensibili e ambiente-specifici attraverso l’interfaccia GitLab.

Questo framework fornisce le basi per implementare automazione CI/CD scalabile, permettendo l’estensione verso deployment multi-ambiente, test automation avanzati e integrazione con sistemi esterni.