Gitlab Runner

Pourquoi Les Runners GitLab Sont Lents et Comment Les Optimiser

Guénolé Delanoë
·
August 19, 2023

Les pipelines d'intégration et de déploiement continu (CI/CD) sont la colonne vertébrale du développement logiciel moderne, permettant aux équipes d'automatiser les tests, la construction et le déploiement des applications. GitLab, une plateforme open-source largement utilisée, intègre la fonctionnalité CI/CD, avec des runners GitLab exécutant ces tâches cruciales. Cependant, des runners GitLab lents peuvent significativement freiner les performances de votre pipeline CI/CD, causant des retards dans les déploiements, une productivité réduite et des pertes potentielles de revenus.

Par exemple, une grande entreprise fintech a récemment fait face à de sévères retards dans ses processus CI/CD en raison de runners sous-dimensionnés. Cela a conduit à une baisse de 30 % de la productivité des développeurs, car les ingénieurs passaient plus de temps à attendre la fin des builds qu'à écrire du code. Ce goulot d'étranglement a non seulement retardé les sorties de fonctionnalités, mais a également impacté la satisfaction des clients et l'avantage concurrentiel de l'entreprise.

Si vous luttez contre des runners GitLab lents, vous n'êtes pas seul. De nombreux utilisateurs rencontrent ce problème pour diverses raisons, telles que des limitations CPU, une mémoire insuffisante ou une pression réseau. C'est pourquoi nous avons créé notre propre entreprise de runners GitLab cloud haute performance.

Pour mieux comprendre pourquoi vos runners pourraient être lents, consultez notre article sur le sujet. Nous discutons des causes typiques et offrons des conseils pour améliorer les performances.

Comprendre Où Fonctionnent Vos Runners GitLab

Runners Gérés par GitLab.com

Les runners gérés par GitLab.com fonctionnent généralement sur des instances de machines virtuelles (VM) sur des plateformes telles que Google Cloud Platform (GCP), offrant des ressources limitées comme 2 cœurs CPU et 2 Go de RAM. Bien que ces runners gérés soient pratiques et souvent gratuits, ils peuvent ne pas suffire pour les tâches CI/CD gourmandes en ressources, entraînant des goulots d'étranglement de performances et des temps d'exécution lents.

Runners Auto-Hébergés

D'autre part, les runners auto-hébergés permettent aux organisations d'avoir un meilleur contrôle sur l'allocation des ressources et les configurations des runners. En gérant leur propre infrastructure, les équipes peuvent adapter les ressources aux besoins spécifiques de la charge de travail. Cependant, cette approche nécessite des efforts supplémentaires de configuration et de maintenance.

Identifier les Causes des Performances Lentes

Évaluation de l'Utilisation des Ressources

Pour diagnostiquer les problèmes de performance, envisagez de configurer un nouveau runner localement ou sur un serveur sur site avec des ressources suffisantes. Cet environnement contrôlé vous permet de tester les performances en dehors de l'infrastructure gérée de GitLab. Surveillez de près les performances du nouveau runner pour déterminer si les ralentissements sont dus à une insuffisance de CPU, de RAM ou de ressources réseau.

Analyse des Métriques Système

Analysez l'utilisation du CPU, de la mémoire et les métriques d'accès réseau du nouveau runner. Si ces métriques ne montrent aucune valeur alarmante, il est temps de se concentrer sur l'optimisation de votre configuration CI/CD GitLab elle-même.

Améliorer les Performances de Mon Runner GitLab

Techniques de Caching Avancées

Les tâches CI/CD sont souvent très répétitives, avec environ 98 % de la sortie des pipelines CI/CD précédents étant réutilisés. Mettre en œuvre des techniques de caching avancées, telles que le caching S3, le caching des images Docker, le caching des réponses HTTP et le caching des artefacts de build, peut considérablement améliorer les performances.

Par exemple, une grande entreprise de commerce électronique a amélioré la vitesse de son pipeline de 40 % simplement en cachant les images Docker, réduisant les tâches redondantes et rationalisant son processus CI/CD.

Assurer des Ressources Systèmes Adéquates

Traitez toute limitation de ressources en ajoutant plus de cœurs CPU, en augmentant la capacité de RAM ou en améliorant la connectivité réseau. Cela peut éliminer les goulots d'étranglement et améliorer les performances globales.

Optimiser Mon CI/CD GitLab

Paralléliser les Tâches

Avant l'optimisation :

Dans de nombreux pipelines CI/CD, les tâches sont souvent exécutées séquentiellement, ce qui peut entraîner des retards significatifs, surtout si certaines tâches ne dépendent pas les unes des autres.

stages:
 - build
 - test
 - deploy

build:
 stage: build
 script:
   - echo "Construction du projet..."
   - ./build.sh

test:
 stage: test
 script:
   - echo "Exécution des tests..."
   - ./test.sh

deploy:
 stage: deploy
 script:
   - echo "Déploiement du projet..."
   - ./deploy.sh


Après l'optimisation :

Pour maximiser l'efficacité, les tâches qui ne dépendent pas les unes des autres peuvent être exécutées en parallèle en utilisant des tâches parallèles dans la même étape.

