本記事の主旨
Xamarin.Formsで作成したAndroidアプリを、AzureDevOps Pipelinesで、ビルドからGoogle Play Consoleへリリースするまでの手順をまとめる。
環境
Android開発フレームワーク
Xamarin.Forms 5.0.0.2244
ビルド・リリース環境
Azure DevOps Pipelines
リリース先
Google Play Console(Google Cloud Platformのサービスアカウントを使用)
前提条件
- ソースファイルはAzure DevOpsのRepos(Git)で管理している
- ビルドで使用するYAMLファイルは事前に作成しリポジトリに含めている
- 成果物のフォーマットはaab
- Google Play Consoleへのリリースに必要なGoogle Cloud Platformのサービスアカウントを事前に登録し鍵を取得している
- Azure DevOpsに「Google Playのプラグイン」をMarketplaceよりインストール済みである
- リリース処理については、すでに一度Google Play Consoleにアプリを公開済みであること(初回は手動で行う必要があるため)
作業詳細
ビルドはYAMLファイルを事前に作成しPipelineで行う。 Google Play Consoleへの発行はPipelinesのReleaseをブラウザで設定し行う。
Azure DevOps Pipelinesによるビルド
Library設定
Azure DevOps PipelinesのLibraryに以下を登録する。
- Variable group(Pipelineでソース上のProduct用シークレット情報を置換する際に使用)
- Secure files(Google Play Consoleへaabをリリースる際に必要なKeyStoreファイル)
Variable groupの登録手順は下記を参照
Azure DevOps の Pipelines の変数を使おう - かずきのBlog@hatena
ハードコーディングされた値は死すべし!! ということで Azure DevOps の Pipelines で変数使っていこうと思います。 docs.microsoft.com ハローワールド 何事もハローワルドから。variables で変数を定義できます。定義した変数は $(変数名) で参照できます。ということでさくっと以下のようはパイプラインの yaml を作ってみました。後々の確認のために特に必要はないのですが stage から定義しています。 trigger: - master variables: var1: Hello var2: World pool: vmImage: 'ubu…
Secure fileの登録手順は下記を参照
KeyStoreファイルについてはこちらを参照
作業後のLibraryはこんな感じ
YAMLファイル作成
Pipelineのビルドで使用するYAMLファイルを事前に作成しておく。(ブラウザポータル上で作成することも可能)
処理の概要は以下のとおり。
- 変数の定義
- ソースコード上のシークレット情報置換(Bash)
- Android Manifestのバージョンコード置換(PowerShell)
- NugetToolインストール
- Keystoreファイルのダウンロード
- ビルド
- aabファイルの発行
シークレットはjsonやXMLであれば置換するライブラリが用意されているが、C#の定数クラスを使っているので自力でシェルスクリプトによる置換を行っている。
実際のYAMLファイルはこんな感じ。
このYAMLファイルを対象とした新規Pipelineを作成し、実行するとRelease可能なaabファイルを作成することができる。
既存のYAMLファイルを対象とした新規Pipelineの作成手順は以下記事を参照。
Azure DevOps Pipelinesによるリリース
Azure DevOpsのPipelines→Releasesより、Create Releaseをクリック
「empty job」をクリック
Releaseジョブのstage nameを入力し右上の×で閉じる
「Add an artifact」をクリック
対象となるartifact(aabファイル)の条件を入力し、「add」をクリック
※ビルドをトリガーで自動実行するようにしたい場合は、Artifactのイナズマアイコンをクリックし、「Continuous deployment trigger」を「Enable」にする。
Stagesの「1 job, 0 task」のハイパーリンクをクリック
「Agent job」の右横にある「+」をクリック
Google Playで検索し、「Google Play - Release」の「Add」をクリック
※Google Playプラグインを追加していない場合は、MarketplaceよりAzure DevOpsにインストールする →
Google Playのプラグイン
「Release to internal」を選択し、「Service connection」の「+New」をクリック
Google Cloud Platformに登録してあるサービスアカウントの情報を入力し「Save」をクリック
- サービスアカウントの作成手順は、「Google Play Console APIを使う方法|kosuke matsumura|note」を参照
- 「Private key」は、Google Cloud Platformのサービスアカウントに登録してあるjson形式の鍵ファイルの「private_key」の値(-----BEGIN PRIVATE KEY----- で始まる)を丸ごとコピペする
- ここで登録したService connectionは、Project Settings→Service connectionsから変更できる
「Application id (com.google.MyApp)」、「Bundle path」、「Language code」を入力し、「Save」をクリック
RunでReleaseを実行すれば完了
まとめ
Github Actions等にくらべ、情報がかなり少なく、公式ドキュメントのみでは理解しきれなかったため非常に苦労した。
しかし、この一度の苦労で今後のビルドおよびリリースを自動化できることを思えばチャレンジするだけの価値はあると思う。
間違いや、もっとこうすると良いよーや、その他ご意見ご感想などあれば、コメントや Mastodonで教えていただけるとうれしい。
参考サイト