Bases des pipelines
Fonctionnement des pipelines
PipelineConteneur de niveau supérieur ; un par commit/déclencheur
StageGroupe de jobs qui s'exécutent en parallèle
JobTâche unique (script) au sein d'un stage
RunnerAgent qui exécute les jobs
Déclencher des pipelines
Push vers une brancheAutomatique (défaut)
Merge requestVia workflow:rules ou only: merge_requests
PlanificationCI/CD → Schedules dans les paramètres du projet
APIPOST /projects/:id/trigger/pipeline
ManuelBouton Run Pipeline dans le menu CI/CD
.gitlab-ci.yml
Configuration minimale
stages: [build, test, deploy] build-job: stage: build script: echo "Compiling..."
Mots-clés globaux
stagesDéfinir l'ordre des stages
defaultValeurs par défaut pour tous les jobs
variablesVariables CI/CD globales
workflowContrôler quand les pipelines sont créés
includeImporter des fichiers YAML externes
Inclure des templates
include: - template: Auto-DevOps.gitlab-ci.yml - local: .ci/lint.yml - project: 'group/shared-ci' file: '/templates/deploy.yml'
Jobs
Définition d'un job
test-unit: stage: test image: node:20 script: - npm ci - npm test
Mots-clés de job
scriptCommandes shell à exécuter (requis)
before_scriptCommandes avant le script principal
after_scriptCommandes après (même en cas d'échec)
imageImage Docker pour le job
rulesConditions d'inclusion du job
needsDépendances DAG (ignorer l'ordre des stages)
allow_failureLe pipeline continue si le job échoue
retryNombre de tentatives automatiques (0-2)
timeoutDurée maximale du job
Règles
deploy: rules: - if: '$CI_COMMIT_BRANCH == "main"' when: manual - if: '$CI_PIPELINE_SOURCE == "merge_request_event"' when: never - when: on_success
Stages
Ordre des stages
stages: - lint - build - test - deploy
Stages par défaut
.preS'exécute toujours en premier
buildStage par défaut 1
testStage par défaut 2
deployStage par défaut 3
.postS'exécute toujours en dernier
DAG avec needs
test-api: stage: test needs: ["build-api"] # skip waiting for full stage test-web: stage: test needs: ["build-web"] # runs as soon as build-web done
Variables
Définir des variables
variables: NODE_ENV: "production" DB_HOST: "postgres" job: variables: NODE_ENV: "test" # job-level override
Variables prédéfinies
CI_COMMIT_SHAHash complet du commit
CI_COMMIT_BRANCHNom de la branche
CI_COMMIT_TAGNom du tag (si pipeline de tag)
CI_PIPELINE_IDID unique du pipeline
CI_PROJECT_DIRChemin de checkout du dépôt
CI_MERGE_REQUEST_IIDNuméro de MR (pipelines MR seulement)
CI_REGISTRY_IMAGEChemin de l'image dans le registre de conteneurs
Protégées et masquées
ProtectedDisponible uniquement sur les branches/tags protégés
MaskedMasquée dans les logs des jobs
FileÉcrite dans un fichier temporaire ; chemin dans la variable
Artefacts
Sauvegarder des artefacts
build: script: npm run build artifacts: paths: [dist/] expire_in: 1 week
Types d'artefacts
pathsFichiers/répertoires à stocker
excludePatterns à ignorer
expire_inSuppression automatique après la durée
reports:junitXML JUnit pour le résumé des tests dans les MR
reports:coverage_reportVisualisation de la couverture Cobertura
Rapport JUnit
test: script: pytest --junitxml=report.xml artifacts: reports: junit: report.xml
Cache
Mettre en cache les dépendances
test: cache: key: ${CI_COMMIT_REF_SLUG} paths: [node_modules/] script: npm ci && npm test
Cache vs artefacts
CacheAccélérer les jobs ; non garanti ; réutilisation par même clé
ArtifactsPasser des fichiers entre jobs/stages ; garanti
Politiques de cache
pull-pushTélécharger + téléverser (défaut)
pullTélécharger seulement (plus rapide pour les consommateurs)
pushTéléverser seulement (pour les producteurs)
Environnements
Définir des environnements
deploy-staging: stage: deploy environment: name: staging url: https://staging.example.com script: ./deploy.sh staging
Fonctionnalités d'environnement
nameNom de l'environnement (affiché dans l'interface)
urlLien vers l'application déployée
on_stopJob à exécuter quand l'environnement est arrêté
auto_stop_inArrêt automatique après la durée
action: stopMarque le job comme action d'arrêt
Review Apps
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
Construire et pousser une image
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
Services (conteneurs sidecar)
test: image: python:3.12 services: - postgres:16 - redis:7 variables: POSTGRES_DB: testdb POSTGRES_PASSWORD: secret
Docker-in-Docker
docker:24-dindImage du service DinD
DOCKER_TLS_CERTDIRDéfinir à '/certs' ou '' pour la config TLS
DOCKER_HOSTtcp://docker:2376 (TLS) ou :2375
Patterns courants
Monorepo (changes)
test-api: rules: - changes: [api/**/*] test-web: rules: - changes: [web/**/*]
Validation manuelle de déploiement
deploy-prod: stage: deploy when: manual rules: - if: '$CI_COMMIT_BRANCH == "main"'
Matrice parallèle
test: parallel: matrix: - PYTHON: ["3.10", "3.11", "3.12"] DB: ["postgres", "sqlite"] script: tox -e py${PYTHON}-${DB}