Serverlose Mobile Delivery-Pipeline erstellen

In dieser Anleitung wird beschrieben, wie Sie eine serverlose mobile Bereitstellungspipeline in Google Cloud erstellen:

  • Zuerst werden Sie durch die Einrichtung einer Android-Testanwendung geführt, die Sie mithilfe von Gradle-Befehlen auf Ihrem lokalen Computer erstellen und verteilen können. Mit diesen Befehlen wird das Android-Anwendungspaket (APK) erstellt und zur Verteilung an Betatester in Firebase App Distribution hochgeladen.
  • Zur Automatisierung dieses Prozesses erstellen Sie als Nächstes den Android Builder für Cloud Build und einen Build-Trigger, der die Erstellung und Verteilung der Android-Anwendung mit Änderungen am Quellcode auslöst.

Ziele

  • Erstellen Sie eine Build-Aufgabe, die ein signiertes APK erstellt.
  • Erstellen Sie eine Build-Aufgabe, die Firebase App Distribution zum Verteilen neuer Builds verwendet.
  • Installieren Sie den Android Builder mit den erforderlichen Android SDK-Abhängigkeiten.
  • Erstellen Sie in Google Cloud einen Build-Trigger, der den Android Builder verwendet, um das signierte APK zu erstellen und mithilfe von Firebase App Distribution zu verteilen.

Kosten

In dieser Anleitung werden kostenpflichtige Komponenten von Google Cloud verwendet, darunter:

Das Basisimage des Android Builder ist ungefähr 1,9 GB groß. Gemäß dem Preisrechner liegen die geschätzten Speicherkosten für eine 2-GB-Umgebung bei ca. 0,05 $ pro Monat. Das Erstellen des Android Builder-Basisimages dauert etwa 11 Minuten und kostet 0,03 $. Jeder zusätzliche Build sollte etwa 5 Minuten dauern und 0,02 $ kosten. Weitere Informationen finden Sie unter Cloud Build-Preise.

Hinweis

  1. Melden Sie sich bei Ihrem Google-Konto an.

    Wenn Sie noch kein Konto haben, melden Sie sich hier für ein neues Konto an.

  2. Wählen Sie in der Google Cloud Console auf der Seite der Projektauswahl ein Google Cloud-Projekt aus oder erstellen Sie eines.

    Zur Projektauswahl

  3. Die Abrechnung für das Cloud-Projekt muss aktiviert sein. So prüfen Sie, ob die Abrechnung für Ihr Projekt aktiviert ist.

  4. Aktivieren Sie die Compute Engine API.

    Aktivieren Sie die API

  5. Installieren und initialisieren Sie das Cloud SDK.
  6. Gradle muss auf Ihrem Computer installiert sein.
  7. Android Studio muss auf Ihrem Computer installiert sein.
  8. Git muss auf Ihrem Computer installiert sein.

In dieser Anleitung wird Folgendes vorausgesetzt:

  • Sie führen macOS oder Linux aus. Einige dieser Verfahren lassen sich zwar auf Windows-Umgebungen anwenden, doch die Anleitung enthält keine vollständigen Anweisungen für diesen Anwendungsfall.
  • Sie sind mit der Android-Entwicklung, Android Studio sowie Gradle und Git vertraut.

Signierten Beta-Build von Android lokal ausführen

In diesem Abschnitt richten Sie eine Android-Testanwendung in Android Studio ein. Die Anwendung kann mithilfe von Gradle-Build-Aufgaben erstellt und verteilt werden, die im Terminalfenster Ihres Computers ausgeführt werden.

