Aller au contenu
CI/CD & Automatisation medium

Runners GitLab CI/CD

15 min de lecture

logo gitlab

Vous savez maintenant écrire un fichier .gitlab-ci.yml avec des stages, des jobs et des scripts. Mais qui exécute réellement ces jobs ? Ce sont les runners — des agents qui récupèrent vos jobs et lancent les commandes. Ce guide vous explique comment ils fonctionnent et comment les optimiser.

À la fin de ce module, vous saurez :

  • Comprendre le rôle d’un runner : l’agent qui exécute vos jobs
  • Différencier shared, group et project runners : choisir le bon type selon vos besoins
  • Utiliser les tags : cibler un runner spécifique pour un job
  • Choisir un executor : Docker, Shell ou Kubernetes selon votre contexte
  • Diagnostiquer un job “pending” : identifier pourquoi un job ne démarre pas
  • Optimiser les performances : réduire les temps d’exécution

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

Un runner est un agent qui :

  1. Récupère les jobs en attente depuis GitLab
  2. Exécute les commandes du job
  3. Renvoie les résultats (logs, artefacts, statut)

Architecture Runner GitLab : le serveur GitLab envoie les jobs au Runner qui exécute les scripts

TypePortéeCas d’usage
Shared runnersTous les projets GitLab.comProjets standards, pas de setup
Group runnersProjets d’un groupeÉquipes avec besoins communs
Project runnersUn seul projetSécurité, performance, besoins spécifiques

GitLab.com fournit des runners partagés, gratuits (avec quotas). Ils sont :

  • Préconfigurés avec Docker
  • Disponibles immédiatement
  • Limités en minutes par mois (selon votre plan)

Pour les utiliser, rien à configurer — vos jobs s’exécutent automatiquement dessus.

Runners disponibles dans GitLab - Settings > CI/CD > Runners

Dans Settings > CI/CD > Runners, vous voyez les runners disponibles pour votre projet : leur statut (online/offline), leurs tags, et s’ils sont partagés ou dédiés.

Les group runners sont partagés entre tous les projets d’un groupe GitLab. Ils offrent un bon compromis entre les shared runners (trop génériques) et les project runners (trop isolés).

Cas d’usage :

  • Équipes avec plusieurs projets partageant les mêmes besoins (stack technique commune)
  • Gouvernance centralisée : un admin groupe gère les runners pour tous les projets
  • Contrôle des tags et des accès au niveau équipe

Pour créer un group runner : Group > Settings > CI/CD > Runners > New group runner. Les projets du groupe l’utilisent automatiquement (sauf si désactivé au niveau projet).

Installez votre propre runner pour :

  • Performance : machine dédiée, pas de file d’attente
  • Sécurité : jobs qui accèdent à des ressources internes
  • Spécialisation : GPU, ARM, outils spécifiques
  • Coût : éviter les quotas de minutes

Quand un pipeline s’exécute, vous pouvez suivre sa progression dans Build > Pipelines :

Liste des pipelines GitLab

Chaque ligne représente un pipeline avec son statut, sa branche et son déclencheur. Cliquez sur un pipeline pour voir le détail des stages et jobs :

Graphe d'un pipeline GitLab - vue des stages et jobs

Ce graphe montre les stages (colonnes) et les jobs (cases). Les jobs d’un même stage s’exécutent en parallèle. Cliquez sur un job pour voir ses logs en temps réel :

Logs d'un job GitLab CI en cours d'exécution

Les logs affichent chaque commande exécutée et sa sortie. Vous voyez les variables CI (comme $CI_COMMIT_BRANCH) résolues avec leurs valeurs réelles.

L’executor définit comment le runner exécute les jobs :

ExecutorDescriptionCas d’usage
DockerChaque job dans un conteneur isoléStandard, isolation, reproductibilité
Docker+MachineCrée des VMs à la demande (autoscaling)Charge variable, cloud
ShellExécute directement sur la machineAccès hardware, simplicité
KubernetesPods Kubernetes éphémèresCluster K8s existant
SSHSe connecte à une machine distanteDéploiement sur serveurs existants

Le plus courant. Chaque job s’exécute dans un conteneur Docker.

job:
image: node:18 # Image Docker utilisée
script:
- npm install
- npm test

Avantages :

  • Isolation complète entre jobs
  • Environnement reproductible
  • Large choix d’images disponibles

Inconvénients :

  • Temps de pull de l’image
  • Pas d’accès direct au hardware

Exécute les commandes directement sur la machine du runner.

