CI-Funktionen

Im Folgenden sind einige Funktionen aufgeführt, die Sie in den meisten CI-Systemen finden.

Umgebung

Es ist wichtig, die Hardware- und Softwareumgebung auszuwählen und zu verstehen, in der das System den Workflow ausführt. Wichtige Hinweise zu Android-Anwendungen:

  • Plattform: Linux, Mac, Windows und deren Versionen
  • Verfügbarer Speicher: Das Erstellen von Anwendungen und das Ausführen von Emulatoren kann viel RAM verbrauchen. Außerdem ist es häufig erforderlich, Parameter wie die Heap-Größe der JVM anzupassen, um Fehler aufgrund unzureichenden Arbeitsspeichers zu vermeiden.
  • Vorinstallierte Software: CI-Systeme stellen in der Regel Images mit einer großen Sammlung von Tools bereit, z. B. das Java Development Kit (JDK), das Android Software Development Kit (SDK), Build-Tools, Plattformen und Emulatoren.
  • Runner-Architektur und Anweisungssatz: ARM, x86. Das ist wichtig, wenn Sie Emulatoren verwenden.
  • Umgebungsvariablen: Einige werden vom CI-System festgelegt (z. B. ANDROID_HOME) und Sie können Ihre eigenen festlegen, um beispielsweise zu vermeiden, dass Anmeldedaten in Ihrem Workflow hartcodiert werden.

Es gibt viele weitere Aspekte, die Sie berücksichtigen sollten, z. B. die Anzahl der verfügbaren Kerne und ob die Virtualisierung zum Ausführen von Emulatoren aktiviert ist.

Protokolle und Berichte

Wenn ein Schritt fehlschlägt, werden Sie vom CI-System benachrichtigt und können die Änderung in der Regel nicht zusammenführen. Um den Fehler zu finden, suchen Sie in den Logs nach Fehlern.

Außerdem werden beim Erstellen und Testen Berichte generiert, die normalerweise als Artefakte des jeweiligen Builds gespeichert werden. Je nach CI-System können Sie Plug-ins verwenden, um die Ergebnisse dieser Berichte zu visualisieren.

Cache- und CI-Ausführungszeiten

CI-Systeme verwenden einen Build-Cache, um den Prozess zu beschleunigen. In der einfachsten Form werden nach einem erfolgreichen Build alle Gradle-Cache-Dateien gespeichert und vor einem neuen Build wiederhergestellt. Dies basiert auf dem Build-Cache-Feature von Gradle und sollte in Ihrem Projekt aktiviert sein.

Hier einige Möglichkeiten, wie Sie Laufzeiten und Zuverlässigkeit verbessern können:

  • Module: Damit wird erkannt, welche Module von einer Änderung betroffen sind, und diese nur erstellen und testen.
  • Caches überspringen: Wenn der Build Skripts enthält, die ein Entwickler geändert hat, können Sie die Build-Caches ignorieren. Es ist sicherer, wenn du dein Gerät von Grund auf neu entwickelst.
  • Shard-Tests: Bei speziell instrumentierten Tests kann es hilfreich sein, Tests auf mehrere Geräte zu fragmentieren. Dies wird vom Android-Runner, von Gradle Managed Devices und vom Firebase Test Lab unterstützt.
  • Shard-Builds: Sie können den Build auf mehrere Serverinstanzen aufteilen.
  • Remote-Cache: Sie können auch den Remote-Cache von Gradle verwenden.

Fehlgeschlagene Tests wiederholen

Schwachstellen bezieht sich auf Tests oder Tools, die zeitweise fehlschlagen. Sie sollten immer versuchen, die Probleme zu finden und zu beheben, die instabile Builds und Tests generieren. Einige davon sind jedoch schwer zu reproduzieren, insbesondere bei instrumentierten Tests. Eine gängige Strategie besteht darin, Testläufe bei Fehlversuchen bis zu einer maximalen Anzahl von Wiederholungsversuchen zu wiederholen.

Wiederholungsversuche lassen sich auf mehreren Ebenen konfigurieren. In der folgenden Tabelle sind die Maßnahmen aufgeführt, die Sie bei einem unzuverlässigen Testfehler ausführen können:

Fehler

Aktion

Der Emulator reagierte eine Sekunde lang nicht, wodurch ein Zeitlimit ausgelöst wurde

Fehlgeschlagenen Test noch einmal ausführen

Emulator konnte nicht gestartet werden

Gesamte Aufgabe noch einmal ausführen

Während der Code-Bezahlphase ist ein Verbindungsfehler aufgetreten

Workflow neu starten

Es ist wichtig, zu protokollieren und zu verfolgen, welche Teile des Systems instabil sind, und in die Zuverlässigkeit und Schnelligkeit von CI investieren, um nur auf Wiederholungsversuche zu stützen