Automatische Android-Builds mit GitLab CI
Die Einrichtung einer CI/CD-Pipeline für Capacitor-Apps kann komplex und zeitaufwändig sein. Hier sind die wichtigsten Informationen:
Voraussetzungen
Bevor Sie beginnen, müssen Sie Folgendes einrichten:
- Ein GitLab-Konto mit Administrator-Zugriff
- Ihre App ist bereits auf dem Google Play Store mit korrekter Signatur veröffentlicht
- Android-Signierungs-Schlüssel und Keystore-Dateien
- Google Cloud Console-Projekt mit Play Store API aktiviert
- Dienstkonten mit korrekten Berechtigungen
- Verständnis von GitLab CI/CD-Workflows
- Kenntnisse in der Fastlane-Konfiguration
- Zeit zur Wartung und Fehlersuche im Pipeline
Professionelle CI/CD-Einrichtung durch Capgo
Komplexität vermeiden. Capgo konfiguriert Ihre CI/CD-Pipeline direkt in Ihrer bevorzugten Plattform:
- Plattformunabhängigkeit: Funktioniert mit GitHub Aktionen, GitLab CI oder anderen
- Nahtlose Integration: Keine Plattformwechsel erforderlich, funktioniert mit Ihrem aktuellen Prozess
- Angepasste Konfiguration: Zugeschnittene Einrichtung, die den Bedürfnissen Ihres Projekts entspricht
- Experte Beratung: Wir haben bereits CI/CD für 50+ Apps eingerichtet
Preise
- Einzelfragergebühr: 2.600 $
- Ihre laufenden Kosten: ~300 $/Jahr
- Im Vergleich zu anderen proprietären Lösungen: 6.000 $/Jahr
- 5 Jahre lang 26.100 $ einsparen
Manueller Setup-Leitfaden
Wenn Sie trotzdem alles selbst einrichten möchten, hier ist, was Sie tun müssen:
Schritte, die Sie im Post befolgen müssen
- Fastlane-Dateien kopieren
- Ihre Geheimnisse in GitLab verschlüsselten Geheimnissen speichern
- Erstellen und speichern Sie Ihren Google Play-Dienstkontoschlüssel
- Ihren Android-Signierungsschlüssel speichern
- Einstellen Sie Ihr GitLab-Workflow-Datei .yml
1. Fastlane-Dateien kopieren
Fastlane ist eine Ruby-Bibliothek, die zum Automatisieren von gängigen Aufgaben der mobilen Entwicklung erstellt wurde. Mit Fastlane können Sie benutzerdefinierte "Bahnen" konfigurieren, die eine Reihe von "Aktionen" enthalten, die Aufgaben ausführen, die Sie normalerweise mit Android Studio ausführen würden. Mit Fastlane können Sie eine Menge tun, aber für die Zwecke dieses Tutorials werden wir nur eine Handvoll grundlegender Aktionen verwenden.
Erstellen Sie einen Fastlane-Ordner am Root Ihres Projekts und kopieren Sie die folgenden Dateien: Fastlane
default_platform(:android)
KEYSTORE_KEY_ALIAS = ENV["KEYSTORE_KEY_ALIAS"]
KEYSTORE_KEY_PASSWORD = ENV["KEYSTORE_KEY_PASSWORD"]
KEYSTORE_STORE_PASSWORD = ENV["KEYSTORE_STORE_PASSWORD"]
platform :android do
desc "Deploy a beta version to the Google Play"
private_lane :verify_changelog_exists do |version_code: |
changelog_path = "android/metadata/en-US/changelogs/#{version_code}.txt"
UI.user_error!("Missing changelog file at #{changelog_path}") unless File.exist?(changelog_path)
UI.message("Changelog exists for version code #{version_code}")
end
private_lane :verify_upload_to_staging do |version_name: |
UI.message "Skipping staging verification step"
end
lane :beta do
keystore_path = "#{Dir.tmpdir}/build_keystore.keystore"
File.write(keystore_path, Base64.decode64(ENV['ANDROID_KEYSTORE_FILE']))
json_key_data = Base64.decode64(ENV['PLAY_CONFIG_JSON'])
previous_build_number = google_play_track_version_codes(
package_name: ENV['DEVELOPER_PACKAGE_NAME'],
track: "internal",
json_key_data: json_key_data,
)[0]
current_build_number = previous_build_number + 1
sh("export NEW_BUILD_NUMBER=#{current_build_number}")
gradle(
task: "clean bundleRelease",
project_dir: 'android/',
print_command: false,
properties: {
"android.injected.signing.store.file" => "#{keystore_path}",
"android.injected.signing.store.password" => "#{KEYSTORE_STORE_PASSWORD}",
"android.injected.signing.key.alias" => "#{KEYSTORE_KEY_ALIAS}",
"android.injected.signing.key.password" => "#{KEYSTORE_KEY_PASSWORD}",
'versionCode' => current_build_number
})
upload_to_play_store(
package_name: ENV['DEVELOPER_PACKAGE_NAME'],
json_key_data: json_key_data,
track: 'internal',
release_status: 'completed',
skip_upload_metadata: true,
skip_upload_changelogs: true,
skip_upload_images: true,
skip_upload_screenshots: true,
)
end
lane :build do
gradle(
task: "clean bundleRelease",
project_dir: 'android/',
print_command: false,
properties: {
"android.injected.signing.store.file" => "#{keystore_path}",
"android.injected.signing.store.password" => "#{KEYSTORE_STORE_PASSWORD}",
"android.injected.signing.key.alias" => "#{KEYSTORE_KEY_ALIAS}",
"android.injected.signing.key.password" => "#{KEYSTORE_KEY_PASSWORD}",
})
end
lane :prod_release do
build_gradle = File.read("../android/app/build.gradle")
verify_changelog_exists(version_code: build_gradle.match(/versionCode (\d+)/)[1])
verify_upload_to_staging(version_name: build_gradle.match(/versionName '([\d\.]+)'/)[1])
supply(
track_promote_to: 'beta',
skip_upload_apk: true,
skip_upload_aab: true,
skip_upload_metadata: false,
skip_upload_changelogs: false,
skip_upload_images: false,
skip_upload_screenshots: false
)
end
end
Ihre Geheimnisse in GitLab CI/CD Variablen speichern
GitLab bietet eine Möglichkeit, verschlüsselte CI/CD-Variablen zu speichern, ähnlich wie GitHub’s Repository-Secrets. Um Ihre sensitive Informationen sicher zu speichern.
- Gehe zu den Einstellungen deines GitLab-Projekts.
- Navigiere zu CI/CD > Variablen
- Füge die folgenden Variablen hinzu:
- ANDROID_KEYSTORE_FILE: die bas64-codierte
.jksoder.keystoreDatei, die zum Signieren Ihrer Android-Builds verwendet wird. Dies kann entweder die Keystore-Datei sein, die mit Ihrem Upload-Schlüssel verbunden ist (wenn Sie Play App Signing verwenden), oder Ihr App-Signier-Schlüssel. - KEYSTORE_KEY_PASSWORD: das mit der Keystore-Datei verbundene Passwort
- KEYSTORE_KEY_ALIAS: der Schlüssel-Store-Alias
- KEYSTORE_STORE_PASSWORD: das private Schlüsselpasswort
- DEVELOPER_PACKAGE_NAME: Ihre Android-App-ID wie com.example.app
- PLAY_CONFIG_JSON: Die bas64-codierte Schlüsseldatei des Dienstkontos im JSON-Format.
Erstellung einer Google Play-Dienstkonto-Schlüssel
Um den PLAY_CONFIG_JSON geheimen Schlüssel zu generieren, folgen Sie bitte diesen Schritten:
- Gehe zur Google Cloud-Konsole
- Erstelle ein neues Projekt oder wähle ein bestehendes Projekt aus
- Aktiviere die Google Play Android-Entwickler-Erweiterung API
- Erstelle ein Dienstkonto:
- Gehe zu “IAM & Admin” > “Dienstkonto”
- Klicke auf “Dienstkonto erstellen”
- Gib ihm einen Namen und eine Beschreibung
- Klicken Sie auf „Erstellen und fortfahren“
- Übergehen Sie die Rolle zuweisen und klicken Sie auf „Fertig“
- Erstellen Sie eine JSON-Schlüssel:
- Finden Sie Ihr Dienstkontoin der Liste
- Klicken Sie auf das Dreipunkte-Menü > „Schlüssel verwalten“
- Klicken Sie auf „Schlüssel hinzufügen“ > „Neuer Schlüssel erstellen“
- Wählen Sie die JSON-Format
- Klicken Sie auf „Erstellen“
- Geben Sie dem Dienstkontoin Zugriff auf Ihre App in der Play Console ein:
- Gehe zu Play Console
- Navigieren Sie zu „Benutzer und Berechtigungen“
- Klicken Sie auf ‘Neue Benutzer einladen’
- Geben Sie die E-Mail-Adresse des Dienstkontos ein (endet mit @*.iam.gserviceaccount.com)
- Berechtigung ‘In die Produktion freigeben’ erteilen
- Klicken Sie auf ‘Benutzer einladen’
- Konvertieren Sie die JSON-Schlüssel in Base64:
base64 -i path/to/your/service-account-key.json | pbcopy - Fügen Sie die Base64-codierte Zeichenfolge als
PLAY_CONFIG_JSONVariablen in GitLab hinzu
GitLab CI/CD-Pipeline einrichten
Erstellen Sie eine .gitlab-ci.yml-Datei im Wurzelverzeichnis Ihres Projekts, um Ihre CI/CD-Pipeline zu definieren. Hier ist ein Beispiel dafür, wie Sie Ihre Pipeline strukturieren können:
image: mingc/android-build-box:latest
stages:
- build
- upload_to_capgo
- build_and_upload_android
build:
stage: build
tags:
- saas-linux-xlarge-amd64
cache:
- key:
files:
- bun.lockb
paths:
- .node_modules/
script:
- npm install
- npm run build
artifacts:
paths:
- node_modules/
- dist/
only:
- master
upload_to_capgo:
stage: upload_to_capgo
tags:
- saas-linux-xlarge-amd64
script:
- npx @capgo/cli@latest bundle upload -a $CAPGO_TOKEN -c dev
dependencies:
- build
when: manual
only:
- master
build_and_upload_android:
tags:
- saas-linux-xlarge-amd64
stage: build_and_upload_android
cache:
- key:
files:
- android/gradle/wrapper/gradle-wrapper.properties
paths:
- ~/.gradle/caches/
script:
- npx cap sync android
- npx cap copy android
- bundle exec fastlane android beta # We do create a tag for the build to trigger XCode cloud builds
dependencies:
- build
when: manual
only:
- master
Pipeline auslösen
Wenn Sie ein neues Tag in Ihrem GitLab-Repository pushen, wird GitLab CI/CD die definierte Pipeline automatisch auslösen, die Ihre Android-App mit Fastlane baut und bereitstellt.
Stellen Sie sicher, die Pfade und Abhängigkeiten entsprechend der Struktur und Anforderungen Ihres Projekts anzupassen. Diese Einrichtung hilft Ihnen, die Bereitstellung Ihrer Android-App auf GitLab CI/CD zu automatisieren.
Zusammenfassung
Durch die Konfiguration von GitLab CI/CD mit der mingc/android-build-box-Docker-Image können Sie den Android-App-Build-Prozess automatisieren, was Ihre Entwicklungsmethodik effizienter und zuverlässiger macht. Diese Automatisierung befreit Ihre Zeit, um sich auf die Kernaspekte der App-Entwicklung zu konzentrieren, was Ihnen letztendlich hilft, hochwertige Android-Apps effizienter zu liefern.