Amarengo

Articles and news

Einrichten von Jenkins für Android: Wie ich mit den Herausforderungen umgegangen bin

In diesem Artikel werde ich meinen Weg zu einem voll funktionsfähigen Continuous Integration System mit Jenkins dokumentieren. Dieses Setup passt zu meiner Arbeitsumgebung, in der mehrere Projekte dieselben 4 Module für die Geschäftslogik verwenden.

Zuerst habe ich Jenkins von der offiziellen Website heruntergeladen. Dann öffnete ich das Terminal und führte den folgenden Befehl aus:

java -jar jenkins.war --httpPort=9091

Ich habe einen anderen Port als den üblichen 8080 angegeben, um ihn eindeutig zu machen und Fehler zu vermeiden, falls ein anderer Dienst Jenkins verwendet.

Nach Abschluss aller Einrichtungsschritte ist es wichtig sicherzustellen, dass die folgenden Plugins installiert sind:

  1. Git Plugin
  2. Gradle Plugin
  3. Android Lint Plugin
  4. Google Play Android Publisher Plugin

Diese Plugins stellen sicher, dass Jenkins über ausreichende Tools zum Erstellen eines Android-Projekts verfügt.

Der nächste Schritt besteht darin, die folgenden Einstellungen in Jenkins einzurichten:

  1. Einrichten von JDK für Jenkins

Ich habe festgestellt, dass der JDK-Abschnitt nach dem Klicken auf Jenkins verwalten -> Globale Toolkonfiguration wie folgt aussieht:

Grundlegende JDK-Konfiguration

Ich habe dann auf JDK hinzufügen geklickt und dann das folgende Formular ausgefüllt:

JDK-Installationsansicht hinzufügen

Ich habe einen Namen eingegeben, der die ausgewählte Version darstellt, und die Version von Install from ausgewählt java.sun.com (Hinweis: Jenkins fragt nach Ihren Oracle-Kontoinformationen, um das JDK zu installieren).

Auf derselben globalen Toolkonfigurationsseite habe ich dann die Gradle-Plugin-Einstellungen gefunden, in denen ich eine Gradle-Installation hinzugefügt habe, die dieselbe Version wie die in meinen Projekten verwendete Gradle hat. Um weitere Verwirrung zu vermeiden, führe ich Projekte mit Gradle Wrapper aus, die ich im kommenden Abschnitt ausführlicher besprechen werde.

Gradle-Installationsansicht

Ich habe auch sichergestellt, dass der Name die ausgewählte Version darstellt, um Verwechslungen zu vermeiden.

Normalerweise durchsucht Gradle das lokale.Eigenschaftendatei im Projekt zum Abrufen des Android SDK-Speicherorts. Bei der Verwendung von Jenkins stellte ich jedoch fest, dass dies möglicherweise nicht immer der Fall ist, insbesondere bei Verwendung des Gradle-Wrappers.

Um Buildfehler zu vermeiden, habe ich ANDROID_HOME in die Jenkins-Umgebungsvariablen eingefügt. Dies wird erreicht, indem Sie Jenkins verwalten -> System konfigurieren und dann das Kontrollkästchen Umgebungsvariablen hier aktivieren:

Abschnitt Globale Eigenschaften

und fügen Sie eine Variable mit dem Namen ANDROID_HOME hinzu und füllen Sie den Wert mit dem Pfad zum SDK.

Umgebungsvariable hinzufügen

Nachdem ich alle diese Schritte ausgeführt hatte, begann ich, ein neues Element in Jenkins zu erstellen. Die meisten meiner Projekte basieren auf 4 Haupt-Android-Modulen, die als Git-Submodule im Git-Repository enthalten sind.

Das Einrichten eines neuen Elements ist ziemlich einfach, wenn Sie keine Submodule haben:

Neue Artikelseite

Geben Sie einfach den Namen ein, wählen Sie das Projekt aus und klicken Sie auf OK.

Gehen Sie als Nächstes zur Quellcodeverwaltung. Normalerweise benutze ich Git und richte das Repo ein:

Quellverwaltungsabschnitt

Fügen Sie die Repo-URL ein und fügen Sie Anmeldeinformationen hinzu, falls Sie dies noch nicht getan haben. Der Trick besteht nun darin, sicherzustellen, dass Sie, wenn Sie einen HTTPS-Link für das Repo verwenden, Anmeldeinformationen vom Typ Benutzername und Kennwort hinzufügen müssen.

Wenn Sie Submodule im Git-Repo haben, können Sie dies am einfachsten durch zusätzliches Verhalten -> Add ->Advanced sub-modules behaviors und folgendermaßen tun:

  1. Aktivieren Sie die Option Submodule rekursiv aktualisieren
  2. Fügen Sie im Pfad des Referenz-Repos, das während der Submodul-Aktualisierung verwendet werden soll, den Namen des Submodul-Ordners hinzu, der im übergeordneten Repo verwendet wird.
  3. In meinem Fall können sowohl übergeordnete als auch Submodule dieselben Anmeldeinformationen verwenden.

Verhalten erweiterter Untermodule

Fügen Sie so viele davon hinzu, wie die Anzahl der enthaltenen Submodule beträgt, und stellen Sie sicher, dass die Submodule, wenn die übergeordnete Repo-URL HTTPS lautet, darin verlinken.gitmodules sollte auch HTTPS verwenden. Gleiches gilt für SSH.

Um das Projekt erfolgreich zu erstellen, muss Jenkins das Gradle-Skript aufrufen. Der effizienteste Weg besteht darin, Jenkins anzuweisen, den Gradle-Wrapper des Projekts auszuführen und die Aufgaben zu definieren (clean, assembleDebug usw…)

Build-Schritt-Menü hinzufügen

Invoke Gradle Script Section

Um den Fehler permission denied zu vermeiden, wird Make Gradlew executable aktiviert und die Aufgaben werden angegeben.

Jenkins enthält eine Vielzahl von Aktionen, die nach Abschluss des Builds ausgeführt werden müssen.

Die einfachste Möglichkeit, das Projekt mithilfe der Android Play Store Publishing Plugins automatisch im Play Store zu veröffentlichen, finden Sie hier.

Einige Anmerkungen zur Veröffentlichung im Store

Wenn Sie eine neue APK an den Store senden, muss der Versionscode erhöht werden. Um dies zu automatisieren, habe ich dieses Snippet als Referenz erstellt.

Stellen Sie außerdem sicher, dass Sie beim Hinzufügen des letzten Änderungsteils in Jenkins dieselbe Sprache auswählen wie in der Beschreibung für den Store-Eintrag:

Der letzte Abschnitt ist, wie Builds automatisch ausgelöst werden. Für mein Projekt ist die Versionskontrolle meiner Wahl Bitbucket. Um es einzurichten, folgte ich diesem Wiki . Es gibt jedoch einen Haken, damit die Webhooks funktionieren, müssen Sie Jenkins auf einer Webservereinstellung haben. Anfangs habe ich es nicht getan, also hat der Webhook nicht funktioniert. Ich habe dies überwunden, indem ich andere Builds ausgelöst habe, nachdem ein bestimmtes Projekt erfolgreich erstellt wurde. Dies löste mein Problem, da ich hauptsächlich die 4 Haupt-Submodule in einem Dummy-Projekt entwickle und sie dann in alle anderen Projekte ziehe.

Dies kann im Abschnitt Build-Trigger direkt über Build erfolgen:

Build Triggers Section

Meine zukünftigen Schritte werden darin bestehen, Jenkins und automatisierte Tests sowohl durch JUnit-Tests als auch durch Android-Instrumentationstests zu nutzen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.