Azure Pipelines で Android アプリの CI をやってみてる
最近 Microsoft から発表された Azure DevOps。 Visual Studio Team Foundation (VSTF) をリブランドしたものだそう。
- Azure DevOps の概要 | ブログ | Microsoft Azure
- Visual Studio Team ServicesからAzure DevOpsへ - kkamegawa's weblog
VSTF のときに試しのプロジェクトを 1 個作ってそのまま放置していたのだけど、せっかくなのでこの機会に触ってみることにした。 まずは CI/CD サービスの Azure Pipelines を使ってみてる。
やってみた
単純なビルド
GitHub でホスティングしている Android プロジェクトの CI として、単に ./gradlew build
するぐらいのものを構成するだけならすごく簡単。
Azure DevOps で新しいプロジェクトを作成して、その中の 「Pipelines」 の 「Builds」 を開くと新しいビルドパイプラインの構成を行う画面が出てくる。 Web 上でぽちぽちするとビルドパイプラインの設定が作られてそのまま GitHub の pull request にしてくれた。
- Azure DevOps が作ってくれた pull request : Set up CI with Azure Pipelines by nobuoka · Pull Request #5 · nobuoka/android-Yuyu-Tumblr · GitHub
ただ、Gradle のビルドファイルだけを見て 「Gradle プロジェクトだ」 って判断されるみたいで、初期の構成は Android 向けではなくて普通の Gradle プロジェクト向けになってしまっている。 なので、「Build Android apps with Azure Pipelines or TFS - Azure Pipelines & TFS | Microsoft Docs」 を見ながら自分で構成をいじる必要がある。
pool: vmImage: 'macOS-10.13' steps: - task: Gradle@2 inputs: workingDirectory: '' gradleWrapperFile: 'gradlew' gradleOptions: '-Xmx3072m' publishJUnitResults: true testResultsFiles: '**/TEST-*.xml' tasks: 'build'
『The Android Emulator is currently available only on the Hosted macOS agent.』 とのことで、主には VM image を MacOS にする必要がある *1。
自動ビルドの設定
私の場合、初期状態だと GitHub からの web hook が無効になっていた *2。 ビルドパイプラインの設定 (YAML ファイルじゃなくて web 側) の中に 「Triggers」 ってのがあるので、そこで web hook を有効にするとコミットごとなどの CI 実行を設定できる。
テストカバレッジの Codecov へのアップロード
Codecov にテストカバレッジをアップロードするにはコマンドを実行する必要がある。 Bash タスクも用意されているので、簡単に実現できる。
steps: - task: Gradle@2 (中略) - task: Bash@3 inputs: targetType: 'inline' script: 'bash <(curl -s https://codecov.io/bash)' workingDirectory: '' env: 'CODECOV_TOKEN': '$(codecovToken)'
codecovToken
は自分で設定したビルドパイプラインの secret variable で、環境変数として使うにはこのように明示的にマッピングしてやる必要がある。 最初 env
プロパティの部分を inputs
の中に入れてしまっていて、YAML パースエラーが発生してちょっとはまってた。
Azure Pipelines の bash タスクで環境変数を設定しようとしてるのだけど 『azure-pipelines.yml (Line: 21, Col: 7): Expected a scalar value』 って怒られて原因不明で難しい。 https://t.co/6pwYiQi2Iy
— Nobuoka Yu (@nobuoka) 2018年10月27日
雑感
まだビルド実行とカバレッジのアップロードぐらいしかやっていないけど、それぐらいなら (ちょっとハマった箇所もあったけど) 素直に構成できた。 ビルドパイプライン単体で他の CI/CD ツールと比較しての強みはまだ見えてないのだけど、Azure DevOps として他のサービスとの連携がやりやすい点は強みっぽい。
ライブラリなどのキャッシュ周りとか、ビルド環境を準備するのが大変な場合にどうするのか (CircleCI では Docker コンテナ内でのビルドという解決策が提示されたが、Azure Pipelines の方はどうなってるんだろう) というあたりは気になっている。 (まだ調べられていない。)