GitLab CI avancé : review apps, cache et multi-projets
🎯 Objectifs
- ✅ Gérer les variables et secrets de manière sécurisée
- ✅ Utiliser
rules:pour contrôler l'exécution des jobs - ✅ Configurer des environnements (staging, production)
- ✅ Optimiser les pipelines avec le cache et
needs: - ✅ Utiliser le Container Registry intégré
- ✅ Réutiliser des templates avec
include:
📋 Prérequis
| Prérequis | Niveau |
|---|---|
| GitLab CI | Intermédiaire (module précédent) |
| Docker | Intermédiaire |
| Git | Intermédiaire |
🔐 Variables et Secrets
Configurez vos secrets dans Settings → CI/CD → Variables :
| Option | Description |
|---|---|
| Protected | Disponible uniquement sur les branches protégées |
| Masked | Masquée dans les logs du pipeline |
deploy:
script:
- echo "Deploying with token $DEPLOY_TOKEN"
variables:
ENV: production⚠️ Ne mettez jamais de secrets directement dans
.gitlab-ci.yml. Utilisez toujours les variables CI/CD de GitLab.
Pour les secrets sensibles, cochez Protected ET Masked.
📏 Rules (remplace only/except)
rules: est la méthode moderne pour contrôler quand un job s'exécute :
deploy:
rules:
- if: $CI_COMMIT_BRANCH == "main"
when: always
- if: $CI_PIPELINE_SOURCE == "merge_request_event"
when: manual
- when: neverConditions courantes
| Condition | Description |
|---|---|
$CI_COMMIT_BRANCH == "main" | Sur la branche main |
$CI_PIPELINE_SOURCE == "merge_request_event" | Déclenché par une MR |
$CI_COMMIT_TAG | Un tag est présent |
changes: ["src/**"] | Fichiers modifiés dans src/ |
💡 Préférez toujours
rules:àonly/except- c'est plus lisible et plus puissant.
🌍 Environnements
Définissez des environnements pour suivre vos déploiements :
deploy-staging:
stage: deploy
environment:
name: staging
url: https://staging.example.com
script:
- ./deploy.sh staging
deploy-production:
stage: deploy
environment:
name: production
url: https://example.com
rules:
- if: $CI_COMMIT_BRANCH == "main"
when: manual- Consultez vos environnements dans Operations → Environments
- Chaque déploiement est tracé avec le commit et la date
when: manualexige un clic pour déployer en production
💡 Ajoutez
auto_stop_in: 1 weekpour arrêter automatiquement les environnements de review.
⚡ Cache
Le cache accélère les pipelines en réutilisant des fichiers entre exécutions.
Cache vs Artefacts
| Aspect | Cache | Artefacts |
|---|---|---|
| But | Accélérer les jobs | Passer des fichiers entre stages |
| Persistance | Entre pipelines | Dans le même pipeline |
| Fiabilité | Best-effort | Garanti |
| Usage typique | node_modules/, .pip/ | dist/, rapports de tests |
test:
cache:
key: $CI_COMMIT_REF_SLUG
paths:
- node_modules/
script:
- npm ci
- npm test💡
$CI_COMMIT_REF_SLUGcrée un cache par branche.
🐘 Services (Docker-in-Docker)
Lancez des conteneurs additionnels aux côtés de votre job :
test:
image: node:20-alpine
services:
- postgres:15
variables:
POSTGRES_DB: testdb
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
script:
- npm ci
- npm testLe service PostgreSQL est accessible à l'adresse postgres (nom du service).
💡 Vous pouvez ajouter plusieurs services : Redis, MySQL, Elasticsearch, etc.
🔄 Pipeline Multi-Stage Complet
Exemple réaliste avec needs: pour des pipelines DAG (plus rapides) :
stages:
- lint
- test
- build
- deploy
lint:
stage: lint
image: node:20-alpine
script:
- npm ci
- npm run lint
allow_failure: true
test:
stage: test
image: node:20-alpine
script:
- npm ci
- npm test
build:
stage: build
image: node:20-alpine
needs: ["lint", "test"]
script:
- npm ci
- npm run build
artifacts:
paths:
- dist/
deploy-staging:
stage: deploy
needs: ["build"]
environment:
name: staging
script:
- ./deploy.sh staging
rules:
- if: $CI_COMMIT_BRANCH == "main"
deploy-production:
stage: deploy
needs: ["build"]
environment:
name: production
script:
- ./deploy.sh production
rules:
- if: $CI_COMMIT_BRANCH == "main"
when: manual| Mot-clé | Rôle |
|---|---|
needs: | Dépendance directe (DAG) - n'attend pas tout le stage |
allow_failure: true | Le pipeline continue même si le job échoue |
when: manual | Déploiement déclenché manuellement |
🐳 Container Registry
GitLab intègre un registry Docker. Construisez et poussez vos images directement :
build-image:
image: docker:latest
services:
- docker: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💡
$CI_REGISTRY_*sont des variables prédéfinies - pas besoin de les configurer.
Accédez à vos images dans Packages & Registries → Container Registry.
📦 Include et Templates
Réutilisez des configurations entre projets :
include:
- template: Auto-DevOps.gitlab-ci.yml
- project: 'group/shared-ci'
file: '/templates/deploy.yml'
- local: '.gitlab/ci/test.yml'| Source | Usage |
|---|---|
template: | Templates fournis par GitLab |
project: | Fichier d'un autre projet GitLab |
local: | Fichier local dans le même dépôt |
remote: | URL distante |
💡 Découpez les gros
.gitlab-ci.ymlen fichiers séparés aveclocal:.
✅ Bonnes Pratiques
| Pratique | Pourquoi |
|---|---|
rules: au lieu de only/except | Plus flexible et lisible |
needs: pour les DAG | Pipelines plus rapides |
| Cache les dépendances | Économise du temps à chaque run |
| Images Docker avec tags précis | Builds reproductibles (node:20.11 > node:latest) |
| Variables protégées + masquées | Sécurité des secrets en production |
include: pour les templates | DRY - évite la duplication |
💡 Explorez Auto DevOps pour des pipelines préconfigurés : build, test, security scan et deploy.
📌 Points Clés
- Les variables protégées sécurisent vos secrets sur les branches sensibles
rules:remplaceonly/exceptavec plus de contrôle- Les environnements tracent chaque déploiement dans l'interface GitLab
- Le cache accélère les pipelines, les artefacts passent des fichiers
needs:crée des pipelines DAG plus rapides que l'ordre séquentiel des stages
📚 Ressources
- Documentation GitLab CI/CD
- Référence complète `.gitlab-ci.yml`
- Environments & Deployments
- CI/CD Variables
- Container Registry
🚀 Prochaines étapes
Vos pipelines GitLab CI sont au niveau production. Passez à l'orchestration :
- Découvrir Kubernetes : pods, services et kubectl - Pods, services et premières commandes kubectl