Erstellen Sie eine Android-Testanwendung

  1. Erstellen Sie in Android Studio ein neues Android-Projekt mit einer leeren Aktivität.

    Auf den folgenden Screenshots werden die Schritte im Assistenten gezeigt, die zum Ausführen dieser Aufgabe erforderlich sind.

    Android Studio-Assistent, Seite 1

    Android Studio-Assistent, Seite 2

    Android Studio-Assistent, Seite 3

    Android Studio-Assistent, Seite 4

  2. Wechseln Sie vom Terminalfenster Ihres Computers in das Verzeichnis, in dem Sie die Testanwendung erstellt haben:

    cd ${HOME}/android-apps/TestAndroidBuild
  3. Initialisieren Sie in dem Verzeichnis ein Git-Repository:

    git init && git checkout -b develop
  4. Bearbeiten Sie die Datei .gitignore und fügen Sie die Namen der Dateien und Erweiterungen hinzu, die von Git nicht in Ihr Quellcode-Repository verschoben werden sollen:

    cat >> .gitignore <<EOF
    google-services.json
    app-distro.json
    keystore.properties
    EOF
  5. Übertragen Sie die Anwendung per Commit an das Repository:

    git add -A
    git commit -m "empty application"
  6. Konfigurieren Sie dann das gcloud-Befehlszeilentool für die Verwendung Ihres Projekts. Verwenden Sie für [PROJECT_NAME] den Projektnamen, den Sie ausgewählt oder erstellt haben.

    PROJECT=[PROJECT_NAME]
    gcloud config configurations create $PROJECT
    gcloud config config set project $PROJECT
  7. Erstellen Sie ein Cloud Source Repository für Ihre Android-Anwendung:

    gcloud source repos create android-application
  8. Fügen Sie das Cloud Source Repository als Remote-Repository für die Android-Anwendung hinzu:

    git remote add google \
        https://source.developers.google.com/p/${PROJECT}/r/android-application

Fügen Sie Firebase zu Ihrer Anwendung hinzu

  1. Zur Firebase Console

    Zur Firebase Console

  2. Klicken Sie auf Projekt hinzufügen.

  3. Wählen Sie unter Projektnamen eingeben das zuvor erstellte Google Cloud-Projekt aus:

    Grafik: Menü des Cloud-Projekts für Firebase

  4. Bestätigen Sie den Firebase Blaze-Abrechnungstarif.

  5. Wählen Sie aus, ob Sie Google Analytics aktivieren möchten. Für diese Anleitung benötigen Sie keine Analysen.

  6. Warten Sie, bis das Firebase-Projekt erstellt wurde, und klicken Sie dann auf Weiter.

  7. Folgen Sie der Anleitung unter Firebase zu meinem Android-Projekt hinzufügen, um Firebase zu Ihrer Android-Anwendung hinzuzufügen.

  8. Achten Sie darauf, dass die Datei google-services.json in das folgende Verzeichnis verschoben wird:

    {HOME}/android-apps/TestAndroidBuild

  9. Folgen Sie der Anleitung unter Erste Schritte mit Firebase Crashlytics, um Firebase Crashlystics zu Ihrem Android-Projekt hinzuzufügen.

  10. Wechseln Sie in das Verzeichnis auf Anwendungsebene Ihres Projekts:

    cd {HOME}/android-apps/TestAndroidBuild/app

  11. Erstellen Sie ein Google Cloud-Dienstkonto mit der Rolle Firebase-Administrator:

    gcloud iam service-accounts create app-distro --display-name=app-distro
    APP_DISTRO_SA=$(gcloud iam service-accounts list --filter="displayName:app-distro" --format='value(email)')
    gcloud projects add-iam-policy-binding $PROJECT --role roles/firebase.admin --member serviceAccount:$APP_DISTRO_SA
    gcloud iam service-accounts keys create app-distro.json $APP_DISTRO_SA
    

Signierschlüssel und Schlüsselspeicher erstellen