stages:
 - build
 - test
 - deploy

build:
 stage: build
 script:
   - echo "Construction du projet..."
   - ./build.sh

unit_test:
 stage: test
 script:
   - echo "Exécution des tests unitaires..."
   - ./unit_test.sh

integration_test:
 stage: test
 script:
   - echo "Exécution des tests d'intégration..."
   - ./integration_test.sh

deploy:
 stage: deploy
 script:
   - echo "Déploiement du projet..."
   - ./deploy.sh

Explication :

Dans la version optimisée, l'étape de test contient à la fois les tâches unit_test et integration_test. En les configurant comme des tâches distinctes au sein de la même étape, GitLab CI/CD peut les exécuter en parallèle s'il y a suffisamment de ressources de runner. Cette approche réduit le temps d'exécution global du pipeline, rendant le processus CI/CD plus efficace et accélérant la livraison de nouvelles fonctionnalités et corrections.

Préconstruction des Dépendances

Avant l'optimisation :

Chaque exécution de pipeline peut impliquer la reconstruction des images Docker et le téléchargement des dépendances, ce qui est redondant et prend du temps.

stages:
 - build
 - test
 - deploy

build:
 stage: build
 script:
   - docker build -t my-app .
   - docker run my-app npm install

test:
 stage: test
 script:
   - docker run my-app npm test

deploy:
 stage: deploy
 script:
   - docker run my-app npm run deploy


Après l'optimisation :

Préconstruisez les images Docker et cachez les dépendances pour éviter les tâches redondantes.

stages:
 - prebuild
 - build
 - test
 - deploy

prebuild:
 stage: prebuild
 script:
   - docker build -t my-app .
   - docker create --name my-app-container my-app
   - docker cp package.json my-app-container:/app/
   - docker cp package-lock.json my-app-container:/app/
   - docker start my-app-container
   - docker exec my-app-container npm install
   - docker commit my-app-container my-app-with-deps
   - docker rm my-app-container

build:
 stage: build
 script:
   - docker run my-app-with-deps npm run build

test:
 stage: test
 script:
   - docker run my-app-with-deps npm test

deploy:
 stage: deploy
 script:
   - docker run my-app-with-deps npm run deploy


Explication :

Dans la version optimisée, l'étape prebuild s'occupe de la construction de l'image Docker et de l'installation des dépendances. L'image résultante est réutilisée dans les étapes suivantes, réduisant considérablement le temps consacré aux tâches redondantes.

Optimiser l'Exécution des Tâches

Avant l'optimisation :

Les tâches telles que la construction des images Docker ou le téléchargement des dépendances sont exécutées dans le pipeline, ce qui peut ralentir le processus global.

stages:
 - build
 - test
 - deploy

build:
 stage: build
 script:
   - docker build -t my-app .
   - docker run my-app npm install

test:
 stage: test
 script:
   - docker run my-app npm test

deploy:
 stage: deploy
 script:
   - docker run my-app npm run deploy

Après l'optimisation :

Déplacez ces tâches en dehors du pipeline pour rationaliser l'exécution.

stages:
 - build
 - test
 - deploy

build:
 stage: build
 script:
   - docker build -t my-app:latest .

test:
 stage: test
 script:
   - docker run my-app:latest npm test

deploy:
 stage: deploy
 script:
   - docker run my-app:latest npm run deploy

Explication :

En préconstruisant les images Docker et en gérant les dépendances en dehors du pipeline principal, l'exécution globale devient plus efficace. L'étape de build se contente de tirer et d'exécuter l'image préconstruite, accélérant ainsi considérablement le processus.

Maximiser l'Utilisation du CPU

Avant l'optimisation :

Les pipelines CI/CD n'utilisent souvent pas pleinement les ressources CPU disponibles, entraînant des inefficacités.

test:
 stage: test
 script:
   - echo "Exécution des tests..."
   - ./run_tests.sh

Après l'optimisation :

Optimisez la suite de tests pour tirer parti des capacités de multi-threading.

yamlCopier le code

test:
 stage: test
 script:
   - echo "Exécution des tests..."
   - ./run_tests.sh --parallel

Explication :

En configurant la suite de tests pour s'exécuter en parallèle, plusieurs tests peuvent s'exécuter simultanément, utilisant pleinement les cœurs CPU disponibles. Cela réduit le temps d'exécution global des tests et améliore l'efficacité du pipeline.

Conclusion

En conclusion, l'optimisation des runners GitLab implique de comprendre où ils fonctionnent, de diagnostiquer les problèmes de performance et de mettre en œuvre des techniques de caching avancées et des améliorations de ressources. En parallélisant les tâches, en préconstruisant les dépendances et en maximisant l'utilisation du CPU, vous pouvez améliorer significativement les performances de votre pipeline CI/CD, assurant une livraison plus rapide et plus efficace des logiciels.

Découvrez la puissance des runners GitLab haute performance avec Cloud-Runner. Explorez nos services et réduisez par 4 le temps de vos pipelines CI/CD dès aujourd'hui !

Untitled UI logotext
© 2024 Cloud-Runner. All rights reserved.