Aller au contenu
CI/CD & Automatisation medium

Variables et secrets GitLab CI/CD

12 min de lecture

logo gitlab

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.

Avant de continuer, assurez-vous de maîtriser :

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.

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 ?

NiveauPortéeCas d’usage
Dans le YAMLCe pipeline uniquementConfigurations spécifiques au projet
Projet (Settings > CI/CD)Tous les pipelines du projetSecrets, URLs de prod
Groupe (Settings > CI/CD)Tous les projets du groupeTokens partagés entre projets

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 :

  1. Allez dans Settings > CI/CD > Variables
  2. Cliquez sur Add variable
  3. Sélectionnez Type: File
  4. Collez le contenu du fichier dans Value
  5. GitLab créera le fichier à chaque job et mettra le chemin dans la variable

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 :

  1. Allez dans Settings > CI/CD > Variables
  2. Cochez Protect variable
  3. La variable ne sera injectée que dans les pipelines des branches/tags protégés

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]

GitLab injecte automatiquement des dizaines de variables dans chaque job. Les plus utiles :

VariableContenuExemple d’utilisation
$CI_COMMIT_BRANCHNom de la brancheConditions dans rules
$CI_COMMIT_SHAHash du commitVersionner les artefacts
$CI_PIPELINE_IDID du pipelineIdentifier une exécution
$CI_JOB_TOKENToken temporaireAccéder au registry GitLab
$CI_PROJECT_DIRChemin du checkoutRéférencer des fichiers
$CI_ENVIRONMENT_NAMENom de l’environnementScripts de déploiement
build:
script:
- echo "Build de la branche $CI_COMMIT_BRANCH"
- docker build -t myapp:$CI_COMMIT_SHA .

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) :

Pyramide de précédence des variables GitLab CI/CD : 9 niveaux du plus prioritaire (variables de pipeline) au moins prioritaire (CI_*)

  1. Variables de pipeline (UI, API, triggers, schedules, downstream)
  2. Variables de projet (Settings > CI/CD)
  3. Variables de groupe (le sous-groupe le plus proche gagne)
  4. Variables d’instance (self-managed uniquement)
  5. Variables issues de rapports dotenv (artefacts reports:dotenv)
  6. Variables de job (dans variables: du job)
  7. Variables globales du YAML (section variables: racine)
  8. Variables de déploiement (liées aux environnements)
  9. 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_URL

Un secret mal géré peut compromettre toute votre infrastructure. Voici les règles à suivre.

# ❌ CATASTROPHE : le secret est dans l'historique Git
variables:
API_TOKEN: "sk-1234567890abcdef"
# ✅ CORRECT : le secret vient de l'interface GitLab
job:
script:
- curl -H "Authorization: Bearer $API_TOKEN" https://api.example.com

Pour tout secret :

  1. Protected : limite l’accès aux branches/tags protégés
  2. Masked : évite l’affichage accidentel dans les logs

Vous pouvez limiter une variable de projet à un environnement spécifique (production, staging, ou un wildcard comme review/*) :

  1. Allez dans Settings > CI/CD > Variables
  2. Dans Environment scope, sélectionnez l’environnement cible
  3. 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 ici

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.

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: manual

Utilisez des préfixes pour identifier l’origine et l’usage :

PréfixeSignification
DEV_, STAGING_, PROD_Environnement cible
SECRET_, KEY_, TOKEN_Donnée sensible
APP_, DB_, API_Composant concerné

Exemple : PROD_DB_PASSWORD, DEV_API_BASE_URL

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) |
SymptômeCause probableSolution
Variable vide dans le jobVariable protected, branche non protégéeProtéger la branche ou retirer la protection
Valeur inattenduePrécédence : projet override YAMLVérifier Settings > CI/CD > Variables
Secret visible dans les logsVariable non masquéeActiver Mask variable
$VAR affiché littéralementGuillemets simples au lieu de doublesUtiliser "$VAR" pas '$VAR'
  1. Variables d’environnement pour les configurations, fichiers pour les certificats/clés.
  2. Protected limite aux branches protégées, Masked cache dans les logs, Hidden masque dans l’UI.
  3. Précédence : pipeline > projet > groupe > instance > dotenv > job YAML > global YAML > deploy > CI_*.
  4. Jamais de secret dans le YAML — utilisez l’interface GitLab.
  5. Jamais export ou printenv sans filtre — cela expose tous les secrets.
  6. Scope environnement pour isoler les secrets dev/staging/prod.
  7. Review des MR obligatoire — une MR malveillante peut exfiltrer vos secrets.

Contrôle de connaissances

Validez vos connaissances avec ce quiz interactif

10 questions
5 min.
70% requis

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