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.
bras647
Comment déplacer CI vers les coureurs arm64Vous déployez sur Graviton ou Ampere mais construisez sur x64.liste de contrôle de migration arm64Vous souhaitez passer à arm64 sans rompre le pipeline.Compilation croisée par rapport à arm64 natifVous avez besoin de binaires arm64 et vous ne savez pas s'il faut effectuer une compilation croisée ou une construction native.Pourquoi les builds QEMU arm64 sont si lentesL'ajout de Linux/arm64 à une version Docker la rend vingt fois plus lente.Correction des modules natifs de Node sur arm64L'installation de npm échoue ou se compile à partir des sources sur les coureurs arm64.Fixation des roues Python sur arm64pip install compile les packages à partir des sources sur arm64.S'appuyer sur les coureurs AWS GravitonVous voulez l’avantage prix-performance Graviton en CI.
macOS et iOS8
Comment réduire les temps de construction de Xcode dans CILes builds Xcode prennent vingt minutes à chaque exécution.Comment accélérer les tests du simulateur iOSLes tests sur simulateur durent une demi-heure.Comment gérer la signature de code iOS dans CILa signature fonctionne localement et échoue par intermittence dans CI.Comment légaliser les applications macOS dans CILa notarisation est lente et expire parfois.Correction de l'épuisement du disque d'exécution macOSLes tâches échouent et il ne reste plus d'espace sur l'appareil sous macOS.Comment paralléliser iOS CIiOS CI est en série et les minutes macOS coûtent cher.Comment télécharger sur TestFlight depuis CILes téléchargements TestFlight sont lents et échouent parfois après une construction réussie.Comment épingler les versions de XcodeUne mise à jour de l'image du coureur a modifié silencieusement la version de Xcode et votre build a changé avec elle.
Fenêtres5
Comment rendre Windows CI plus rapideLes tâches Windows prennent trois fois plus de temps que les tâches Linux équivalentes.Comment mettre en cache la sortie MSBuildChaque build recompile tous les projets.Installation des composants Visual Studio dans CIUne charge de travail VS requise est manquante et son installation prend quinze minutes.Comment signer les binaires Windows dans CILa signature Authenticode nécessite un certificat qui ne doit pas être exposé.Comment paralléliser les tests .NETLes tests .NET s'exécutent en série et durent vingt minutes.
Sécurité6
Comment gérer les secrets dans GitHub ActionsLes secrets sont répartis dans les paramètres du référentiel et personne ne sait ce qui est encore utilisé.Comment exécuter des exécuteurs CI dans votre VPCLes builds doivent atteindre un service interne qui n’est pas exposé publiquement.Comment donner aux coureurs une IP statiqueUn service tiers nécessite une liste blanche d'adresses IP et les adresses IP des exécuteurs hébergés changent constamment.Comment exécuter des analyses de sécurité sans ralentir CIL'analyse des vulnérabilités ajoute des minutes à chaque demande d'extraction.Comment sécuriser votre chaîne d'approvisionnement CILes actions tierces s'exécutent avec accès à votre référentiel et à vos secrets.Comment renforcer les autorisations de flux de travailChaque flux de travail s'exécute avec un accès en écriture dont il n'a pas besoin.
Observabilité10
Comment collecter les métriques des coureursVous ne pouvez pas savoir si une tâche est liée au processeur, à la mémoire ou au disque.Comment suivre les centiles de durée de constructionLe temps de construction moyen semble correct, mais les développeurs se plaignent toujours.Comment exporter des traces CI avec OpenTelemetryLes données de synchronisation CI se trouvent dans un outil distinct du reste de votre observabilité.Comment interroger les données CI par programmationVous avez besoin de données CI dans un tableau de bord ou un rapport hebdomadaire.Comment générer un rapport hebdomadaire sur l'état de santé de CIL'IC se dégrade progressivement et personne ne le remarque jusqu'à ce qu'il soit mauvais.Comment alerter sur les régressions CIUn changement ralentit l’IC de 40 % et passe inaperçu pendant des semaines.Comment gérer les emplois CI instablesLes tests échouent de manière aléatoire et les gens réessayent jusqu'à ce qu'ils réussissent.Comment déboguer un workflow défaillantUn travail échoue dans CI et fonctionne partout ailleurs.Comment définir les niveaux de service CIPersonne n’est d’accord sur la rapidité avec laquelle l’IC devrait être effectuée, c’est pourquoi elle n’est jamais une priorité.Comment exposer les données CI aux agents IALes agents déboguant les échecs de CI disposent uniquement du texte du journal avec lequel travailler.
É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.