Mit zunehmender Unternehmensgröße werden auch die Produkte immer komplexer. Daher ist es unerlässlich, strenge Tests durchzuführen und die Stabilität sicherzustellen. Auch Okta kennt diese Herausforderung. Wir führen Hunderttausende von Tests bei jeder Änderung in unserem Continuous Integration (CI)-System durch, um Probleme frühzeitig im Entwicklungszyklus zu erkennen. 

Unsere operative Größenordnung ist enorm, und unsere Services erhalten jährlich über 500.000 Commits. Aber auch wir hatten mit dem Problem der Test-Flakiness in unserer monolithischen Codebasis zu kämpfen. Unsere Mainline-Commits hatten beim ersten Durchlauf eines Commits aufgrund von fehlerhaften Tests eine Erfolgsquote von weniger als 40 %. Wir brauchten eine zuverlässige Methode, um herauszufinden, wann ein Problem auftrat, andere Entwickler zu entlasten und sofort die zuständigen Teams zu kontaktieren, um Nachforschungen anzustellen.

Der manuelle Prozess

In der Vergangenheit bestand eine Teillösung für dieses Problem darin, dass ein diensthabender Techniker überwachte, ob Commits in unserem Hauptzweig Tests in unserer CI bestanden oder nicht. Wenn ein Test auf dem Hauptzweig fehlschlug, mussten wir Protokolle und Stacktraces analysieren, um die Gültigkeit eines Fehlers zu bestimmen und uns dann mit dem entsprechenden Team beraten. 

Jeden Montag überprüfte der diensthabende Ingenieur die Fehler der vergangenen Woche, erstellte manuell eine Liste von Jira-Tickets, sammelte Daten zu den Fehlern und schickte eine E-Mail an die Engineering-Teams. Dieser Ansatz hatte jedoch offensichtliche Mängel.
 

  1. Ein Fehler kann aufgrund eines menschlichen Fehlers übersehen oder überblickt werden.
  2. Es war zeitaufwendig, da der Techniker die Ursache herausfinden und dann herausfinden musste, wer über das Wissen und den Kontext verfügte, um das Problem zu beheben.
  3. Der diensthabende Techniker musste viele Stunden mit der Einarbeitung verbringen.  Die Ausübung dieser Funktion kostet uns jedes Jahr vier Monate Entwicklungszeit.
  4. Es war weder zuverlässig noch skalierbar.
  5. Es ist viel kollektives Wissen erforderlich. Zum Beispiel gibt es zahlreiche ältere, handgestrickte SQL-Abfragen, um Fehler zu entdecken

Was ist ein dringender Fehler?

Um diesen Prozess zuverlässig zu gestalten, benötigten wir eine strenge Methode, um zu bestimmen, was einen dringenden oder nicht dringenden Ausfall darstellt. Wir bezeichnen das erste Szenario als P0. Sie fragen sich vielleicht, warum wir nicht jeden einzelnen Test beheben, der sofort auf Main fehlgeschlagen ist. Das würde in einer idealen Umgebung passieren (der wir jetzt näher sind), aber es ist keine Überraschung, dass von den Hunderttausenden von Tests, die wir durchführen, einige Tests inkonsistent fehlschlagen (diese gelten als „flaky“, d. h. fehlerhaft). Es wäre unzumutbar und unpraktisch, von Ingenieuren anderer Teams zu verlangen, alles stehen und liegen zu lassen und Hunderte von fehlerhaften Tests zu beheben.

Unsere unmittelbare Lösung bestand darin, P0s anhand eines prozentualen Kriteriums zu finden, wie oft ein Test fehlschlug. Dies ist jedoch ein nachlaufender Indikator, und es würde zu einer erheblichen Verzögerung bei der Meldung kommen, wenn ein Test vollständig fehlschlägt. Wir brauchten eine Möglichkeit, tatsächliche Ausfälle sofort zu erkennen und fehlerhafte Tests inkrementell zu beheben. Nachdem wir ein Programm erstellt hatten, um unzählige Simulationen durchzuführen, erreichten wir schließlich eine Lösung.

Unsere ursprüngliche Lösung: Eröffnen Sie ein Ticket für eine Testmethode als P0, wenn sie in zwei Commits in den letzten fünf Durchläufen fehlschlägt oder wenn sie in mindestens 100 Durchläufen mehr als 25 % der Zeit fehlschlägt.

Nachdem wir den Problembereich klar definiert haben, k nnen wir ihn endlich automatisieren.

Einführung von AutoGuardian

AutoGuardian ist unser Dienst, der regelmäßig Tests überwacht, um Fehler zu beheben. Unten zeigt ein Diagramm eine kurze Zusammenfassung seiner Verantwortlichkeiten.                                      

Die Vorteile von AutoGuardian sind transformativ und haben den täglichen Workflow unseres Teams erheblich verbessert. Es identifiziert und meldet Probleme, rationalisiert die Kommunikation und verbindet sich mit einem separaten Dienst, der verhindert, dass unsere CI fehlgeschlagene Tests für andere Entwickler ausführt. 

Der Testausschluss ist entscheidend, um sicherzustellen, dass Entwickler nicht durch fehlerhafte Tests am Zusammenführen gehindert werden, und um uns zu helfen, Kosten zu senken, indem wir unnötige Ausführungen von Tests vermeiden, von denen wir bereits wissen, dass sie fehlerhaft sind. Kurz gesagt, AutoGuardian ermöglicht es unserem Team, sich auf den Fortschritt zu konzentrieren, anstatt sich in der Fehlersuche zu verlieren, was unseren Entwicklungsprozess effizienter und effektiver macht.

AutoGuardian ist jetzt ein wichtiger Service, auf den wir uns verlassen, der geschätzte jährliche Kostenersparnisse von über 1.000.000 USD ermöglicht. Dies war nur der erste Entwurf. Wir haben ihn seither durch das Hinzufügen einer Issue-Aggregation, die Issues nach ähnlichen Stacktraces gruppiert, einer automatischen Kriterienverschärfung und einer verbesserten Datenberichterstattung weiter verbessert. Infolgedessen fangen wir jetzt über 1900 % mehr Flaky Tests ab als vor AutoGuardian, wodurch unsere Mainline-Passrate auf über 80 % gesteigert wird. Diese Transformation rationalisiert den Entwicklungsprozess und hilft, die Commit-Laufzeiten um 50 % zu reduzieren, sodass sich unsere Ingenieure auf Innovationen statt auf Fehlerbehebung konzentrieren können, was eine produktivere Entwicklungsumgebung fördert.

Revolutionieren Sie Ihre Prozesse mit Automatisierung

Die meisten Technologieunternehmen haben eine Art Bereitschaftsdienst, und wir haben nur ein Beispiel dafür gegeben, warum Sie sich bemühen sollten, so viel wie möglich zu automatisieren. Wenn etwas manuell erledigt werden muss, fragen Sie sich und andere immer: „Warum?“ Die Automatisierung spart wertvolle Entwicklerzeit und verbessert die Ausfallsicherheit, Zuverlässigkeit und Sicherheit Ihres Produkts.

Haben Sie Fragen zu diesem Blogbeitrag? Kontaktieren Sie uns unter eng_blogs@okta.com. Entdecken Sie weitere aufschlussreiche Engineering Blogs von Okta, um Ihr Wissen zu erweitern. 

Möchten Sie unserem leidenschaftlichen Team aus außergewöhnlichen Ingenieuren beitreten? Besuchen Sie unsere Karriereseite

Setzen Sie Ihre Identity Journey fort