Azure Pipelines 使っていますか? 昨今は GitHub Actions に後塵を拝している感が否めませんが、マルチステージを利用した承認機能など、実は結構便利に利用できます。今回は Xamarin.Forms で実装した iOS アプリをビルドするための Azure Pipelines を組んでみます。またビルド結果を AppCenter へ送信し、テスト配布も行います。
全体を一本の記事にするととても長くなってしまうためビルドとテスト配布の2つに分割しました。本記事は前編のビルド編です。
今回試したものはこちらに置いてあります。
https://github.com/noxi515/pipeline-sample-xamarin-ios
Xamarin iOS をビルドする Pipeline YAML は全体でこのようになります。
variables:BuildConfiguration:'Ad-Hoc'DotnetSdkVersion:'3.1.404'MonoVersion:'6_12_0'XcodeRootPath:'/Applications/Xcode_12.2.app'# - AppleCertificatePassword: 'dummy' これはPipelineの環境変数にSecure属性で登録するpool:vmImage:'macOS-10.15'# or 'macOS-latest'steps:# .NET SDK をインストール-task: UseDotNet@2inputs:packageType:'sdk'version:'$(DotnetSdkVersion)'# mono バージョンを固定-script: sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh $(MonoVersion)# Xcode バージョンを固定-script: echo '##vso[task.setvariable variable=MD_APPLE_SDK_ROOT;]'$(XcodeRootPath);sudo xcode-select --switch $(XcodeRootPath)/Contents/Developer# Provisioning Profile をインストール# 'sample.mobileprovision' を SecureFiles に保存しておく-task: InstallAppleProvisioningProfile@1inputs:provisioningProfileLocation: secureFilesprovProfileSecureFile:'sample.mobileprovision'removeProfile:true# 署名証明書をインストール# 'sample.p12' を SecureFiles に保存しておく# AppleCertificatePassword を Secure 設定で環境変数に設定しておく-task: InstallAppleCertificate@2inputs:keychain:'temp'certSecureFile:'sample.p12'certPwd:'$(AppleCertificatePassword)'# NuGet tools をインストール-task: NuGetToolInstaller@1# NuGet パッケージを復元-task: NuGetCommand@2inputs:command:'restore'restoreSolution:'**/*.csproj'feedsToUse:'select'# Xamarin iOS アプリをビルド-task: XamariniOS@2inputs:solutionFile:'SampleApp.sln'configuration:'$(BuildConfiguration)'packageApp:truerunNugetRestore:falseargs:'/p:IpaPackageDir="$(Build.ArtifactStagingDirectory)"'signingIdentity:'$(APPLE_CERTIFICATE_SIGNING_IDENTITY)'signingProvisioningProfileID:'$(APPLE_PROV_PROFILE_UUID)'# ビルド結果の ipa ファイルを Pipeline Artifacts へ転送-task: PublishBuildArtifacts@1condition: succeededOrFailed()inputs:PathtoPublish:'$(Build.ArtifactStagingDirectory)'
ここからは Xamarin iOS のビルドに使用する Azure Pipelines のタスクを紹介します。
Azure Pipelines でビルドに使用するマシンに Provisioning Profile をインストールするタスクです。インストールする Provisioning Profile は Secure Filesに保存したものから選択します。インストールされた Provisioning Profile をステージ完了時に削除するオプションもあり安心です。またこのタスクを利用してインストールした Provisioning Profile はAPPLE_PROV_PROFILE_UUID
変数に ID が格納されます。
task: InstallAppleProvisioningProfile@1inputs:provisioningProfileLocation:'secureFiles'provProfileSecureFile:'sample.mobileprovision'removeProfile:true
Secure Files は Azure Pipelines の Library 機能の一つです。 Provisioning Profile やビルド用の証明書など、 Repository に含めたくないファイルを管理できます。
Secure Filesの場所
アップロードしたファイルはAuthorize for use in all piplines
にチェックを入れることで全ての Pipeline から参照可能になります。
全ての Pipeline から利用する為のチェック
Azure Pipelines でビルドに使用するマシンに Apple の署名証明書をインストールするタスクです。インストールする証明書は Secure Filesに保存したものから選択します。デフォルトでインストールされた証明書はステージ完了時に削除されるためこちらも安心です。またこのタスクを使用してインストールした証明書はAPPLE_CERTIFICATE_SIGNING_IDENTITY
に格納されます。
task: InstallAppleCertificate@2inputs:keychain:'temp'certSecureFile:'sample.p12'certPwd:'$(AppleCertificatePassword)'
Xamarin iOS アプリをビルドするためのタスクです。前述のInstallAppleProvisioningProfile
タスクとInstallAppleCertificate
タスクを実行して得られた結果を利用すると配布用の実機ビルドを実行できます。ビルド時の引数でIpaPackageDir
を指定するとビルド結果の*.ipa
ファイルを拾いやすいです。runNugetRestore
を設定するとビルド時に NuGet の復元をしてくれるため便利ですが、事前にテストタスクを回すことが多いと思いますので、別途 NuGet Restore タスクを実行することをお勧めします。solutionFile
にはビルド対象のsln
またはcsproj
を指定します。ここは必ずソリューションファイルを指定しましょう。 Xamarin iOS をではビルドの設定がiPhone
やAd-Hoc
など多々存在し、依存プロジェクト側はDEBUG
とRELEASE
のみの場合があります。ソリューションファイルにはこのビルド情報が格納されていますので、直接 Xamarin iOS のプロジェクトファイルのみをビルドすると依存プロジェクトがビルドできません。
https://docs.microsoft.com/ja-jp/azure/devops/pipelines/tasks/build/xamarin-ios?view=azure-devops
task: XamariniOS@2inputs:solutionFile:'SampleApp.sln'configuration:'$(BuildConfiguration)'packageApp:truerunNugetRestore:falseargs:'/p:IpaPackageDir="$(Build.ArtifactStagingDirectory)"'signingIdentity:'$(APPLE_CERTIFICATE_SIGNING_IDENTITY)'signingProvisioningProfileID:'$(APPLE_PROV_PROFILE_UUID)'
ビルドに使用する macOS マシンは Azure Pipelines 側が管理しているものを使用すると、 Xcode などのバージョンは日々更新されていきます。ビルドに使用するものはバージョンが新しければ良いというものではなく、「何もしていないのにビルドが壊れた」という自体になりかねません。そこで、ビルドに使用するバージョンを固定する方法を紹介します。
なお Azure Pipelines で使用できる macOS マシンにインストールされているツールやバージョンはこちらから確認します。
https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops&tabs=yaml
https://github.com/actions/virtual-environments/blob/main/images/macos/macos-10.15-Readme.md
ビルドタスクに以下を挟みます。環境変数としてMonoVersion=6_12_0
と、 mono バージョンのドットをアンダースコアに変換したmonoを指定します。
script: sudo $AGENT_HOMEDIRECTORY/scripts/select-xamarin-sdk.sh $(MonoVersion)
どの mono バージョンを指定すれば良いのかは私にも良く分かりません。。。
ビルドタスクに以下を挟みます。環境変数としてXcodeRootPath=/Applications/Xcode_12.2.app
を指定します。指定可能な Xcode パスの一覧は前述のビルドマシン環境情報を参照して下さい。
script: echo '##vso[task.setvariable variable=MD_APPLE_SDK_ROOT;]'$(XcodeRootPath);sudo xcode-select --switch $(XcodeRootPath)/Contents/Developer
バッジを受け取った著者にはZennから現金やAmazonギフトカードが還元されます。