Android アプリのビルド、テスト、およびデプロイ

このガイダンスでは、Android アプリを自動的にビルド、テスト、および配置する方法について説明します。

はじめに

サンプル Android アプリのパイプラインを設定するには、次の手順に従います。

  1. 次のリポジトリのコードは、単純な Android アプリです。 まず、このリポジトリを GitHub アカウントにフォークします。

    https://github.com/MicrosoftDocs/pipelines-android
    
  2. Azure DevOps 組織にサインインし、プロジェクトに移動します。

  3. プロジェクト内で、 [パイプライン] ページに移動します。 次に、新しいパイプラインを作成するためのアクションを選択します。

  4. 最初に、ソース コードの場所として GitHub を選択し、ウィザードの手順を実行します。

  5. サインインするために GitHub にリダイレクトされる場合があります。 その場合は、GitHub の資格情報を入力します。

  6. リポジトリの一覧が表示されたら、Java サンプルリポジトリを選択します。

  7. Azure Pipelines は、リポジトリ内のコードを分析し、パイプライン用のスターターテンプレートを推奨します。 Android テンプレートを選択します。

  8. Azure Pipelines によって、パイプラインの YAML ファイルが生成されます。 [保存および実行] を選択し、 [Commit directly to the main branch](メイン ブランチに直接コミットする) を選択した後、 [保存および実行] を再度選択します。

  9. 新しい実行が開始されます。 実行が終了するまで待ちます。

完了すると、自分でカスタマイズできるように、作業中の YAML ファイル ( azure-pipelines.yml ) がリポジトリに作成されます。

ヒント

このトピックの説明に従って YAML ファイルに変更を加えるには、[ パイプライン ] ページでパイプラインを選択し、ファイルを 編集azure-pipelines.yml ます。

Gradle

Gradle は、Android プロジェクトのビルドに使用される共通のビルドツールです。 これらのオプションの詳細については、「 Gradle タスク」を参照してください。

# https://docs.microsoft.com/azure/devops/pipelines/ecosystems/android
pool:
  vmImage: 'macOS-10.14'

steps:
- task: Gradle@2
  inputs:
    workingDirectory: ''
    gradleWrapperFile: 'gradlew'
    gradleOptions: '-Xmx3072m'
    publishJUnitResults: false
    testResultsFiles: '**/TEST-*.xml'
    tasks: 'assembleDebug'

ビルドパスを調整する

ファイルが gradlew リポジトリのルートにない場合は、workingDirectory の値を調整します。 ディレクトリの値は、リポジトリのルート (やなど) に対して相対的である必要があり AndroidApps/MyApp $(system.defaultWorkingDirectory)/AndroidApps/MyApp ます。

ファイルが gradlew リポジトリのルートにない場合は、gradleWrapperFile の値を調整します。 ファイルパス値は、またはのように、リポジトリのルートに対して相対的である必要があり AndroidApps/MyApp/gradlew $(system.defaultWorkingDirectory)/AndroidApps/MyApp/gradlew ます。

Gradle タスクの調整

やなど、必要なビルドバリアントの タスク 値を調整し assembleDebug assembleRelease ます。 詳細については、Google の Android 開発ドキュメントを参照してください。 デバッグ APK をビルド し、 ビルドバリアントを構成します。

Android APK の署名とアライン

ビルドで APK がまだ 署名 されていない場合は、Yaml に Android 署名 タスクを追加します。 APK は、エミュレーターではなくデバイスで実行するために署名されている必要があります。 Zipaligning は、アプリによって消費される RAM を削減します。

重要: 次の各パスワードを シークレット変数に格納することをお勧めします。
- task: AndroidSigning@2
  inputs:
    apkFiles: '**/*.apk'
    jarsign: true
    jarsignerKeystoreFile: 'pathToYourKeystoreFile'
    jarsignerKeystorePassword: '$(jarsignerKeystorePassword)'
    jarsignerKeystoreAlias: 'yourKeystoreAlias'
    jarsignerKeyPassword: '$(jarsignerKeyPassword)'
    zipalign: true

Android Emulator でテストする

注: 現時点では、Android Emulator は、ホストされている macOS エージェントでのみ使用できます。

