$30 off During Our Annual Pro Sale. View Details »

Wie wir unsere Test-Pipeline stabilisierten

Wie wir unsere Test-Pipeline stabilisierten

Je größer ein Projekt wird, desto mehr Testfälle gibt es, und desto länger dauert meist auch die Ausführung. Instabile Tests und abbrechende Builds werden dann zu einem großen Ärgernis, das für Frustration sorgt.

Im Open-Source-Projekt Keycloak sind wir das Problem in in 2023 neu angegangen: Statt abbrechender Builds gibt es bei uns nun kontrollierte Wiederholungen, Protokollierung und Überwachung, und das ganze automatisiert über Maven und GitHub-APIs. Builds brechen dadurch seltener ab, und instabile Tests können besser identifiziert und angegangen werden.

Der Vortrag stellt unsere Lösung im Detail vor und berichtet über die Erfahrungen damit. Alle Teile sind öffentlich auf GitHub verfügbar.

Alexander Schwartz

October 19, 2023
Tweet

More Decks by Alexander Schwartz

Other Decks in Programming

Transcript

  1. Wie wir unsere Testpipeline stabilisierten
    Alexander Schwartz, Principal Software Engineer @ Red Hat
    BaselOne | 2023-10-19

    View Slide

  2. CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 2
    Wie wir unsere Testpipeline stabilisierten
    Motivation
    1
    Umsetzung für Keycloak
    2
    Einsatz in der Praxis
    3
    Zusammenfassung
    4

    View Slide

  3. CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 3
    Motivation
    Dieser Vortrag ist für dich, …
    … wenn mindestes eines der folgenden Dinge zutrifft:
    • Wenn du an GitHub APIs und Erweiterungen interessiert bist.
    • Tests mit Maven ausführst.
    • Hoffnung für deine eigene Pipeline benötigst.
    • Open Source DIY magst.
    Er ist eher nicht für dich:
    • Wenn du eine schlüsselfertige Lösung suchst.

    View Slide

  4. CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 4
    Wie wir unsere Testpipeline stabilisierten
    Motivation
    1
    Umsetzung für Keycloak
    2
    Einsatz in der Praxis
    3
    Zusammenfassung
    4

    View Slide

  5. CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 5
    Ein einziger Testfall hält die ganze Pipeline auf?
    Motivation
    https://www.testautomatisierung.org/flaky-tests-und-der-umgang-mit-diesen-1/

    View Slide

  6. • Concurrency-Tests
    • UI-Tests
    • Komplexe Infrastruktur gerade bei E2E-Tests
    • Externe Ressourcen
    • Aufräumen und Re-Initialisieren von Ressourcen
    CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 6
    Komplexität macht Testfälle instabil
    Motivation

    View Slide

  7. CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 7
    Handlungsmöglichkeiten für instabile Testfälle
    Motivation
    Aktion Bewertung
    Manuell neu starten * Mühsam und langfristig teuer.
    * Erfordert auf GitHub Berechtigung mit Schreibzugriff auf das Repository.

    View Slide

  8. CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 8
    Handlungsmöglichkeiten für instabile Testfälle
    Motivation
    Aktion Bewertung
    Manuell neu starten * Mühsam und langfristig teuer.
    Sofort beheben Kurz- und langfristig teuer, stressig und schwierig.
    * Erfordert auf GitHub Berechtigung mit Schreibzugriff auf das Repository.

    View Slide

  9. CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 9
    Handlungsmöglichkeiten für instabile Testfälle
    Motivation
    Aktion Bewertung
    Manuell neu starten * Mühsam und langfristig teuer.
    Sofort beheben Kurz- und langfristig teuer, stressig und schwierig.
    Automatisch wiederholen, Informationen
    sammeln und Statistiken erstellen
    Initialer Invest, ruhiges und fokussiertes Arbeiten
    an den instabilen Tests.
    Disziplin notwendig, sich (trotzdem) drum zu
    kümmern.
    * Erfordert auf GitHub Berechtigung mit Schreibzugriff auf das Repository.

    View Slide

  10. CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 10
    Wie testet Keycloak?
    Motivation
    • Ca. 70 Checks in GitHub Workflows
    • Conditionals abhängig von Code-Änderungen
    • 10 min Unit-Tests
    • 200 min Base-Integrationstests
    • 175 min Quarkus-Integrationstests
    • 300 min verschiedene Integrations-Szenarien
    (verschiedene Browser, Betriebssysteme, Datenbanken, Storage-Backends)

    View Slide

  11. CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 11
    Wie wir unsere Testpipeline stabilisierten
    Motivation
    1
    Umsetzung für Keycloak
    2
    Einsatz in der Praxis
    3
    Zusammenfassung
    4

    View Slide

  12. CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 12
    Umsetzung für Keycloak
    Maven Surefire to the rescue
    mvn test -Dsurefire.rerunFailingTestsCount=2 ...
    https://maven.apache.org/surefire/maven-surefire-plugin/examples/rerun-failing-tests.html

    View Slide

  13. CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 13
    Umsetzung für Keycloak
    Maven Surefire XML report


    flaky failure stack trace
    flaky failure System.out log message

    success

    https://maven.apache.org/surefire/maven-surefire-plugin/examples/rerun-failing-tests.html
    (ebenso: „flakyError“)

    View Slide

  14. CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 14
    Umsetzung für Keycloak
    Upload Flaky Tests Action (Pull Requests und Nightly Runs)
    for dir in $(find -type d -name 'surefire-reports*'); do
    for i in $(grep -l -E '...
    https://github.com/keycloak/keycloak/blob/main/.github/actions/upload-flaky-tests/action.yml
    - uses: actions/upload-artifact@v3
    if: ${{ steps.flaky-tests.outputs.flakes }}
    with:
    name: flaky-tests-${{ github.job }}-${{ join(matrix.*, '-') }}
    path: ${{ steps.flaky-tests.outputs.flakes }}
    if-no-files-found: error

    View Slide

  15. CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 15
    Umsetzung für Keycloak
    Einfacher Fall: Nightly Run
    1. Branch prüfen (main, latest release)
    2. Artefakte mit „flaky-tests-“ suchen, herunterladen und parsen
    3. GitHub-Issue zum Test existiert schon:
    • Kommentar hinzufügen
    4. GitHub-Issue existiert noch nicht:
    • Issue erstellen
    https://github.com/keycloak/keycloak-github-bot/blob/main/src/main/java/org/keycloak/gh/bot/ReportFlakyTests.java

    View Slide

  16. CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 16
    Umsetzung für Keycloak
    Einfacher Fall: Nightly Run

    View Slide

  17. CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 17
    Umsetzung für Keycloak
    Etwas komplizierter: Pull requests
    1. Branch prüfen (main, latest release)
    2. Artefakte mit „flaky-tests-“ suchen, herunterladen und parsen
    3. Label „flaky-test“ dem Pull Request hinzufügen
    4. GitHub-Issue zum Test existiert schon:
    • Kommentar dem Issue hinzufügen
    5. GitHub-Issue existiert noch nicht:
    • Kommentar dem Pull-Request hinzufügen, inklusive 1-Click-Issue-Erstellung
    (Ausführung Erfordert auf GitHub Berechtigung mit Schreibzugriff auf das Repository)
    https://github.com/keycloak/keycloak-github-bot/blob/main/src/main/java/org/keycloak/gh/bot/ReportFlakyTests.java

    View Slide

  18. CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 18
    Umsetzung für Keycloak
    Kommentar für unbekannten instabilen Test im Pull Request

    View Slide

  19. CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 19
    Umsetzung für Keycloak
    Bekannter instabiler Test als Kommentar im GitHub Issue

    View Slide

  20. CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 20
    Wie wir unsere Testpipeline stabilisierten
    Motivation
    1
    Umsetzung für Keycloak
    2
    Einsatz in der Praxis
    3
    Zusammenfassung
    4

    View Slide

  21. CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 21
    Fähigkeiten des Java Flight Recorders
    Handhabung
    • Suchen aller GitHub issue für flaky Tests
    • Erstellungdatum, letzte Aktivität, wieviel Aktivität
    • Guter Erfolg zu Beginn – es braucht eine*n Aufpasser*in
    • Schwieriger Bodensatz von komplizierten Tests bleibt
    • Was noch nicht wiederholt wird: Ursachen außerhalb von JUnit Integrationstests
    (Container-Download-Fehler, Node-Download-Fehler, …)

    View Slide

  22. CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 22
    Performance-Engpässe finden mit dem Java Flight Recorder
    Motivation
    1
    Umsetzung für Keycloak
    2
    Werkzeuge
    3
    Zusammenfassung
    4

    View Slide

  23. CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 23
    Ein einziger Testfall hält die ganze Pipeline auf?
    Zusammenfassung
    https://www.testautomatisierung.org/flaky-tests-und-der-umgang-mit-diesen-1/

    View Slide

  24. CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 24
    Ein einziger Testfall hält die ganze Pipeline auf?
    Zusammenfassung
    https://www.testautomatisierung.org/flaky-tests-und-der-umgang-mit-diesen-1/


    View Slide

  25. Keycloak Upload Action
    https://github.com/keycloak/keycloak/tree/main/.github/actions/upload-flaky-tests
    Keycloak GitHub Bot
    https://github.com/keycloak/keycloak-github-bot
    Quarkus GitHub App
    https://docs.quarkiverse.io/quarkus-github-app/dev/
    Maven Surefire Plugin – Rerun Tests
    https://maven.apache.org/surefire/maven-surefire-plugin/examples/rerun-failing-tests.html
    Links
    CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 25
    @ahus1de
    @[email protected]

    View Slide

  26. Kontakt
    Alexander Schwartz
    Principal Software Engineer
    [email protected]
    https://www.ahus1.de
    @ahus1de
    @[email protected]
    CC BY-NC-SA 4.0 | Oktober 2023 | Wie wir unsere Testpipeline stabilisierten | Alexander Schwartz 26

    View Slide