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

Azure DevOps Services

このクイック スタートでは、Android アプリを自動的にビルド、テスト、デプロイするように Azure Pipelines で YAML パイプラインを設定する方法について説明します。

前提条件

  • パイプラインを作成するし、アプリをデプロイするアクセス許可を持つ Azure DevOps 組織とプロジェクト。 プロジェクトを作成するには、「Azure DevOps でプロジェクトを作成する」を参照してください。

  • GitHub アカウント。

    重要

    GitHub の手順中に、GitHub サービス接続の作成を求められる、サインインするために Github にリダイレクトされる、Azure Pipeline をインストールする、Github 組織へ認証を行うように求められる場合があります。 画面上の指示に従って、プロセスを完了します。 詳細については、「Github リポジトリへのアクセス」を参照してください。

パイプラインを作成して実行する

次のタスクを実行して、単純な Android アプリケーションのパイプラインを設定します。

  1. サンプル アプリのコードを取得するには、Android サンプル アプリ リポジトリを GitHub アカウントにフォークします。
  2. Azure DevOpsプロジェクトで、このパイプラインが最初のパイプラインである場合は、[パイプライン]>[新規パイプライン] の順に選択するか、[パイプラインを作成] を選択します。
  3. ソース コードの場所として [GitHub] を選択します。
  4. [リポジトリの選択] 画面で、フォークされた Android サンプル リポジトリを選択します。
  5. [パイプラインを構成] 画面で [Android] を選択します。
  6. Azure Pipelines には、Android テンプレートに基づくスターター パイプラインが用意されています。 パイプライン コードを見直します。
  7. [保存して実行] を選択します。
  8. 必要に応じて、[メッセージをコミット] を編集し、説明を入力します。 次に、[保存して実行] を再度選択し、azure-pipelines.yml ファイルをリポジトリにコミットして、ビルドを開始します。

[ビルド実行] ページには、ビルドの詳細を進行状況が表示されます。 動作中のパイプラインを確認するには、ページ下部にある [Job] を選択します。

これで、リポジトリで Android YAML パイプライン (azure-pipelines.yml) が稼働し、カスタマイズできるようになりました。

パイプラインをカスタマイズする

パイプラインに変更を加えるには、[パイプライン] パイプラインで、[編集] を選択します。 次のセクションでは、Android パイプラインをカスタマイズする一般的な方法について説明します。

Gradle の構成

スターター YAML パイプラインでは、Android プロジェクト用の一般的なオープンソース ビルド ツールである Gradle を使用します。 詳細については、「Gradle タスク」を参照してください。

この例のタスクでは、tasks パラメータが assembleDebug ビルドの種類をビルドします。? buildtestassembleRelease など必要なビルド バリアントの tasks 値を調整できます。

このサンプル タスクでは、gradlew ファイルがリポジトリのルートにあることを前提としています。 そうでないバイアは、workingDirectory 値と gradleWrapperFile 値をぞれぞれ調整します。

workingDirectory は、AndroidApps/MyApp$(system.defaultWorkingDirectory)/AndroidApps/MyApp のようなリポジトリのルートと類似している必要があります。 gradleWrapperFile パスは、AndroidApps/MyApp/gradlew$(system.defaultWorkingDirectory)/AndroidApps/MyApp/gradlew のようなリポジトリのルートと類似している必要があります。

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

Gradle タスクの使用方法の詳細については、Gradle ドキュメントの「タスクの使用」を参照してください。 ビルド タスクの詳細については、Google Android 開発ドキュメントの「デバッグ APKをビルド」および「ビルド バリアントを構成」を参照してください。

Android package (APK) に署名して調整する

エミュレータではなくデバッグで実行するには、Android Application Package (APK) に署名する必要があります。 Zipaligning は、アプリケーションが消費する RAM を削減します。 ビルドがまだ、APK に署名と zipalign していない場合、Android Signing タスクをパイプラインに追加します。 詳細については、「モバイル アプリに署名」を参照してください。

セキュリティを確保するには、secret 変数jarsignerKeystorePasswordjarsignerKeyPassword を格納し、これらの変数をパイプラインで使用します。

- task: AndroidSigning@2
  inputs:
    apkFiles: '**/*.apk'
    jarsign: true
    jarsignerKeystoreFile: 'pathToYourKeystoreFile'
    jarsignerKeystorePassword: '$(jarsignerKeystorePassword)'
    jarsignerKeystoreAlias: 'yourKeystoreAlias'
    jarsignerKeyPassword: '$(jarsignerKeyPassword)'
    zipalign: true

Android エミュレータでのテスト