Bashタスクを作成し、次のコードをコピーして、エミュレーターをインストールして実行します。 テスト環境に合わせてエミュレーターのパラメーターを忘れずに配置してください。 エミュレーターはバックグラウンドプロセスとして起動され、後続のタスクで使用できます。

#!/usr/bin/env bash

# Install AVD files
echo "y" | $ANDROID_HOME/tools/bin/sdkmanager --install 'system-images;android-27;google_apis;x86'

# Create emulator
echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd -n xamarin_android_emulator -k 'system-images;android-27;google_apis;x86' --force

$ANDROID_HOME/emulator/emulator -list-avds

echo "Starting emulator"

# Start emulator in background
nohup $ANDROID_HOME/emulator/emulator -avd xamarin_android_emulator -no-snapshot > /dev/null 2>&1 &
$ANDROID_HOME/platform-tools/adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed | tr -d '\r') ]]; do sleep 1; done; input keyevent 82'

$ANDROID_HOME/platform-tools/adb devices

echo "Emulator started"

Azure でホストされているデバイスでのテスト

IOS および Android デバイスのホストされたラボでアプリをテストする App Center テスト タスクを追加します。 App Center無料試用版が必要です。後で有料に変換する必要があります。

最初に App Center にサインアップします。

# App Center test
# Test app packages with Visual Studio App Center
- task: AppCenterTest@1
  inputs:
    appFile: 
    #artifactsDirectory: '$(Build.ArtifactStagingDirectory)/AppCenterTest' 
    #prepareTests: true # Optional
    #frameworkOption: 'appium' # Required when prepareTests == True# Options: appium, espresso, calabash, uitest, xcuitest
    #appiumBuildDirectory: # Required when prepareTests == True && Framework == Appium
    #espressoBuildDirectory: # Optional
    #espressoTestApkFile: # Optional
    #calabashProjectDirectory: # Required when prepareTests == True && Framework == Calabash
    #calabashConfigFile: # Optional
    #calabashProfile: # Optional
    #calabashSkipConfigCheck: # Optional
    #uiTestBuildDirectory: # Required when prepareTests == True && Framework == Uitest
    #uitestStorePath: # Optional
    #uiTestStorePassword: # Optional
    #uitestKeyAlias: # Optional
    #uiTestKeyPassword: # Optional
    #uiTestToolsDirectory: # Optional
    #signInfo: # Optional
    #xcUITestBuildDirectory: # Optional
    #xcUITestIpaFile: # Optional
    #prepareOptions: # Optional
    #runTests: true # Optional
    #credentialsOption: 'serviceEndpoint' # Required when runTests == True# Options: serviceEndpoint, inputs
    #serverEndpoint: # Required when runTests == True && CredsType == ServiceEndpoint
    #username: # Required when runTests == True && CredsType == Inputs
    #password: # Required when runTests == True && CredsType == Inputs
    #appSlug: # Required when runTests == True
    #devices: # Required when runTests == True
    #series: 'master' # Optional
    #dsymDirectory: # Optional
    #localeOption: 'en_US' # Required when runTests == True# Options: da_DK, nl_NL, en_GB, en_US, fr_FR, de_DE, ja_JP, ru_RU, es_MX, es_ES, user
    #userDefinedLocale: # Optional
    #loginOptions: # Optional
    #runOptions: # Optional
    #skipWaitingForResults: # Optional
    #cliFile: # Optional
    #showDebugOutput: # Optional

ビルドレコードを使用して成果物を保持する

ファイルの コピー とビルド 成果物の発行 タスクを追加して、apk をビルドレコードまたはテストと共に格納し、後続のパイプラインにデプロイします。 アーティファクトを参照してください。

- task: CopyFiles@2
  inputs:
    contents: '**/*.apk'
    targetFolder: '$(build.artifactStagingDirectory)'
- task: PublishBuildArtifacts@1

配置

App Center

テスト担当者またはベータユーザーのグループにアプリを配布したり、アプリを Intune または Google Play に昇格させたりするには、 App Center の配布 タスクを追加します。 無料の App Center アカウントが必要です (支払いは必要ありません)。

