Aller au contenu

runnerhut

Guides

Des solutions aux problèmes de CI que les équipes rencontrent vraiment.

Vitesse13

Comment accélérer les GitHub ActionsVotre pipeline prend plus de temps que quiconque ne voudrait attendre, et il n'est pas évident de savoir où va le temps.Comment trouver l'étape lente dans un flux de travailLe pipeline est lent mais chaque étape semble raisonnable.Comment réduire les démarrages à froid des GitHub ActionsLes tâches restent en attente pendant 30 à 90 secondes avant l'exécution de la première étape.Comment diagnostiquer les temps d'attente GitHub ActionsLes travaux sont mis en file d'attente pendant quelques minutes avant qu'un coureur ne les récupère.Comment accélérer le paiement gitles actions/le paiement prennent quelques minutes sur un grand référentiel.Comment exécuter CI sur un très grand référentielL'extraction, l'indexation et les rapports d'état se dégradent à mesure que le référentiel se développe.Comment accélérer les extractions Git LFSLes objets LFS sont téléchargés en série et dominent le temps de paiement.Comment éliminer les temps d'inactivité dans les emploisLes emplois passent du temps à ne rien faire : attendre un service, une mise en veille ou une boucle d'interrogation.Comment gérer les tâches de longue duréeCertaines tâches durent des heures et atteignent parfois la limite de six heures.Comment exécuter efficacement des builds nocturnesLes builds nocturnes coûtent cher et personne ne lit les résultats.Comment arrêter les tempêtes de réexécution de CILes développeurs réexécutent les tâches défaillantes à plusieurs reprises, multipliant les coûts et masquant les échecs réels.Comment partager des tests sur une matriceUn long travail de test domine le pipeline.Comment exécuter uniquement les tests concernés par un changementChaque push exécute l'intégralité de la suite de tests, quel que soit ce qui a changé.

Coût13

Comment réduire les coûts des GitHub ActionsLa facture de CI augmente plus vite que l’équipe et personne ne sait pourquoi.Comment mesurer le coût CI par pull requestVous connaissez le total mensuel, mais pas ce que coûte une seule demande de tirage.Comment attribuer le coût de l'IC aux équipesLes dépenses CI ne représentent qu'une seule ligne sur la facture et aucune équipe ne s'en sent responsable.Comment définir un budget de minutes CILes dépenses sont découvertes à la fin du mois plutôt que contrôlées pendant celui-ci.Quand les grands coureurs économisent réellement de l’argentUn coureur plus gros coûte plus cher par minute, il n’est donc pas clair s’il est globalement moins cher.Comment réduire les coûts des coureurs macOSmacOS domine la facture CI.Comment réduire les coûts de sortie CILe transfert de données représente une part importante et croissante de la facture BYOC.Comment réduire les coûts de tirage ECRLes extractions d’images de conteneurs génèrent des frais de transfert de données importants.Comment réduire les coûts de transfert S3 dans CILe trafic de cache et d’artefacts vers S3 coûte cher.Le coût réel des coureurs auto-hébergésLes coureurs auto-hébergés semblent gratuits à côté de la facturation à la minute.Comment utiliser les instances ponctuelles pour les exécuteurs CILes instances à la demande sont coûteuses pour les charges de travail qui sont intrinsèquement réessayables.Comment dimensionner vos coureursLes tailles des coureurs ont été choisies une seule fois et n’ont jamais été revisitées.Comment exécuter CI de manière économique sur open sourceLe CI open source est gratuit sur les coureurs hébergés sur GitHub, mais lent et l'auto-hébergement n'est pas sûr.

Mise en cache16

Comment faire en sorte que les caches CI persistent réellementLes caches sont configurés mais le taux de réussite est faible.Comment contourner la limite de cache de 10 GoVos caches dépassent 10 Go par référentiel et commencent à être expulsés silencieusement.Comment partager un cache de build entre les référentielsChaque référentiel conserve son propre cache pour les mêmes dépendances partagées.Comment partager un cache Docker entre les jobsChaque jambe de matrice reconstruit les mêmes couches.Comment réparer l'invalidation du cache DockerLes couches Docker se reconstruisent même lorsque les fichiers concernés n'ont pas changé.Comment écrire une clé de cache qui frappeLe cache est configuré mais manque à chaque exécution.Comment utiliser ccache dans GitHub ActionsLes builds C et C++ recompilent tout à chaque exécution.Comment utiliser sccache pour les builds RustCargo reconstruit les dépendances chaque fois que le cache du répertoire cible manque.Comment activer le cache de configuration GradleGradle passe 30 à 60 secondes à configurer avant de compiler quoi que ce soit.Comment mettre en cache les gestionnaires de chaîne d'outilsmise, asdf ou proto réinstallent les environnements d'exécution du langage à chaque exécution.Comment mettre en cache les packages NuGetdotnet recovery télécharge les mêmes packages à chaque exécution.Comment mettre en cache les transformations JestJest retransforme chaque fichier à chaque exécution.Comment mettre en cache les packages vcpkg et ConanLes gestionnaires de dépendances C++ reconstruisent les packages à partir des sources à chaque exécution.Comment mettre en cache Xcode DerivedDataXcode reconstruit l'intégralité du projet à chaque exécution de CI.Choisir un backend de cache buildxIl existe quatre backends de cache et on ne sait pas lequel utiliser.Comment garder le cache de la branche de base au chaudLes nouvelles branches de fonctionnalités commencent toujours par un cache froid.

