Android アプリのビルド、テスト、デプロイ
Azure DevOps Services
このクイック スタートでは、Android アプリを自動的にビルド、テスト、デプロイするように Azure Pipelines で YAML パイプラインを設定する方法について説明します。
前提条件
パイプラインを作成するし、アプリをデプロイするアクセス許可を持つ Azure DevOps 組織とプロジェクト。 プロジェクトを作成するには、「Azure DevOps でプロジェクトを作成する」を参照してください。
GitHub アカウント。
重要
GitHub の手順中に、GitHub サービス接続の作成を求められる、サインインするために Github にリダイレクトされる、Azure Pipeline をインストールする、Github 組織へ認証を行うように求められる場合があります。 画面上の指示に従って、プロセスを完了します。 詳細については、「Github リポジトリへのアクセス」を参照してください。
パイプラインを作成して実行する
次のタスクを実行して、単純な Android アプリケーションのパイプラインを設定します。
- サンプル アプリのコードを取得するには、Android サンプル アプリ リポジトリを GitHub アカウントにフォークします。
- Azure DevOpsプロジェクトで、このパイプラインが最初のパイプラインである場合は、[パイプライン]>[新規パイプライン] の順に選択するか、[パイプラインを作成] を選択します。
- ソース コードの場所として [GitHub] を選択します。
- [リポジトリの選択] 画面で、フォークされた Android サンプル リポジトリを選択します。
- [パイプラインを構成] 画面で [Android] を選択します。
- Azure Pipelines には、Android テンプレートに基づくスターター パイプラインが用意されています。 パイプライン コードを見直します。
- [保存して実行] を選択します。
- 必要に応じて、[メッセージをコミット] を編集し、説明を入力します。 次に、[保存して実行] を再度選択し、azure-pipelines.yml ファイルをリポジトリにコミットして、ビルドを開始します。
[ビルド実行] ページには、ビルドの詳細を進行状況が表示されます。 動作中のパイプラインを確認するには、ページ下部にある [Job] を選択します。
これで、リポジトリで Android YAML パイプライン (azure-pipelines.yml) が稼働し、カスタマイズできるようになりました。
パイプラインをカスタマイズする
パイプラインに変更を加えるには、[パイプライン] パイプラインで、[編集] を選択します。 次のセクションでは、Android パイプラインをカスタマイズする一般的な方法について説明します。
Gradle の構成
スターター YAML パイプラインでは、Android プロジェクト用の一般的なオープンソース ビルド ツールである Gradle を使用します。 詳細については、「Gradle タスク」を参照してください。
この例のタスクでは、tasks
パラメータが assembleDebug
ビルドの種類をビルドします。? build
、test
、assembleRelease
など必要なビルド バリアントの 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 変数に jarsignerKeystorePassword
と jarsignerKeyPassword
を格納し、これらの変数をパイプラインで使用します。
- 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 アプリケーションのアップデートをあるトラックから別のトラック (alpha
→ beta
など) に昇格させるには、パイプラインに 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 をビルドして署名できます。
キーストアをダウンロードし、安全なファイルとして、Azure Pipelines ライブラリに保存します。
変数グループで、
keystore.password
、key.alias
、key.password
の変数を作成します。
YMAL パイプラインで、次を実行します。
Download Secure File タスクを追加して、app.keystore セキュア ファイルをダウンロードします。
- task: DownloadSecureFile@1 name: keyStore displayName: "Download keystore from secure files" inputs: secureFile: app.keystore
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)
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 に公開します。
関連する拡張機能
- Codified Security から Codified Security
- Microsoft から Google Play
- James Montemagno から iOS および Android 用のモバイル アプリ タスク
- Perfecto Mobile から Mobile Testing Lab
- Microsoft から React Native