# App Center distribute
# Distribute app builds to testers and users via Visual Studio App Center
- task: AppCenterDistribute@1
  inputs:
    serverEndpoint: 
    appSlug: 
    appFile: 
    #symbolsOption: 'Apple' # Optional. Options: apple
    #symbolsPath: # Optional
    #symbolsPdbFiles: '**/*.pdb' # Optional
    #symbolsDsymFiles: # Optional
    #symbolsMappingTxtFile: # Optional
    #symbolsIncludeParentDirectory: # Optional
    #releaseNotesOption: 'input' # Options: input, file
    #releaseNotesInput: # Required when releaseNotesOption == Input
    #releaseNotesFile: # Required when releaseNotesOption == File
    #isMandatory: false # Optional
    #distributionGroupId: # Optional

Google Play

Google Play 拡張機能をインストールし、次のタスクを使用して Google Play との対話を自動化します。 既定では、これらのタスクは、構成した サービス接続 を使用して Google Play に対して認証されます。

Release

Google Play ストアに新しい Android アプリのバージョンをリリースするには、 Google Play リリース タスクを追加します。

- task: GooglePlayRelease@2
  inputs:
    apkFile: '**/*.apk'
    serviceEndpoint: 'yourGooglePlayServiceConnectionName'
    track: 'internal'

昇格

Google Play 昇格タスクを追加して、以前にリリースされた Android アプリの更新プログラムを、などのトラックから別のトラックに昇格させ alphabeta ます。

- task: GooglePlayPromote@2
  inputs:
    packageName: 'com.yourCompany.appPackageName'
    serviceEndpoint: 'yourGooglePlayServiceConnectionName'
    sourceTrack: 'internal'
    destinationTrack: 'alpha'

ロールアウトを増やす

ロールアウトタスクの Google Play を追加して、以前にトラックにリリースされていたアプリのロールアウトの割合を増やし rollout ます。

- task: GooglePlayIncreaseRollout@1
  inputs:
    packageName: 'com.yourCompany.appPackageName'
    serviceEndpoint: 'yourGooglePlayServiceConnectionName'
    userFraction: '0.5' # 0.0 to 1.0 (0% to 100%)

よく寄せられる質問

アプリバンドルを作成操作方法には

アプリケーションバンドルは、インラインスクリプトとセキュリティで保護されたファイルを使用してビルドし、署名することができます。 これを行うには、最初にキーストアをダウンロードし、 セキュリティで保護されたファイルとしてライブラリに保存する必要があります。 keystore.password変数グループには、、、およびの変数を作成する必要もあり key.alias key.password ます。

次に、 セキュリティで保護さ れたファイルをダウンロードし、 Bash タスクを使用してキーストアをダウンロードし、アプリバンドルをビルドして署名します。

この YAML ファイルでは、 app.keystore セキュリティで保護されたファイルをダウンロードし、bash スクリプトを使用してアプリバンドルを生成します。 次に、[ ファイルのコピー ] を使用して、アプリバンドルをコピーします。 そこから、 ビルド成果物の発行 を使用して成果物を作成して保存したり、 Google Play の拡張機能 を使用して発行したりすることができます。

- task: DownloadSecureFile@1
  name: keyStore
  displayName: "Download keystore from secure files"
  inputs:
    secureFile: app.keystore

- task: Bash@3
  displayName: "Build and sign App Bundle"
  inputs:
    targetType: "inline"
    script: |
      msbuild -restore $(Build.SourcesDirectory)/myAndroidApp/*.csproj -t:SignAndroidPackage -p:AndroidPackageFormat=aab -p:Configuration=$(buildConfiguration) -p:AndroidKeyStore=True -p:AndroidSigningKeyStore=$(keyStore.secureFilePath) -p:AndroidSigningStorePass=$(keystore.password) -p:AndroidSigningKeyAlias=$(key.alias) -p:AndroidSigningKeyPass=$(key.password)

- task: CopyFiles@2
  displayName: 'Copy deliverables'
  inputs:
    SourceFolder: '$(Build.SourcesDirectory)/myAndroidApp/bin/$(buildConfiguration)'
    Contents: '*.aab'
    TargetFolder: 'drop'