Docker12

Comment configurer la mise en cache des couches DockerLes builds Docker prennent dix minutes car chaque couche est reconstruite.Comment optimiser un Dockerfile pour CIDe petits changements de code déclenchent de longues reconstructions.Comment utiliser les builds Docker en plusieurs étapesLes images sont volumineuses et contiennent des outils de construction qui ne devraient pas être livrés.Comment exécuter des builds Docker simultanés en toute sécuritéLes jambes de matrice parallèles s'affrontent et les constructions ralentissent ou échouent.Comment utiliser un générateur Docker distantLe cache de couches est transféré vers et depuis le programme d'exécution à chaque build.Comment créer rapidement des images multiplateformesL'ajout de Linux/arm64 fait que la construction prend vingt minutes.Comment réduire la taille de l'image du conteneurLes images pèsent des centaines de mégaoctets et sont lentes à être extraites à chaque tâche.Comment transmettre des secrets dans une version DockerVous avez besoin d'un jeton de registre privé ou d'une clé SSH pendant la construction.Comment configurer les profils du constructeur DockerDifférentes images nécessitent différentes ressources de création.Comment créer de nombreuses images à partir d'un monorepoChaque push crée chaque image dans le référentiel.Comment publier sur plusieurs registresLa même image est créée une fois par registre.Comment configurer un cache pull-through de registreL'extraction d'images est lente et vous continuez à atteindre les limites de débit du Docker Hub.

Échelle28

Comment faire évoluer les coureurs auto-hébergésLes coureurs auto-hébergés font la queue aux heures de pointe ou restent inactifs et coûteux.Comment utiliser les groupes de coureursN'importe quel référentiel peut planifier des tâches sur n'importe quel exécuteur.Comment concevoir une stratégie d'étiquette de coureurLes étiquettes se sont développées de manière organique et personne ne sait laquelle utiliser.Hébergé ou BYOC : comment choisirVous ne savez pas s'il faut utiliser des exécuteurs hébergés ou déployer dans votre propre cloud.Comment utiliser des workflows réutilisables à grande échelleCinquante référentiels contiennent cinquante copies légèrement différentes du même pipeline.Comment coordonner les flux de travail entre les référentielsUne modification dans un référentiel doit déclencher des builds dans d’autres.Comment créer des images de coureur personnaliséesChaque travail nécessite quelques minutes pour installer les mêmes outils.Comment déployer les mises à jour des images de base en toute sécuritéUne mise à jour de l’image de base interrompt les builds sur plusieurs référentiels à la fois.Comment gérer la charge CI du bot de dépendanceDependabot ouvre trente pull request et pics de coûts CI.Comment travailler avec des limites de concurrenceFile d'attente des travaux et il n'est pas clair quelle limite est contraignante.Comment utiliser efficacement les tâches de conteneurLes tâches de conteneur offrent une reproductibilité mais interrompent la mise en cache.Comment utiliser correctement les conteneurs de servicesLes tests échouent par intermittence au démarrage.Comment construire une fois et déployer plusieurs foisLe même artefact est reconstruit pour chaque environnement.Comment structurer les tâches de déploiementLes déploiements sont lents, risqués et difficiles à auditer.Comment exécuter efficacement les environnements de prévisualisationChaque demande d'extraction attend une construction d'environnement complète.Comment structurer les versions de versionLes versions de version sont lentes et parfois non reproductibles.Comment publier des artefacts de buildLes coûts de stockage des artefacts augmentent et la rétention n'a jamais été configurée.Comment gérer les téléchargements d'artefacts volumineuxLe téléchargement du résultat de la build prend quelques minutes.Comment obtenir des builds incrémentielles dans CICI effectue toujours une build propre même si votre système de build prend en charge la compilation incrémentielle.Comment transmettre des données entre les tâchesLes tâches doivent partager le résultat de la construction et on ne sait pas comment.Comment bien utiliser les builds matricielsLa matrice s'est agrandie et personne ne se souvient pourquoi chaque combinaison existe.Comment contrôler l'explosion de la matriceUn petit changement de matrice a triplé le nombre de tâches et la facture.Comment dimensionner les coureurs pour les builds JavaVous devinez une taille de coureur pour une version Maven ou Gradle.Comment dimensionner les coureurs pour les suites de tests NodeLes travailleurs de Jest ou de Vitest meurent de faim ou se débattent et vous ne savez pas exactement lequel.Comment dimensionner les coureurs pour les suites de tests Pythonpytest s'exécute sur un cœur tandis que le coureur en a huit inactifs.Comment dimensionner les coureurs pour les versions RustCargo construit une échelle avec des noyaux, mais on ne sait pas jusqu'où cela va.Comment dimensionner les coureurs pour les builds DockerVous choisissez une taille de coureur pour les créations d’images.Comment dimensionner les coureurs pour les versions AndroidLes assemblages Gradle et les tests d'instrumentation nécessitent des machines très différentes.