
Vous avez besoin de passer des informations à vos jobs (URLs, tokens, configurations) sans les coder en dur ? Les variables GitLab CI/CD résolvent ce problème. Et pour les données sensibles (mots de passe, clés API), les options protected et masked assurent la sécurité.
Ce guide vous montre comment paramétrer vos pipelines et sécuriser vos secrets — deux compétences essentielles pour tout pipeline de production.
Ce guide est fait pour vous si…
Section intitulée « Ce guide est fait pour vous si… »Prérequis
Section intitulée « Prérequis »Avant de continuer, assurez-vous de maîtriser :
- Anatomie d’un
.gitlab-ci.yml(stages, jobs, script) - Syntaxe YAML de base
Les différents types de variables
Section intitulée « Les différents types de variables »GitLab CI/CD propose plusieurs types de variables, chacune adaptée à un besoin spécifique. Comprendre ces types est essentiel pour éviter les erreurs de configuration.
Variables d’environnement (les plus courantes)
Section intitulée « Variables d’environnement (les plus courantes) »Les variables d’environnement sont des chaînes de texte accessibles dans les scripts des jobs. Elles servent à stocker des configurations, des URLs, des versions — tout ce qui peut changer entre les environnements ou les exécutions.
variables: DATABASE_URL: "postgres://db.example.com:5432/myapp" APP_VERSION: "1.2.3"
test: script: - echo "Connexion à $DATABASE_URL" - echo "Version: $APP_VERSION"Où les définir ?
| Niveau | Portée | Cas d’usage |
|---|---|---|
| Dans le YAML | Ce pipeline uniquement | Configurations spécifiques au projet |
| Projet (Settings > CI/CD) | Tous les pipelines du projet | Secrets, URLs de prod |
| Groupe (Settings > CI/CD) | Tous les projets du groupe | Tokens partagés entre projets |
Variables de type fichier
Section intitulée « Variables de type fichier »Parfois, vous avez besoin d’un fichier plutôt qu’une simple chaîne : certificat SSL, fichier de configuration, clé privée. GitLab crée un fichier temporaire et stocke le chemin dans la variable.
deploy: script: # $DEPLOY_KEY contient le CHEMIN vers le fichier, pas le contenu - scp -i "$DEPLOY_KEY" app.zip user@server:/deploy/Pour créer une variable fichier :
- Allez dans Settings > CI/CD > Variables
- Cliquez sur Add variable
- Sélectionnez Type: File
- Collez le contenu du fichier dans Value
- GitLab créera le fichier à chaque job et mettra le chemin dans la variable
Variables protégées
Section intitulée « Variables protégées »Les variables protégées ne sont accessibles que dans les branches ou tags protégés. C’est la première ligne de défense pour vos secrets de production.
Pourquoi c’est important ?
Sans protection, n’importe qui peut créer une branche hack, ajouter echo $PROD_API_KEY dans le .gitlab-ci.yml, et voir votre secret dans les logs.
Avec une variable protégée, ce job échouera car la branche hack n’est pas protégée.
Pour protéger une variable :
- Allez dans Settings > CI/CD > Variables
- Cochez Protect variable
- La variable ne sera injectée que dans les pipelines des branches/tags protégés
Variables masquées
Section intitulée « Variables masquées »Les variables masquées sont remplacées par [MASKED] dans les logs. Indispensable pour éviter les fuites accidentelles de secrets.
job: script: - echo "Token: $API_TOKEN" # Affiche: Token: [MASKED]Variables CI_* prédéfinies
Section intitulée « Variables CI_* prédéfinies »GitLab injecte automatiquement des dizaines de variables dans chaque job. Les plus utiles :
| Variable | Contenu | Exemple d’utilisation |
|---|---|---|
$CI_COMMIT_BRANCH | Nom de la branche | Conditions dans rules |
$CI_COMMIT_SHA | Hash du commit | Versionner les artefacts |
$CI_PIPELINE_ID | ID du pipeline | Identifier une exécution |
$CI_JOB_TOKEN | Token temporaire | Accéder au registry GitLab |
$CI_PROJECT_DIR | Chemin du checkout | Référencer des fichiers |
$CI_ENVIRONMENT_NAME | Nom de l’environnement | Scripts de déploiement |
build: script: - echo "Build de la branche $CI_COMMIT_BRANCH" - docker build -t myapp:$CI_COMMIT_SHA .Précédence des variables
Section intitulée « Précédence des variables »Le problème : vous définissez DATABASE_URL dans le YAML, mais aussi dans les settings du projet. Laquelle gagne ?
GitLab applique une hiérarchie de précédence (du plus prioritaire au moins prioritaire) :
- Variables de pipeline (UI, API, triggers, schedules, downstream)
- Variables de projet (Settings > CI/CD)
- Variables de groupe (le sous-groupe le plus proche gagne)
- Variables d’instance (self-managed uniquement)
- Variables issues de rapports dotenv (artefacts
reports:dotenv) - Variables de job (dans
variables:du job) - Variables globales du YAML (section
variables:racine) - Variables de déploiement (liées aux environnements)
- Variables prédéfinies (CI_*)
En pratique :
# YAML global : DATABASE_URL = "dev-db"variables: DATABASE_URL: "dev-db"
test: # Si le projet définit DATABASE_URL = "test-db" dans Settings, # c'est "test-db" qui sera utilisé (projet > YAML) script: - echo $DATABASE_URLSécuriser les secrets
Section intitulée « Sécuriser les secrets »Un secret mal géré peut compromettre toute votre infrastructure. Voici les règles à suivre.
Règle 1 : Jamais de secret dans le YAML
Section intitulée « Règle 1 : Jamais de secret dans le YAML »# ❌ CATASTROPHE : le secret est dans l'historique Gitvariables: API_TOKEN: "sk-1234567890abcdef"
# ✅ CORRECT : le secret vient de l'interface GitLabjob: script: - curl -H "Authorization: Bearer $API_TOKEN" https://api.example.comRègle 2 : Protected + Masked systématiquement
Section intitulée « Règle 2 : Protected + Masked systématiquement »Pour tout secret :
- Protected : limite l’accès aux branches/tags protégés
- Masked : évite l’affichage accidentel dans les logs
Règle 3 : Scope environnement quand possible
Section intitulée « Règle 3 : Scope environnement quand possible »Vous pouvez limiter une variable de projet à un environnement spécifique (production, staging, ou un wildcard comme review/*) :
- Allez dans Settings > CI/CD > Variables
- Dans Environment scope, sélectionnez l’environnement cible
- La variable ne sera injectée que pour les jobs qui utilisent cet environnement
deploy_prod: environment: name: production script: - echo $PROD_SECRET # Disponible uniquement iciRègle 4 : Rotation régulière
Section intitulée « Règle 4 : Rotation régulière »Changez vos secrets périodiquement. Si un secret est compromis, l’attaquant n’a qu’une fenêtre limitée.
Astuce : utilisez un gestionnaire de secrets (HashiCorp Vault, Infisical) pour automatiser la rotation.
Règle 5 : Préférer les pipeline inputs (GitLab 17.7+)
Section intitulée « Règle 5 : Préférer les pipeline inputs (GitLab 17.7+) »Depuis GitLab 17.7, les pipeline inputs (spec:inputs) offrent une alternative plus gouvernable aux variables de pipeline pour les paramètres non-secrets. Ils permettent de définir des valeurs par défaut, des validations et une documentation intégrée. Réservez les variables CI/CD aux vrais secrets.
Bonnes pratiques
Section intitulée « Bonnes pratiques »Séparer les environnements
Section intitulée « Séparer les environnements »Utilisez des variables différentes pour dev, staging et prod :
stages: - test - deploy
test: stage: test variables: DATABASE_URL: $DEV_DATABASE_URL script: - pytest --db=$DATABASE_URL
deploy_prod: stage: deploy variables: DATABASE_URL: $PROD_DATABASE_URL environment: name: production script: - deploy.sh rules: - if: $CI_COMMIT_BRANCH == "main" when: manualNommer clairement
Section intitulée « Nommer clairement »Utilisez des préfixes pour identifier l’origine et l’usage :
| Préfixe | Signification |
|---|---|
DEV_, STAGING_, PROD_ | Environnement cible |
SECRET_, KEY_, TOKEN_ | Donnée sensible |
APP_, DB_, API_ | Composant concerné |
Exemple : PROD_DB_PASSWORD, DEV_API_BASE_URL
Documenter les variables requises
Section intitulée « Documenter les variables requises »Dans votre README ou un fichier dédié, listez les variables à configurer :
## Variables CI/CD requises
| Variable | Type | Protected | Description ||----------|------|-----------|-------------|| `PROD_DEPLOY_KEY` | File | ✅ | Clé SSH pour le serveur de prod || `DOCKER_REGISTRY_TOKEN` | Var | ✅ | Token pour push sur le registry || `SLACK_WEBHOOK_URL` | Var | ❌ | Notifications (optionnel) |Erreurs fréquentes
Section intitulée « Erreurs fréquentes »| Symptôme | Cause probable | Solution |
|---|---|---|
| Variable vide dans le job | Variable protected, branche non protégée | Protéger la branche ou retirer la protection |
| Valeur inattendue | Précédence : projet override YAML | Vérifier Settings > CI/CD > Variables |
| Secret visible dans les logs | Variable non masquée | Activer Mask variable |
$VAR affiché littéralement | Guillemets simples au lieu de doubles | Utiliser "$VAR" pas '$VAR' |
À retenir
Section intitulée « À retenir »- Variables d’environnement pour les configurations, fichiers pour les certificats/clés.
- Protected limite aux branches protégées, Masked cache dans les logs, Hidden masque dans l’UI.
- Précédence : pipeline > projet > groupe > instance > dotenv > job YAML > global YAML > deploy > CI_*.
- Jamais de secret dans le YAML — utilisez l’interface GitLab.
- Jamais
exportouprintenvsans filtre — cela expose tous les secrets. - Scope environnement pour isoler les secrets dev/staging/prod.
- Review des MR obligatoire — une MR malveillante peut exfiltrer vos secrets.
Testez vos connaissances
Section intitulée « Testez vos connaissances »Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Profil de compétences
Quoi faire maintenant
Ressources pour progresser
Des indices pour retenter votre chance ?
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications