Passer au contenu principal

CI/CD (GitLab)

.gitlab-ci.yml : syntaxe et structure

Le fichier .gitlab-ci.yml est la definition declarative du pipeline. Sa syntaxe est un surensemble de YAML avec des mots-cles specifiques a GitLab. Comprendre la structure de base et les mots-cles courants couvre 90% des cas d'usage.

Structure de base

stages:
  - build
  - test
  - deploy

variables:
  IMAGE_TAG: $CI_COMMIT_SHORT_SHA

build:
  stage: build
  image: docker:27
  script:
    - docker build -t app:$IMAGE_TAG .

unit-tests:
  stage: test
  image: python:3.12
  script:
    - pip install -r requirements.txt
    - pytest tests/

deploy-prod:
  stage: deploy
  script:
    - ./deploy.sh
  environment:
    name: production
  rules:
    - if: $CI_COMMIT_BRANCH == "main"

Mots-cles essentiels

  • image : image Docker pour l'execution du job
  • script : commandes a executer (liste ordonnee)
  • before_script / after_script : commandes avant/apres script, au niveau job ou global
  • artifacts : fichiers a conserver apres le job et passer aux jobs suivants
  • cache : fichiers mis en cache entre les runs (node_modules, .venv, .gradle...)
  • needs : dependances directes (DAG)
  • rules : conditions d'execution du job
  • when : on_success (defaut), on_failure, always, manual, delayed, never
  • allow_failure : le job peut echouer sans bloquer le pipeline
  • timeout : duree maximale du job
  • retry : nombre de tentatives en cas d'echec
  • interruptible : le job peut etre annule si un nouveau pipeline demarre

Rules vs Only/Except

rules est le remplacement moderne de only/except, plus expressif et sans ambiguites d'evaluation. Une rule est une condition (if, changes, exists) combinee a une action (when: on_success, when: manual, when: never).

rules:
  - if: $CI_PIPELINE_SOURCE == "merge_request_event"
    when: on_success
  - if: $CI_COMMIT_BRANCH == "main"
    when: on_success
  - when: never

Variables predefinies

GitLab expose des dizaines de variables d'environnement dans chaque job : CI_COMMIT_SHA, CI_COMMIT_REF_NAME, CI_PROJECT_PATH, CI_REGISTRY, CI_REGISTRY_USER, CI_REGISTRY_PASSWORD, CI_ENVIRONMENT_NAME... La liste complete est dans la documentation officielle.

Sources