androidアプリのCI環境(自動ビルドとテスト版自動配信)を全部無料で整える 其の壱
どうも、のらぬこです。
今回の話は、個人開発しているandroidアプリのソース管理(gitホスティングサービス)、自動ビルド、自動テスト配信環境を全部無料で整えたというお話の第一弾(前半)になっております。
この記事では、これらのことをどのように実現したかという観点で、ソース管理の話から自動ビルド環境を構築したところまでの話をします。
利用したサービスは以下の3つです。
- BitBucket
- Bitrise
- fabric(crashlytics beta配信)
- リリース済アプリのクラッシュ情報を自動で収集、報告してくれる等のサービスが提供されています。
- 今回は、その中の一つ、テスト版をチームメンバーに自動配信するようなサービスを利用します。
なお、今回の話は、Bitbucketアカウント登録から、Bitriseを利用した自動ビルド環境構築までの話になります。
さて、僕はandroidの個人開発を始めた当初から、gitホスティングサービスとしてマイクロソフトが提供しているVisual Studio Team Serviceを利用していました。
ちなみに、Visual Studio Team Serviceはソース管理(gitとMS製のバージョン管理システムに対応)と自動ビルド&デプロイ、Issue管理をひとまとめにしたようなWeb上のサービスになります。
5人以上のチームで使用する場合には有償になりますが、メンバーがそれ未満の場合にはサービス利用は基本無料となり、例えば、プライベートgitリポジトリなども数や容量の制限なく自由にいくつでも作成することができる(逆に、パブリックなリポジトリは作成できない)等、ちょっとほかには見られないような特徴も持っています。
また、.net系のアプリやwebサービスはもちろん、nodejsなwebアプリ、mavenやgradle管理のJVM系言語、androidやxcodeにも対応したCI環境も用意されており、さらにazureへの自動デプロイもできたりして*1、お金はかけたくないけどいろいろ使ってみたい等、用途によってはとても良いサービスだと思います。
Visual Studio Team Serviceについては、以前紹介記事も書いているので、ご興味ありましたら合わせてごらんください。 noranuk0.hatenablog.com
僕ももともとはgitリポジトリのホスティングサービスとしてしか活用していなかったのですが、開発中Androidアプリの自動ビルドもそのうちやりたいなーとは思っていました。
が、Visual Studio Team Serviceで用意されていたAndroidの自動ビルド環境は割と残念な出来栄えで、自動ビルドには成功しませんでした。
どの辺が残念かというと、環境がかなり古く、例えば用意されているsdkバージョンに未だにandroid-19が使われていました。
しかもおそらくアクセス権限関係?でSDKのアップデートもできない状態で、どうにも使用するには堪えないような代物だったんです。
半ばあきらめていたのですが、gitリポジトリにはBitbucketを使い、リポジトリへのpushをトリガーとした自動ビルドにはbitriseを、ビルド済apkの自動配信にはfabricを使えば、僕のやりたいことは全部無料で実現できそうだと分かり、早速試してみました。
結果、自動ビルド&自動配信まで無事に行うことができるようになりました。
前置きが長くなってしまいましたが、これから手順等の紹介をします。
gitリポジトリの移行
まずは、BitBucketのアカウントを作ります。
BitBucketもVSTSと同様に少人数チームであればプライベートリポジトリも割と無制限に作れるようです。
Bitbucketのアカウント作成と他のリポジトリからのソースのインポートについては特に説明の必要ないかと思います。
どうしても何かを見ながらやりたい方はこの辺(↓)でよさげなページを探してください。
bitbucket アカウント作成 - Google 検索
gitはtortoiseGitかSourceTree経由で使っててコマンドとかよく解んないっていう僕みたいな人は、Bitbucketには他のgitホスティングサービスのリポジトリを丸ごとインポートできるUIを持っているので、そいつを使えば移行も簡単です。
ただしその場合、移行後にローカルリポジトリのoriginの向き先を変えるなり、BitBucketからcloneし直すなりしないと後でちょっと残念な気持ちになるかもしれません。
Bitriseで自動ビルド環境を準備する
Bitriseは、iOS, android, unityプロジェクトのCI環境を提供しているモバイルアプリに特化したCIサービスです。
CIによる自動ビルドも、月に200ビルドまでは無料で利用することができるため、個人利用であれば無料枠内で十分に活用できると思います。もちろん、ちゃんとテストを書いていれば、時間制限はあると思いますが、androidエミュレータを利用した自動テストも当然可能です。
ソースコードは、対応するgitホスティングサービスと連携し、そこから取得ことになります。
対応しているgitホスティングサービスは、GitHub, BitBucket, GitLabの3つです。。
実は、この記事を書いていて気が付いたのですが、任意のgitリポジトリを指定することもできたようです*2。
ビルド手順は、workflowと呼ばれるWeb上のツールで設定します。
なお、基本的なテンプレートは最初から用意されており、ソース取得元のgitリポジトリを指定すれば、中身をみてAndroid、iOS、Unityの設定を自動生成してくれるため、特にカスタマイズが必要なければそのまますぐに使えます。
ただし、ビルド結果やビルド済みファイルのダウンロードURLが記入されたメールの配信などは、デフォルトでは行ってくれません。
ビルド結果とダウンロードURLが書かれたメール通知やSlack通知、今回僕が行ったようなfabricを利用したテスト版配信等をやりたい場合は、多少の設定追加、変更などのカスタマイズが必要です。
なお、カスタマイズする場合も、難しいことをする必要は全然ありません。
例えば、特定のURLからファイルをダウンロードしたり、ビルド結果をslackに通知するためのひな型は最初から用意されており、使いたいコンポネントを選択し、URLやAPIキーなどの情報を入力するだけで使えるようになっています。
アプリの署名については、少し注意が必要です。
androidアプリの場合、apkを署名するための鍵が必要になります。
デバッグ用の鍵はbitrise側で用意されているため、特に意識せずともデバッグ用に署名されたapkをビルドしてくれます。しかし、どうも毎回必ず同じ鍵が使用されるわけではないようで、更新版のインストールに失敗してしまうことがありました。
したがって、デバッグビルド用の鍵も自分で用意したほうが良いかもしれません。
独自の(自分で用意した)鍵を使いたい場合も、bitriseが鍵の保存場所を提供してくれているため、別途サーバを用意して鍵をWebからダウンロードできるようにしておく必要も、gitリポジトリに鍵をコミットしておく必要もありません。
僕の場合、ローカル開発環境で使用している鍵と同じものを使いたかったので、bitriseが用意してくれたアップロード場所に、普段開発PCで使用している鍵を登録しています。 qiita.com
無論、リリース向けの鍵についても、同様にbitriseのサーバにアップロードして、リリース版ビルド時にその鍵を参照するように設定しておけば、独自の鍵管理の仕組みを考える必要がなくなります。
ところで、自動ビルドの実行タイミングについてですが、初期設定では全てのブランチへのpush、プルリクをトリガーとして、すべて同じ手順でビルドが実行されるようになっています。
例えば、developへのpush時はdebug版、masterへのpushでリリース版のapkをビルドするような場合には、ワークフローを複数作成し、エディター画面の「trigger pattern」と書かれたリンクから、トリガーの種類と使用するワークフローを関連付けする必要があります。
トリガーには、特定ブランチへのpush時、特定ブランチへのプルリク時、特定パターンのタグがpushされた時を指定することができるようになっています。
これらの設定内容は最終的にはymlに落ちますが、ymlでしか書けないような設定は(おそらく)ありません。
全てGUIツールで設定が可能になっています。
自分が使っているymlの設定はこんな感じです。 developへのpushでデバッグ版、masterへのpushでリリース版がビルドされ、ビルド成功時にはfabric betaへの自動配信までやってくれます。
--- format_version: 1.3.1 default_step_lib_source: https://github.com/bitrise-io/bitrise-steplib.git trigger_map: - push_branch: master workflow: master - push_branch: develop workflow: develop workflows: master: steps: - activate-ssh-key@3.1.1: run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' - git-clone: {} - script@1.1.3: title: Do anything with Script step - install-missing-android-tools@1.0.1: {} - gradle-runner: inputs: - gradle_task: "$GRADLE_TASK_PREFIX$POSTFIX_RELEASE $CRASHLYTICS_UPLOAD_DISTRIBUTION_PREFIX$POSTFIX_RELEASE" - deploy-to-bitrise-io@1.2.9: inputs: - notify_user_groups: none - notify_email_list: "$EMAIL_NOTIFICATION" envs: - KEY: '' opts: is_expand: true develop: steps: - activate-ssh-key@3.1.1: is_always_run: true run_if: '{{getenv "SSH_RSA_PRIVATE_KEY" | ne ""}}' - git-clone: is_always_run: true - file-downloader@0.9.1: is_always_run: true inputs: - source: "$BITRISEIO_MYSYNCER_DEBUG_YMEWHJSL_URL" - destination: app/signingConfigs/debug.keystore - script@1.1.3: title: Do anything with Script step is_always_run: true - install-missing-android-tools@1.0.1: is_always_run: true - gradle-runner: is_always_run: true inputs: - gradle_task: "$GRADLE_TASK_PREFIX$POSTFIX_DEBUG $CRASHLYTICS_UPLOAD_DISTRIBUTION_PREFIX$POSTFIX_DEBUG" - deploy-to-bitrise-io@1.2.9: inputs: - notify_email_list: "$EMAIL_NOTIFICATION" app: envs: - opts: is_expand: false GRADLE_BUILD_FILE_PATH: build.gradle - opts: is_expand: false GRADLE_TASK_PREFIX: assemble - opts: is_expand: false GRADLEW_PATH: "./gradlew" - opts: is_expand: true CRASHLYTICS_UPLOAD_DISTRIBUTION_PREFIX: crashlyticsUploadDistribution - opts: is_expand: true POSTFIX_DEBUG: Debug - opts: is_expand: true POSTFIX_RELEASE: RELEASE - opts: is_expand: true EMAIL_NOTIFICATION: ********@gmail.com
fabricbeta配信の話まで書こうと思っていたのですが、そろそろ眠くなってきたので続きはまた今度、ということで。
ちょっと中途半端で終わっていますが、お読みいただいてありがとうございました。
PVがあろうがなかろうが、続編も近日中に公開予定です。