job:
tags:
- shell # Cible un runner avec executor shell
script:
- ./build.sh

Avantages :

  • Accès direct au hardware (GPU, USB…)
  • Pas de overhead Docker
  • Outils préinstallés disponibles

Inconvénients :

  • Pas d’isolation entre jobs
  • Dépendances à installer sur la machine

Les tags permettent de cibler un runner spécifique. Un job avec des tags ne s’exécute que sur un runner qui a tous ces tags.

build:
tags:
- docker
- linux
script:
- make build
build-arm:
tags:
- docker
- arm64
script:
- make build

Côté runner, les tags sont définis lors de l’enregistrement :

Fenêtre de terminal
gitlab-runner register \
--tag-list "docker,linux,amd64"
  1. Télécharger le binaire

    Fenêtre de terminal
    curl -L --output /usr/local/bin/gitlab-runner \
    https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
    chmod +x /usr/local/bin/gitlab-runner
  2. Créer un utilisateur dédié

    Fenêtre de terminal
    useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
  3. Installer et démarrer le service

    Fenêtre de terminal
    gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
    gitlab-runner start
  4. Créer le runner dans GitLab

    Dans Settings > CI/CD > Runners, cliquez sur New project runner. Configurez les tags et options, puis GitLab génère un runner authentication token (préfixe glrt-).

  5. Enregistrer le runner

    Utilisez le token glrt-... avec l’option --token :

    Fenêtre de terminal
    sudo gitlab-runner register \
    --url "https://gitlab.com/" \
    --token "glrt-XXXXXXXXXXXXXXXX" \
    --name "my-docker-runner" \
    --executor "docker" \
    --docker-image "alpine:3.19" \
    --tag-list "docker,linux"

Le fichier de configuration est /etc/gitlab-runner/config.toml :

concurrent = 4 # Jobs simultanés max sur ce runner
check_interval = 3 # Intervalle de polling GitLab (en secondes)
[[runners]]
name = "my-runner"
url = "https://gitlab.com/"
token = "glrt-xxxx"
executor = "docker"
[runners.docker]
image = "alpine:3.19"
privileged = false
volumes = ["/cache"]
pull_policy = ["always", "if-not-present"] # Fallback si registry indisponible

Paramètres importants :

ParamètreDescription
concurrentNombre de jobs simultanés sur ce runner
check_intervalIntervalle entre les polls vers GitLab (réparti entre les runners du fichier)
pull_policyStratégie de pull : always, if-not-present, never (ou liste pour fallback)
privilegedMode privilégié (requis pour Docker-in-Docker, risque sécurité)
volumesVolumes montés dans les conteneurs

Votre job reste bloqué sur “pending” ? Voici les causes possibles :

SymptômeCause probableSolution
”Waiting for a runner”Aucun runner disponibleVérifier que les runners sont actifs
”This job is stuck”Tags ne matchent pasVérifier les tags du job et du runner
Pending longtempsTous les runners occupésAugmenter concurrent ou ajouter des runners
Pending puis failRunner offlineVérifier le service gitlab-runner

Diagnostic :

Fenêtre de terminal
# Vérifier le statut du runner
gitlab-runner status
# Voir les runners enregistrés
gitlab-runner list
# Tester la connexion à GitLab
gitlab-runner verify

Dans GitLab : Settings > CI/CD > Runners montre les runners disponibles et leur statut (voir la capture plus haut).

CauseImpactSolution
Pull d’image à chaque job+30s à +2minpull_policy: if-not-present
npm install à chaque job+1 à 5minUtiliser le cache
Runners partagés surchargésFile d’attenteRunner dédié
Image lourdeTemps de téléchargementImage plus légère ou custom
  1. Utilisez des tags significatifs : docker-linux, gpu, prod-deploy
  2. Limitez les runners de production : tags dédiés, accès restreint
  3. Configurez concurrent correctement : selon les ressources de la machine
  4. Utilisez pull_policy: if-not-present : évite les pulls inutiles
  5. Surveillez vos runners : dashboards, alertes si offline
  1. Runner = agent qui exécute les jobs sur une machine
  2. Shared runners gratuits (avec quotas), project runners pour contrôle total
  3. Executor Docker recommandé pour l’isolation et la reproductibilité
  4. Tags = cibler un runner spécifique (tags: [docker, gpu])
  5. Job pending = vérifier tags, runners actifs, et concurrent
  6. Performance = cache, pull_policy, runners dédiés

Testez vos connaissances sur les runners GitLab CI/CD.

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