Configuration des Runners (Executors & config.toml)
Comprendre le concept d'Executor
Lorsque vous enregistrez un GitLab Runner, la question la plus importante qui vous est posée est le choix de l'Executor (l'exécuteur). Le Runner n'est que le messager, l'Executor est l'environnement réel dans lequel votre code va s'exécuter.
Trois exécuteurs dominent le marché DevOps :
- Shell : Le code s'exécute directement sur la machine hôte du Runner. Très rapide, mais dangereux car les dépendances s'accumulent sur le serveur et les jobs peuvent interférer entre eux.
- Docker : L'exécuteur standard et incontournable. Chaque job démarre dans un conteneur vierge et isolé, garantissant que "ça marche sur ma machine ET sur le serveur".
- Kubernetes : Pour les infrastructures massives. Le Runner crée dynamiquement des "Pods" sur un cluster Kubernetes pour exécuter les jobs, offrant une scalabilité infinie.
Plongée dans le fichier config.toml
La véritable puissance d'un administrateur se trouve dans la configuration sous-jacente du Runner. Sous Linux, ce fichier se trouve généralement dans /etc/gitlab-runner/config.toml. C'est ici que vous définissez la capacité de charge de votre machine.
Augmenter la concurrence (Parallélisme)
Par défaut, un Runner n'exécute qu'un seul job à la fois. Si vous avez une machine puissante (ex: 8 cœurs, 32 Go de RAM), c'est un énorme gâchis. La variable globale concurrent permet d'augmenter cette limite.
# /etc/gitlab-runner/config.toml
concurrent = 4
check_interval = 3
log_level = "info"
[[runners]]
name = "Docker-Runner-Production"
url = "https://gitlab.com/"
token = "glrt-XxYyZz1234"
executor = "docker"
[runners.docker]
tls_verify = false
image = "alpine:latest"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache"]
shm_size = 0
Explication des paramètres critiques :
- concurrent = 4 : Ce Runner peut maintenant traiter jusqu'à 4 jobs de n'importe quel projet simultanément.
- check_interval = 3 : Le Runner demandera à GitLab s'il y a du nouveau travail toutes les 3 secondes.
- volumes = ["/cache"] : Indispensable pour que le système de cache (comme les dépendances Node.js ou Maven) persiste entre deux exécutions de conteneurs.
Le mode "Privileged" : Puissance et Danger
Dans la section [runners.docker], vous remarquerez le paramètre privileged = false. Si vous le passez à true, le conteneur exécutant votre job aura un accès quasi-complet au système hôte.
Alerte Sécurité (DevSecOps)
Activer le mode privilégié est souvent nécessaire pour exécuter Docker dans Docker (DinD), mais c'est un risque de sécurité majeur sur un Runner partagé. Ne l'activez que sur des Runners spécifiques dédiés à des projets de confiance. On lui préfère des alternatives "Daemonless" comme Kaniko.
Appliquer les modifications
Contrairement à beaucoup de services Linux, il n'est pas toujours nécessaire de redémarrer brutalement le Runner après une modification du config.toml. Le processus lit le fichier régulièrement. Cependant, pour forcer la prise en compte immédiate, utilisez la commande :
sudo gitlab-runner restart
Conclusion
Maîtriser les Executors et le fichier de configuration config.toml vous permet de transformer une simple machine de calcul en une flotte de Runners taillés sur mesure pour votre architecture.
Maintenant que vos moteurs tournent à plein régime, il est temps d'écrire des partitions plus complexes. Dans le chapitre suivant, nous allons explorer les mots-clés avancés du fichier .gitlab-ci.yml.
Espace commentaire
Écrire un commentaire
Rejoignez la discussion
Vous devez être connecté pour poster un message.
25 commentaires
N'oubliez pas de bien tester vos modifs en staging. Un mauvais
config.tomlpeut paralyser toute votre CI/CD. Vérifiez toujours la syntaxe après chaque edit.Non, un
[[runners]]= un executor. Mais tu peux déclarer plusieurs sections[[runners]]dans le mêmeconfig.tomlpour gérer plusieurs types de jobs.Est-ce que je peux avoir deux executors différents sur le même runner ?
C'est pas au runner de faire le ménage total, c'est à Docker. Ajoute un cron sur l'hôte qui fait un
docker system prune -f.Mon runner Docker ne nettoie pas les conteneurs arrêtés. Mon disque est plein !
Expose les métriques Prometheus du runner. C'est natif, il suffit de configurer l'adresse d'écoute dans le fichier de config.
Une idée pour monitorer l'usage CPU des runners ?
Content que ça aide. Par contre, n'abuse pas du
check_intervaltrop bas, sinon tu vas spammer ton instance GitLab pour rien.Merci pour l'astuce sur le
check_interval. Ça a réduit la latence au lancement des jobs.Oui, tu dois l'ajouter dans la section
[runners.docker]. Par défaut c'est 0, ce qui est trop faible pour du browser testing :Quelqu'un a réussi à faire marcher le
shm_size? J'ai des erreurs de segmentation sur mes tests Selenium.Tout est dit. Si tu veux de la vitesse avec Docker, configure bien tes volumes de cache dans le
config.tomlpour éviter de tout retélécharger à chaque fois.Le shell est plus rapide car il n'y a pas de pull d'image, mais c'est le bordel pour nettoyer les dépendances entre les builds. Docker est plus lent mais beaucoup plus propre.
C'est quoi la différence entre
shelletdockerpour le cache ? J'ai l'impression que le shell est plus rapide.Vérifie la syntaxe, une simple erreur de quote ou de virgule dans le TOML fait planter le parsing. Teste ta config avec
gitlab-runner verify.J'ai fait une modif dans le fichier et
sudo gitlab-runner restartne change rien. Le runner reste en mode dégradé.Utilise les limites Docker directement dans ton
config.toml:Comment je peux limiter la RAM par job ? Avec
concurrent = 4, mes jobs finissent par tuer le serveur hôte.Exact. Tente de forcer
pull_policy = "always"dans la config pour être sûr qu'il ne cherche pas une image locale inexistante.T'as vérifié ton
/etc/gitlab-runner/config.toml? Peut-être que tonpull_policyest mal configuré dans la section[runners.docker].Help, j'ai une erreur
image pull backoffsur mes jobs alors que monconfig.tomlpointe bien sur le bon registry. Je sèche.Oui. Si un job est compromis, l'attaquant a accès au socket Docker de l'hôte. À ne jamais faire en prod sur un runner mutualisé. Regarde du côté de Kaniko pour build tes images sans privilèges.
J'ai testé le mode
privileged = truepour faire du Docker-in-Docker. Ça fonctionne, mais j'ai peur pour la sécurité. C'est vraiment si risqué que ça ?Vérifie tes logs avec
journalctl -u gitlab-runner. Si tu as plusieurs runners enregistrés dans le même fichier, assure-toi de bien modifier la valeur globale en haut du fichier et non juste pour un runner spécifique.Super article. J'ai un souci avec mon
config.toml, le service ne veut pas monter en charge. J'ai misconcurrent = 10mais il ne prend qu'un seul job. Une idée ?