GitLab CI/CD
| Fiche express | |
|---|---|
| Type | Plateforme d'intégration et de déploiement continus (CI/CD) |
| Éditeur | GitLab Inc. (composant de GitLab, CE/EE) |
| Format | YAML (.gitlab-ci.yml)
|
| Exécuteurs | GitLab Runner (shell, Docker, Kubernetes, etc.) |
| Alternatives | Jenkins, GitHub Actions |
| Voir aussi | Terraform — Concepts fondamentaux · Ansible · Frontière IaC — Terraform, Ansible, GitOps |
GitLab CI/CD est la plateforme d'intégration et de déploiement continus intégrée à GitLab. Contrairement à Jenkins, qui reste un serveur autonome à brancher sur un dépôt Git externe, GitLab CI/CD est nativement couplé au dépôt : le pipeline est défini par un fichier versionné à la racine du projet, .gitlab-ci.yml, et s'exécute automatiquement à chaque événement Git (push, merge request, tag, planification).
Modèle général
Un pipeline est déclenché par un événement Git et se compose de stages exécutés séquentiellement ; chaque stage regroupe des jobs exécutés en parallèle. Un job échoué bloque par défaut le passage au stage suivant.
<mermaid> flowchart LR
subgraph build[Stage: build]
B1[job: compile]
end
subgraph test[Stage: test]
T1[job: unit-tests]
T2[job: lint]
end
subgraph deploy[Stage: deploy]
D1[job: terraform-apply]
D2[job: ansible-deploy]
end
build --> test --> deploy
</mermaid>
.gitlab-ci.yml
stages:
- build
- test
- deploy
variables:
TF_ROOT: infra/
build-job:
stage: build
image: golang:1.22
script:
- go build ./...
artifacts:
paths:
- bin/
unit-tests:
stage: test
image: golang:1.22
script:
- go test ./...
terraform-apply:
stage: deploy
image: hashicorp/terraform:1.7
script:
- cd $TF_ROOT
- terraform init
- terraform apply -auto-approve
environment:
name: production
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
when: manual
ansible-deploy:
stage: deploy
image: registry.example.org/ansible-runner:latest
script:
- ansible-playbook -i inventory/prod site.yml
needs: ["terraform-apply"]
- stages — liste ordonnée des phases du pipeline.
- jobs — unités d'exécution (une entrée de premier niveau, hors mots-clés réservés) rattachées à un stage via
stage:. - script — suite de commandes shell exécutées dans le contexte du job.
- artifacts — fichiers produits par un job et transmis aux jobs suivants (ou téléchargeables depuis l'interface).
- rules (remplace l'ancien
only/except) — conditionne l'exécution ou le déclenchement manuel (when: manual) d'un job selon la branche, le tag, l'événement, une variable... - needs — définit des dépendances explicites entre jobs, indépendamment de l'ordre des stages (exécution accélérée, DAG plutôt que séquence stricte).
Runners
Un GitLab Runner est l'agent qui exécute réellement les jobs. Il peut être :
- partagé (shared) — fourni par l'instance GitLab, mutualisé entre projets ;
- spécifique (specific) — enregistré sur un projet ou un groupe, dédié (typiquement pour un accès réseau particulier, un GPU, un environnement on-prem).
Chaque runner utilise un executor : shell (exécution directe sur la machine hôte), docker (chaque job dans un conteneur éphémère, le plus courant), docker+machine/docker-autoscaler (provisionnement à la volée), ou kubernetes (chaque job devient un pod). Le choix de l'image (image:) et des tags permet de router un job vers le runner adéquat.
Pipelines de déploiement infra
GitLab CI/CD sert couramment de point d'orchestration pour les outils IaC déjà couverts par ce wiki :
- un job
terraform planen merge request (revue du diff avant fusion), suivi d'un jobterraform applymanuel sur la branche principale — voir Terraform — Concepts fondamentaux pour le cycle plan/apply et la gestion du state (à héberger dans un backend distant, jamais dans le pipeline) ; - un job
ansible-playbookpour la configuration post-provisionnement — voir Ansible ; - la notion d'
environment:permet de suivre les déploiements par environnement (staging, production) et d'afficher l'historique de déploiement dans l'interface GitLab.
Le partage des responsabilités entre provisionnement, configuration et déploiement continu reste valable ici : GitLab CI/CD est un bon orchestrateur push (il déclenche des actions), mais pour des workloads Kubernetes vivant en continu, un modèle pull de type GitOps (voir ArgoCD, FluxCD) offre une réconciliation permanente que ne fournit pas nativement un pipeline CI classique.
Réutilisation : include et extends
include:
- project: 'infra/ci-templates'
file: '/templates/terraform.yml'
.deploy-base:
image: alpine:3.19
before_script:
- apk add --no-cache curl
deploy-staging:
extends: .deploy-base
stage: deploy
script:
- ./deploy.sh staging
- include — importe des définitions de jobs depuis un autre fichier ou projet (mutualisation de templates CI entre dépôts).
- extends — hérite des attributs d'un job « caché » (préfixé par un point, non exécuté seul).
Face à Jenkins et GitHub Actions
| Dimension | GitLab CI/CD | Jenkins | GitHub Actions |
|---|---|---|---|
| Format | YAML déclaratif | DSL Groovy (Jenkinsfile) ou UI | YAML déclaratif |
| Couplage SCM | Natif (GitLab) | Externe, à connecter (webhooks, plugins) | Natif (GitHub) |
| Exécuteurs | GitLab Runner (auto-hébergé ou SaaS) | Agents Jenkins (maître/agent) | Runners GitHub (auto-hébergés ou SaaS) |
| Écosystème | Intégré à la forge (MR, registre, environnements) | Vaste catalogue de plugins, mature | Marketplace d'actions réutilisables |
| Historique | Plus récent, conçu YAML-first | Le plus ancien (2011, ex-Hudson) | Plus récent, conçu YAML-first |
Le choix se fait rarement sur des critères techniques purs : il suit la forge Git déjà en place (GitLab, GitHub) ou, pour Jenkins, un existant à maintenir plutôt qu'un nouveau projet.
Voir aussi
- Jenkins — alternative historique à agents, DSL Groovy
- Terraform — Concepts fondamentaux — cycle plan/apply orchestrable en pipeline
- Ansible — configuration post-provisionnement
- Frontière IaC — Terraform, Ansible, GitOps — répartition provisionnement/configuration/déploiement
- ArgoCD · FluxCD — déploiement continu pull pour Kubernetes