Damit Sie die Vorabveröffentlichung der Android-Anwendung verteilen können, müssen Sie die Anwendung mit einem Zertifikat signieren, das in einer Java-Schlüsselspeicherdatei (.jks) gespeichert ist.

  1. Wechseln Sie im Terminalfenster zum übergeordneten Verzeichnis der Anwendung:

    cd ${HOME}/AndroidStudioProjects/TestAndroidBuild
  2. Erstellen Sie den Java-Schlüsselspeicher und den Schlüssel, um die Anwendung zu signieren, und erstellen Sie die Datei keystore.properties, in der der Schlüsselalias, das Passwort und der relative Pfad der Schlüsselspeicherdatei gespeichert sind:

    JKS_PASSWORD=$(openssl rand -base64 12)
    keytool -genkey -noprompt -keystore ../signing/android.jks \
      -alias android-key \
      -dname "CN=example.com, OU=IT, O=Example, L=Sunnyvale, S=California, C=US" \
      -storepass ${JKS_PASSWORD} \
      -keypass ${JKS_PASSWORD}
    
    cat > ../signing/keystore.properties <<EOF
    storeFile=../signing/android.jks
    storePassword=${JKS_PASSWORD}
    keyPassword=${JKS_PASSWORD}
    keyAlias=android-key
    EOF

Verschlüsseln Sie die Android-Secret-Dateien und fügen Sie sie Ihrem Quell-Repository hinzu.

  1. Aktivieren Sie den Key Management Service:

    gcloud services enable cloudkms.googleapis.com
    
  2. Erstellen Sie einen Schlüsselbund zum Speichern Ihrer Schlüssel:

    gcloud kms keyrings create my-app --location=global
    
  3. Erstellen Sie einen Schlüssel zum Speichern Ihrer Secrets:

    gcloud kms keys create android-builder \
        --location=global \
        --keyring=my-app \
        --purpose=encryption
    
  4. Fügen Sie dem Cloud Build-Dienstkonto die Rolle Ver-/Entschlüsselung hinzu:

    CLOUDBUILD_ACCOUNT=$(gcloud projects get-iam-policy $PROJECT \
        --filter="(bindings.role:roles/cloudbuild.builds.builder)" \
        --flatten="bindings[].members" \
        --format="value(bindings.members[])" | tail -1)
    
    gcloud kms keys add-iam-policy-binding android-builder --location=global \
        --keyring=my-app --member="${CLOUDBUILD_ACCOUNT} \
        --role=roles/cloudkms.cryptoKeyEncrypterDecrypter
    
  5. Verschlüsseln Sie die Datei keystore.properties:

    gcloud kms encrypt --plaintext-file=signing/keystore.properties \
        --ciphertext-file=signing/keystore.properties.enc --location=global \
        --keyring=my-app --key=android-builder
    
  6. Fügen Sie Ihrem Quell-Repository die Signaturdateien hinzu:

    git add signing
    git commit -m "encrypted signing information"
    
  7. Verschlüsseln Sie die Datei google-services.json:

    gcloud kms encrypt --plaintext-file=app/google-services.json \
        --ciphertext-file=app/google-services.json.enc --location=global \
        --keyring=my-app --key=android-builder
    
  8. Fügen Sie Ihrem Quell-Repository die Datei google-services.json.enc hinzu:

    git add app/google-services.json.enc
    git commit -m "encrypted application account"
    
  9. Verschlüsseln Sie die Datei app-distro.json:

    gcloud kms encrypt --plaintext-file=app-distro.json \
        --ciphertext-file=app-distro.json.enc \
        --location=global \
        --keyring=my-app --key=android-builder
    
  10. Fügen Sie Ihrem Quell-Repository die Datei app-distro.json.enc hinzu:

    git add app-distro.json.enc
    git commit -m "encrypted service account"
    

Fügen Sie Firebase App Distribution hinzu

