🚀 Nuova versione beta disponibile! Feedback o problemi? Contattaci

Creare e Gestire CI/CD Pipelines in GitLab

Codegrind Team•Aug 28 2024

GitLab CI/CD (Continuous Integration/Continuous Deployment) è una delle funzionalità più potenti di GitLab, consentendo di automatizzare l’intero ciclo di vita del software, dalla build al test, fino al deployment. Le pipeline CI/CD in GitLab sono configurate attraverso un file .gitlab-ci.yml, che definisce le fasi e i lavori della pipeline. In questa guida, esploreremo come configurare una pipeline CI/CD in GitLab, utilizzare i runner, e gestire pipeline complesse per garantire un flusso di lavoro DevOps efficace.

Cos’è GitLab CI/CD?

GitLab CI/CD è un sistema integrato che permette di automatizzare la build, il test e il deployment del codice. Le pipeline CI/CD sono una serie di step definiti in un file .gitlab-ci.yml, che viene eseguito ogni volta che viene eseguito un push al repository o in base ad altri trigger configurati. Le pipeline aiutano a mantenere il codice in uno stato di rilascio continuo, migliorando la qualità e l’affidabilità del software.

Creare un File .gitlab-ci.yml

Il file .gitlab-ci.yml si trova nella root del tuo repository e definisce la configurazione della pipeline. Ogni pipeline è composta da una o più fasi (stages), e ogni fase contiene uno o più job.

Esempio di un File .gitlab-ci.yml di Base

Ecco un esempio di un file .gitlab-ci.yml per un progetto Node.js:

stages:
  - build
  - test
  - deploy

variables:
  NODE_ENV: "production"

cache:
  paths:
    - node_modules/

before_script:
  - npm install

build-job:
  stage: build
  script:
    - npm run build
  only:
    - main

test-job:
  stage: test
  script:
    - npm test

deploy-job:
  stage: deploy
  script:
    - echo "Deploying to production server..."
  only:
    - main

Spiegazione del File .gitlab-ci.yml

  • stages: Definisce le fasi della pipeline. In questo esempio, ci sono tre fasi: build, test e deploy.
  • variables: Permette di definire variabili di ambiente utilizzate nei job.
  • cache: Specifica quali file o directory devono essere memorizzati nella cache tra i job, riducendo i tempi di esecuzione.
  • before_script: Comandi eseguiti prima di ogni job. Qui, viene installato Node.js.
  • build-job: Un job che esegue la build del progetto. Viene eseguito solo sul branch main.
  • test-job: Un job che esegue i test unitari.
  • deploy-job: Un job per eseguire il deployment. Viene eseguito solo sul branch main.

Utilizzare GitLab Runner

GitLab Runner è un’applicazione che esegue i job definiti nel file .gitlab-ci.yml. Esistono due tipi principali di runner: shared runners (gestiti da GitLab) e specific runners (gestiti dal team di sviluppo).

Installare GitLab Runner

Se preferisci utilizzare un runner specifico per il tuo progetto, puoi installare GitLab Runner sulla tua macchina o server:

  • Su macOS:

    brew install gitlab-runner
    
  • Su Ubuntu/Debian:

    curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
    chmod +x /usr/local/bin/gitlab-runner
    
  • Su Windows: Scarica l’eseguibile dal sito ufficiale di GitLab Runner.

Registrare un GitLab Runner

Dopo aver installato GitLab Runner, registralo con il tuo progetto GitLab:

gitlab-runner register

Durante la registrazione, ti verranno chieste alcune informazioni come l’URL di GitLab e il token di registrazione del runner (che puoi trovare nelle impostazioni CI/CD del tuo progetto GitLab).

Gestire Pipeline Complesse

Le pipeline in GitLab possono diventare molto complesse quando si lavora su progetti su larga scala. Ecco alcune funzionalità avanzate che puoi usare per gestire pipeline complesse.

1. Pipeline Multibranch

Puoi configurare pipeline diverse per branch diversi, utilizzando la direttiva only e except:

test-job:
  stage: test
  script:
    - npm test
  only:
    - develop

deploy-job:
  stage: deploy
  script:
    - npm run deploy
  only:
    - main

In questo esempio, i test vengono eseguiti solo sul branch develop, mentre il deploy solo sul branch main.

2. Pipeline Condizionali

Puoi eseguire job in base a condizioni specifiche, come la presenza di file modificati o l’uscita di un altro job:

lint-job:
  stage: lint
  script:
    - npm run lint
  rules:
    - changes:
        - "*.js"

build-job:
  stage: build
  script:
    - npm run build
  needs: ["lint-job"]

3. Pipeline Parallele

Se vuoi eseguire job in parallelo per ridurre il tempo totale della pipeline:

test-job:
  stage: test
  script:
    - npm test
  parallel:
    matrix:
      - NODE_ENV: ["development", "production"]

In questo esempio, il job di test viene eseguito in parallelo su due ambienti differenti (development e production).

4. Pipeline da Monorepo

Se lavori su un monorepo, puoi configurare la pipeline per eseguire job specifici solo se le directory o i file correlati vengono modificati:

backend-test:
  stage: test
  script:
    - cd backend && npm test
  rules:
    - changes:
        - backend/**

frontend-test:
  stage: test
  script:
    - cd frontend && npm test
  rules:
    - changes:
        - frontend/**

5. Artefatti e Dependency Caching

Gli artefatti sono file generati da un job che possono essere utilizzati da altri job nella pipeline. Puoi anche utilizzare la cache per salvare dipendenze e ridurre il tempo di build:

build-job:
  stage: build
  script:
    - npm run build
  artifacts:
    paths:
      - dist/
  cache:
    paths:
      - node_modules/

Best Practices per GitLab CI/CD

  • Mantieni il File .gitlab-ci.yml Pulito: Organizza il file .gitlab-ci.yml con commenti e sezioni chiare per rendere facile la comprensione e la manutenzione.
  • Usa i Runner Specifici per Job: Configura runner specifici per eseguire job che richiedono un ambiente particolare, migliorando l’efficienza delle pipeline.
  • Cachare Dipendenze: Usa la cache per dipendenze come node_modules o vendor per velocizzare le pipeline.
  • Pipeline Condizionali: Configura pipeline condizionali per eseguire solo i job necessari, riducendo il carico inutile.
  • Monitora le Pipeline: Utilizza gli strumenti di monitoraggio di GitLab per analizzare e ottimizzare le pipeline in base alle prestazioni e ai colli di bottiglia.

Risolvere Problemi Comuni

Pipeline in Loop Infinito

Se una pipeline entra in loop, verifica i trigger e le condizioni definite nei job per evitare che un trigger generi continuamente nuove pipeline.

Job Fallisce Senza Chiare Informazioni

Se un job fallisce senza un errore chiaro, aumenta la verbosità dei log nel file .gitlab-ci.yml o esegui manualmente i comandi in un ambiente locale per il debugging.

Runner Non Disponibili

Se un runner non è disponibile, verifica lo stato del runner nel pannello di amministrazione di GitLab e assicurati che sia correttamente registrato e funzionante.

Conclusione

Le CI/CD pipelines di GitLab offrono un sistema potente per automatizzare il ciclo di vita del software, migliorando l’efficienza e la qualità del processo di sviluppo. Con le funzionalità avanzate disponibili in GitLab, puoi creare pipeline flessibili e scalabili che supportano il rilascio continuo e l’integrazione del software. Seguendo le best practices e utilizzando le tecniche avanzate discusse in questa guida, sarai in grado di ottimizzare le tue pipeline GitLab per affrontare le sfide di sviluppo più complesse.