À mesure que les entreprises se développent, leurs produits deviennent de plus en plus complexes, ce qui rend essentiel l'application de tests rigoureux et la garantie de la stabilité. Okta n'est pas étranger à ce défi. Nous effectuons des centaines de milliers de tests sur chaque modification de notre système d'intégration continue (CI) afin de détecter les problèmes plus tôt dans le cycle de vie du développement.
Notre échelle opérationnelle est énorme et nos services reçoivent plus de 500 000 validations par an. Cependant, nous avons nous aussi été confrontés au problème de l'instabilité des tests dans notre code de base monolithique. Nos validations de la ligne principale avaient un taux de réussite de moins de 40 % lors de la première exécution d'une validation à partir de tests instables. Nous avions besoin d'une méthode fiable pour déterminer quand un problème survenait, débloquer d'autres ingénieurs et contacter immédiatement les équipes correspondantes pour enquêter.
Le processus manuel
Historiquement, une solution partielle à ce problème consistait à demander à un ingénieur de garde de vérifier si les validations sur notre branche principale réussissaient ou échouaient aux tests sur notre CI. Si un test échouait sur la branche principale, nous devions analyser les journaux et les traces de pile pour déterminer la validité d'un échec et consulter ensuite l'équipe appropriée.
Chaque lundi, l'ingénieur de garde examinait les défaillances de la semaine passée, compilait manuellement une liste de tickets Jira, rassemblait les données relatives aux défaillances et envoyait un courriel aux équipes d'ingénierie. Cependant, cette approche avait des défauts évidents.
- Un échec peut être manqué ou négligé en raison d'une erreur humaine.
- C'était une tâche longue, car l'ingénieur devait identifier la cause première, puis trouver qui avait les connaissances et le contexte nécessaires pour résoudre le problème.
- L'ingénieur de garde a dû passer de nombreuses heures à se former. Assurer ce rôle nous coûte quatre mois de temps d'ingénierie chaque année.
- Ce n'était ni fiable ni évolutif.
- Beaucoup de connaissances collectives sont nécessaires. Par exemple, il existe de nombreuses requêtes SQL héritées assemblées à la main pour découvrir les défaillances
Qu'est-ce qu'une défaillance urgente?
Pour rendre ce processus fiable, nous avions besoin d'un moyen strict de déterminer ce qui constituait une interruption urgente ou non urgente. Nous désignerons le premier scénario par P0. Vous vous demandez peut-être pourquoi nous ne traitons pas chaque test qui a échoué sur la branche principale immédiatement. Cela se produirait dans un environnement idéal (dont nous nous rapprochons), mais il n'est pas surprenant que sur les centaines de milliers de tests que nous effectuons, un certain nombre de tests échouent de manière incohérente (on dit qu'ils sont « instables »). Il serait déraisonnable et impraticable de demander aux ingénieurs d'autres équipes de tout laisser tomber et de corriger des centaines de tests instables.
Notre solution immédiate a été de trouver des P0 en fonction d’un critère de pourcentage de la fréquence à laquelle un test échouait. Cependant, il s’agit d’un indicateur retardé, et un retard important dans le rapport se produirait si un test échouait complètement. Nous avions besoin d’un moyen de détecter immédiatement les ruptures réelles et de résoudre progressivement les tests non fiables. Après avoir créé un programme pour exécuter d'innombrables simulations, nous avons finalement trouvé une solution.
Notre solution initiale : Ouvrir un ticket pour une méthode de test en tant que P0 si elle échoue dans deux commits au cours des cinq dernières exécutions ou si elle échoue plus de 25 % du temps dans au moins 100 exécutions.
Maintenant que nous avons clairement défini la portée du problème, nous pouvons enfin l'automatiser.
Présentation d'AutoGuardian
AutoGuardian est notre service qui surveille périodiquement les tests pour gérer les échecs. Ci-dessous, un tableau présente un bref résumé de ses responsabilités.
Les avantages d'AutoGuardian ont été transformateurs, améliorant considérablement le flux de travail quotidien de notre équipe. Il identifie et signale les problèmes, rationalise la communication et se connecte à un service distinct qui empêche notre intégration continue (CI) d'exécuter des tests échoués pour d'autres développeurs.
L’exclusion des tests est essentielle pour s’assurer que les développeurs ne sont pas empêchés de fusionner en raison de tests défectueux et pour nous aider à réduire les coûts en évitant les exécutions inutiles sur les tests dont nous savons déjà qu’ils sont défectueux. En bref, AutoGuardian permet à notre équipe de se concentrer sur les progrès plutôt que de s’enliser dans le dépannage, ce qui rend notre processus de développement plus efficace.
AutoGuardian est désormais un service essentiel sur lequel nous comptons, offrant une économie annuelle estimée à plus de 1 000 000 $. Il ne s'agissait que de la conception initiale. Nous l'avons depuis améliorée en ajoutant l'agrégation des problèmes qui regroupe les problèmes par traces de pile similaires, le renforcement automatique des critères et l'amélioration des rapports de données. Par conséquent, nous détectons désormais plus de 1900 % de tests non fiables supplémentaires par rapport à avant AutoGuardian, ce qui porte notre taux de réussite de la branche principale à plus de 80 %. Cette transformation rationalise le processus de développement et contribue à réduire les durées d'exécution des commits de 50 %, ce qui permet à nos ingénieurs de se concentrer sur l'innovation plutôt que sur le dépannage, favorisant ainsi une expérience de développement plus productive.
Révolutionnez vos processus grâce à l'automatisation
La plupart des entreprises technologiques ont une forme de processus de garde, et nous n'avons fourni qu'un seul exemple de la raison pour laquelle vous devriez vous efforcer d'automatiser autant que possible. Lorsqu'une tâche doit être effectuée manuellement, demandez-vous toujours, à vous-même et aux autres, « Pourquoi? » L'adoption de l'automatisation permet de gagner un temps précieux aux développeurs et d'améliorer la résilience, la fiabilité et la sécurité de votre produit.
Vous avez des questions sur cet article de blog ? Contactez-nous à l'adresse eng_blogs@okta.com. Consultez d'autres blogs d'ingénierie d'Okta pour approfondir vos connaissances.
Prêt à rejoindre notre équipe passionnée d'ingénieurs exceptionnels ? Consultez notre page carrière.