Erstellen Sie eine Firebase-Verteilergruppe

  1. Zur Firebase Console

    Zur Firebase Console

  2. Klicken Sie auf die Anwendung, die Sie für Firebase erstellt haben. Der Name ähnelt dem Namen des Cloud-Projekts.

  3. Klicken Sie auf App-Bereitstellung.

  4. Klicken Sie auf Tester.

  5. Klicken Sie auf Tester hinzufügen.

  6. Geben Sie Ihre E-Mail-Adresse ein.

  7. Klicken Sie auf Testgruppe erstellen.

  8. Geben Sie den Namen Betatester ein.

  9. Klicken Sie auf Tester hinzufügen.

  10. Fügen Sie Ihre E-Mail-Adresse der Gruppe Betatester hinzu.

Aktualisieren Sie die Datei build.gradle, um die Signatur- und Firebase-Bereitstellungskonfigurationen aufzunehmen

  1. Aktualisieren Sie die Datei {HOME}/AndroidStudioProjects/TestAndroidBuild/build.gradle mit den fett formatierten Zeilen:

    buildscript {
        ext.kotlin_version = '1.3.41'
        repositories {
            google()
            jcenter()
        }
        dependencies {
            classpath 'com.android.tools.build:gradle:3.5.0'
            classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version'
            classpath 'com.google.firebase:firebase-appdistribution-gradle:2.0.0'
            classpath 'com.google.gms:google-services:4.3.1'
            // NOTE: Do not place your application dependencies here; they belong
            // in the individual module build.gradle files
        }
     }
    
  2. Fügen Sie der Datei {HOME}/AndroidStudioProjects/TestAndroidBuild/app/build.gradle die folgenden Snippets hinzu:

    android {
    // ...
    def debugKeystorePropertiesFile = rootProject.file("signing/keystore.properties")
    def keystoreProperties = new Properties()
    keystoreProperties.load(new FileInputStream(debugKeystorePropertiesFile))
    //...
    android {
      //...
        signingConfigs {
           debug {
            keyAlias keystoreProperties['keyAlias']
            keyPassword keystoreProperties['keyPassword']
            storeFile file(keystoreProperties['storeFile'].trim())
            storePassword keystoreProperties['storePassword']
          }
         }
          buildTypes {
            debug {
              firebaseAppDistribution {
                releaseNotesFile="release-notes.txt"
                groups="beta-testers"
              }
            }
          // ...
            packagingOptions {
              exclude "app-distro.json"
            }
          }
      }
    

Korrigieren Sie die Testabhängigkeit in der Gradle-Datei

  1. Achten Sie darauf, dass die Datei ${HOME}/AndroidStudioProjects/TestAndroidBuild/app/build.gradle die folgende fett formatierte Zeile enthält:

    dependencies {
      //...
      androidTestImplementation 'androidx.test:runner:1.2.0'
      androidTestImplementation 'androidx.test.ext:junit:1.1.1'
      androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
     }
    

Erstellen und verteilen Sie die Anwendung auf Ihrem Computer

  1. Rufen Sie im Terminalfenster das übergeordnete Verzeichnis für Ihre Testanwendung auf:

    {HOME}/AndroidStudioProjects/TestAndroidBuild

  2. Erstellen und verteilen Sie die Anwendung:

    gradle assembleDebug appDistributionUploadDebug
    

    Eine E-Mail wird an die Verteilergruppe gesendet. Sie enthält einen Link, über den die Nutzer die Anwendung installieren können.

Änderungen am Build im Quell-Repository speichern

  • Übernehmen Sie die Änderungen in das Quell-Repository:

    git add app/build.gradle && git commit -m "Update build for distribution."
    

Android-Build in Cloud Build erstellen

Sie haben jetzt funktionierende Gradle-Build-Aufgaben, mit denen Ihre Android-Anwendung erstellt und verteilt wird. In diesem Abschnitt legen Sie in Cloud Build fest, dass diese Build-Aufgaben immer dann ausgeführt werden, wenn sich der Master-Branch des Cloud Source Repositorys ändert.

  1. Legen Sie die Umgebungsvariable PROJECT fest:

    export PROJECT=$(gcloud config get-value project)
    
  2. Erstellen Sie den Storage-Bucket, den der Android Builder zum Speichern der Abhängigkeiten zwischen den Builds verwendet:

    gsutil mb gs://$PROJECT-cache-bucket
    
  3. Erstellen Sie den Storage-Bucket, den der Android Builder zum Erhöhen der Android Build-Nummer verwendet:

    gsutil mb gs://$PROJECT-config-bucket
    
  4. Erstellen Sie den Storage-Bucket, den der Android Builder zum Speichern von Artefakten verwendet:

    gsutil mb gs://$PROJECT-artifact-bucket
    

Den Android Builder erstellen

  1. Klonen Sie in einem Terminalfenster das Community-Builders-Repository in ein Verzeichnis, das sich außerhalb des Verzeichnisses Ihrer Android-Anwendung befindet:

    git clone https://github.com/GoogleCloudPlatform/cloud-builders-community
    

    Das GitHub-Repository enthält die von der Community verwalteten Builder.

  2. Wechseln Sie in das Verzeichnis, das den Builder tar enthält:

    cd cloud-builders-community/tar
    
  3. Fügen Sie Ihrem Projekt den Builder tar hinzu:

    gcloud builds submit --config=cloudbuild.yaml
    
  4. Wechseln Sie in das Verzeichnis, das den Android Builder enthält:

    cd ../android
    
  5. Erstellen Sie den Android Builder und übergeben Sie die Ziel-SDK-Version als Ersatz:

    gcloud builds submit --config=cloudbuild.yaml \
        --substitutions=_ANDROID_VERSION=28 

Build-Trigger für Android-Anwendungen erstellen

In diesem Abschnitt erstellen Sie den Anwendungs-Build-Trigger, der den Android Builder aus dem vorherigen Abschnitt verwendet, um die Android-Anwendung zu erstellen und zu verteilen.

  1. Kopieren Sie im Terminalfenster die Beispieldatei cloudbuild.yaml aus dem Android Builder-Verzeichnis examples/ in das Verzeichnis Ihrer Android-Testanwendung:

    cd ${HOME}/android-apps/TestAndroidBuild
    cp ${HOME}/cloud-builders-community/android/examples/build-test-deploy-firebase-distro.yaml \ ./cloudbuild.yaml
    
  2. Fügen Sie die neue Datei cloudbuild.yaml dem Branch develop Ihres Quell-Repositorys hinzu:

    git add cloudbuild.yaml && git commit -m "Add android builder to project."
    
  3. Rufen Sie in der Cloud Console die Seite Build-Trigger auf.

    Weiter zur Seite "Build-Trigger"

  4. Klicken Sie auf Trigger erstellen.

  5. Wählen Sie das Repository android-application aus.

  6. Geben Sie als Name android-application-build ein.

  7. Wählen Sie unter Build-Konfiguration die Option cloudbuild.yaml aus.

  8. Geben Sie unter cloudbuild.yaml-Speicherort /cloudbuild.yaml ein.

  9. Klicken Sie auf Zeile hinzufügen. Hier können Sie Variablen für den Build festlegen.

  10. Geben Sie für jede Variable in der folgenden Tabelle den Variablennamen (einschließlich des führenden Unterstrichs) und dann den Wert aus Ihrem Projekt ein.

    Variable Wert Zweck
    _CONFIG_BUCKET
    Der Bucket zum Speichern der Build-Nummer.
    gs://[PROJECT_NAME]-config-bucket Die URL des Buckets, in dem die Build-Nummer gespeichert wird.
    _CACHE_BUCKET
    Der Bucket für das Caching von Build-Abhängigkeiten.
    gs://[PROJECT_NAME]-cache-bucket Verhindert, dass Gradle für jeden Build die gleichen Abhängigkeiten aus dem Internet herunterlädt.
    _ARTIFACT_BUCKET
    Der Cloud Storage-Bucket, in dem Build-Artefakte gespeichert werden.
    gs://[PROJECT_NAME]-artifact-bucket Der Android Builder speichert während des Builds Zwischen- und andere Artefakte.
  11. Klicken Sie auf Trigger erstellen.

Anwendungs-Build-Trigger ausführen

Sie können jetzt testen, ob der Anwendungs-Build-Trigger funktioniert, und bestätigen, dass die Anwendung an Ihre E-Mail-Adresse gesendet wurde.

  1. Wechseln Sie in einem Terminalfenster zum Verzeichnis der obersten Ebene Ihres Android-Testanwendungsprojekts:

    cd ${HOME}/android-apps/TestAndroidBuild
  2. Zum Auslösen des Builds übertragen Sie ihn per Push-Funktion an den Master-Branch des Quellcode-Repositorys.

    git push google develop
  3. Rufen Sie in der Cloud Console die Seite "Cloud Build" auf.

  4. Klicken Sie auf den neuesten laufenden Build, um sich die Build-Ausgabe des Anwendungs-Builds anzusehen.

Bereinigen

Nachdem Sie die Anleitung abgeschlossen haben, sollten Sie die in Google Cloud erstellten Ressourcen bereinigen, damit sie Ihnen nicht weiter in Rechnung gestellt werden. In den folgenden Abschnitten wird erläutert, wie Sie diese Ressourcen löschen oder deaktivieren.

Projekt löschen

Am einfachsten vermeiden Sie weitere Kosten durch Löschen des für die Anleitung erstellten Projekts.

So löschen Sie das Projekt:

  1. Wechseln Sie in der Cloud Console zur Seite Ressourcen verwalten.

    Zur Seite "Ressourcen verwalten"

  2. Wählen Sie in der Projektliste das Projekt aus, das Sie löschen möchten, und klicken Sie dann auf Löschen .
  3. Geben Sie im Dialogfeld die Projekt-ID ein und klicken Sie auf Beenden, um das Projekt zu löschen.

Image-Registrys löschen

Löschen Sie die Image-Registrys für das Android SDK-Image und das Android-Anwendungs-Image.

  1. Scrollen Sie im linken Navigationsmenü der Cloud Console zum Abschnitt Tools und klicken Sie auf Container Registry Images.
  2. Wählen Sie alle Images aus.

    Alle Images auswählen

  3. Klicken Sie auf Löschen.

Cloud Storage-Buckets löschen

Löschen Sie die Cloud Storage-Buckets, die die Android-Signaturinformationen und die Fabric-Attribute enthalten. Verwenden Sie in Cloud Shell die folgenden Befehle. Ersetzen Sie die Platzhalter dabei durch die entsprechenden Werte:

  1. Legen Sie die Umgebungsvariable PROJECT fest.

    export PROJECT=$(gcloud config get-value project)
    
  2. Löschen Sie die Storage-Buckets, die für den Build erstellt wurden.

    gsutil rm gs://$PROJECT-cache-bucket
    gsutil rm gs://$PROJECT-config-bucket
    gsutil rm gs://$PROJECT-artifact-bucket
    

Build-Trigger löschen

  1. Löschen Sie den Android SDK-Basis-Build-Trigger.
  2. Löschen Sie den Android-Build-Trigger.

Löschen Sie die Anwendung aus Firebse

  1. Rufen Sie die Firebase Console auf.

  2. Wählen Sie das Firebase-Projekt aus, das Sie für die Anleitung erstellt haben. Es sollte einen ähnlichen Namen wie [PROJECT_NAME] haben.

  3. Wählen Sie im Menü "Einstellungen" die Option "Projekteinstellungen" aus. Firebase-Projekteinstellungen

  4. Scrollen Sie auf der Seite nach unten und klicken Sie auf Projekt löschen.

Weitere Informationen