Android エミュレータをインストールして実行するには、パイプラインに Bash タスクを追加し、次のコードを貼り付けます。 エミュレーターはバックグラウンド プロセスとして起動し、後のタスクで使用できます。 emulator パラメータは、テスト環境に合わせて調整します。

#!/usr/bin/env bash

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

# Create emulator
echo "no" | $ANDROID_HOME/tools/bin/avdmanager create avd -n xamarin_android_emulator -k 'system-images;android-30;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 -no-window -no-audio -no-boot-anim -accel off > /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 でホストされるデバイス上でテストする

Visual Studio App Center で Android デバイスのホストされたラボでアプリをテストするには、App Center Test タスクをパイプラインに追加します。

このタスクには、App Center 無料試用版アカウントが必要です。テスト ラボを引き続き使用するには、30 日後に有料版に移行する必要があります。 このタスクを使用する前に App Center アカウントにサインアップします

次の例では、App Center テスト スイートを実行します。 タスクは、セットアップが必要なサービス接続を使用します。

タスクの完全な構文とリファレンスについては、「App Center Test タスク」を参照してください。 詳細については、「UI テストに Azure DevOps を使用する」を参照してください。

- task: AppCenterTest@1
  inputs:
    appFile: path/myapp.ipa
    artifactsDirectory: '$(Build.ArtifactStagingDirectory)/AppCenterTest'
    frameworkOption: 'appium'
    appiumBuildDirectory: test/upload
    serverEndpoint: 'My App Center service connection'
    appSlug: username/appIdentifier
    devices: 'devicelist'

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

APK ファイルをビルド レコードで保管する、またはそれらを後続のパイプラインでテストやデプロイするには、Copy Files タスクと Publish Build Artifacts タスクをパイプラインに追加します。 詳細については、「パイプライン成果物を発行してダウンロードする」を参照してください。

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

App Center にデプロイする

テスターまたはベータ ユーザーのグループにアプリを配布したり、アプリを Intune または Google Play に宣伝したりするには、App Center Distribute タスクを追加します。 このタスクには、無料の App Center アカウントが必要です。

次の例では、アプリをユーザーに配布します。 タスクの完全な構文とリファレンスについては、「App Center Distribute」を参照してください。 詳細については、「App Center を使用した Azure DevOps ビルドのデプロイ」を参照してください。

- task: AppCenterDistribute@3
  inputs:
    serverEndpoint: 'AppCenter'
    appSlug: '$(APP_CENTER_SLUG)'
    appFile: '$(APP_FILE)' # Relative path from the repo root to the APK file you want to publish
    symbolsOption: 'Android'
    releaseNotesOption: 'input'
    releaseNotesInput: 'Here are the release notes for this version.'
    destinationType: 'groups'

Google Play 拡張機能をインストールして Google Play にデプロイする

Google Play との対話を自動化するには、Google Play 拡張機能をインストールしてから、次のタスクを使用します。 デフォルトでは、これらのタスクは、構成する必要があるサービス接続を使用して Google Play に対して認証されます。

リリース

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

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

昇格

以前にリリースされた Android アプリケーションのアップデートをあるトラックから別のトラック (alphabeta など) に昇格させるには、パイプラインに Google Play Promote タスクを追加します。

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

ロールアウトを増加させる

以前に rollout トラックにリリースされたアプリケーションのロールアウト率を上げるには、パイプラインに Google Play Increase Rollout タスクを追加します。

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

更新の状態

以前に rollout トラックにリリースされたアプリのロールアウト ステータスを更新するには、パイプラインに Google Play Status Update タスクを追加します。

  - task: GooglePlayStatusUpdate@2
    inputs:
      authType: ServiceEndpoint
      packageName: 'com.yourCompany.appPackageName'
      serviceEndpoint: 'yourGooglePlayServiceConnectionName'
      status: 'inProgress' # draft | inProgress | halted | completed

アプリ バンドルの作成

インライン スクリプトと安全なファイルを使用して App Bundle をビルドして署名できます。

  1. キーストアをダウンロードし、安全なファイルとして、Azure Pipelines ライブラリに保存します。

  2. 変数グループで、keystore.passwordkey.aliaskey.password の変数を作成します。

YMAL パイプラインで、次を実行します。

  1. Download Secure File タスクを追加して、app.keystore セキュア ファイルをダウンロードします。

    - task: DownloadSecureFile@1
      name: keyStore
      displayName: "Download keystore from secure files"
      inputs:
        secureFile: app.keystore
    
  2. Bash スクリプトで Bash タスクを使用して、App Bundle をビルドして署名します。

    - 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)
    
  3. Copy Files タスクを使用して App Bundle をコピーします。

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

ここから、Publish Build Artifact タスクを使用してアーティファクトを作成または保存するか、 Google Play 拡張機能を使用して App Bundle に公開します。