この記事は Android Advent Calendar 2017 の4日目の記事です。

はじめに

Android のアプリ開発工程, いい感じにしたいですよね。レイアウトや設計など, 色々考えなくてはならないことがたくさんあります。

僕も今年の夏に Android エンジニアになったばかりではあるのですが, 毎日あぁ……もっとイケにしたい…..とつぶやいています。

そのために個人でのプロダクトでの事例も含め, git flow でのアプリの開発工程において, 導入してみて良かったものを紹介します。

Danger

Pull Request 上で機械的なコードレビューをしてくれるツールです。 この記事でのメインになります。GitHub をはじめ, GitLab, Bitbucket といった主要なサービスはサポート対象になっています。

git や github に関するステータスを扱う API は用意されてますので, milestone がついているかの確認や PR のステータス, レビュワーの指定等はプラグイン無しでできるようになっています。

ここでは Ruby 版に限りますが, いくつかおすすめのプラグイン (gem) を紹介します。

Android Lint を実行し, 結果をコメントで教えてくれるプラグインです。単純に PR 上の変更範囲のファイルのみを lint の対象にしてくれる機能もあるので便利です。

FindBugs による静的解析を行った結果を教えてくれます。

(唐突に自分の gem を載せる)

セットで変更を管理したいファイルの組がある場合に, 片方が変更された時に, もう片方も変更されているべきという場合にコミット忘れの対象をリストで管理し, チェックしてくれるプラグインです。

GemfileGemfile.lock のような組もあれば, license-tools-plugin で使用している. ライブラリ一覧の xml と出力される html のファイルが両方変更されているかのチェック, といったような使われ方を想定しています。


機械的にチェックできるといった所を Danger にやってもらうことにより, コードの本質的な部分のレビューに集中できる割合が増えるという効果が見込まれますね。

プラグインに関するドキュメント もありますので, もしこれやってて便利というルールがあれば, ぜひプラグインにしていただけるとさらにイケになるのでよろしくお願いします。

生成された apk の動作確認

もう当たり前になったかもしれませんが, やはり DeployGate は便利です。

リリース用のブランチ (master にマージするブランチ) での場合に, 以下のスクリプトのような, 自動で apk をアップロードするルールを CI のワークフローに追加すると, より自動化されて良いと思います。

curl -F "token=xxx" \
     -F "file=@/path/to/apk" \
     -F "message=amazing" \
     https://deploygate.com/api/users/{owner}/apps

そもそも手元の環境は常に開発中であるので, 一旦作業中のものを退避してそしてビルドを待つ…という手間を無くすことができますね。

もし QA チームがいるならば, DeployGate 上の共有リンクを渡すことで済みますね。

リリース作業の自動化

自動化するにあたり, 便利なライブラリとして代表的なものは以下の2つでしょうか。

数値を指定した上での段階リリースや, alpha, beta 版のリリース, 画像やリリースノート等の metadata の更新がどちらもコマンド1発で可能です。

fastlane は Ruby 製でタスクランナーの機能もあり, gradle-play-publisher は gradle タスクという違いはあります。

# コマンド例
# supply
$ bundle exec fastlane supply --apk /path/to/apk

# gradle-play-publisher
$ ./gradlew publishApkRelease

git flow で開発しているのであれば, このリリース作業は master ブランチにマージされた時に, CI 上で行うのが良いかなと思います。


人力でブラウザ上でぽちぽちとする作業を, 機械的にコマンド1発でできるというメリットが一番大きいとは感じますが, 地味に以下も大きいメリットだと思っています。

  • リリース作業が特定の人に依存しない
  • Play Console での metadata をコードやファイルでバージョン管理できる

(余談ですが, 公開しない draft の状態で play console への apk のアップロードを行ういい方法がもしありましたら教えていただきたいです)

ライブラリアップデートの自動化の導入

gradle-versions-plugin が便利です。アップデートがあるプラグインの一覧を出力してくれる gradle タスクを提供します。

急にアップデート自体を進めるのを定期的なタスクに落とし込むのは難しいと思いますので, master ブランチにマージされた際の workflow として, この出力結果を slack なり, GitHub の issue 等に自動で上げる仕組みを作ることで, 少なくともそのアップデート対象があるということを意識するところから始めるのがおすすめです。

ライブラリを定期的に上げる仕組みがあると, 小さな変化にも気付きやすくなりますし, Android Studio のバージョンアップ等の負担も少なくなりますね。

おわりに

明日は @shiraji さんによる, PermissionsDispatcher v3のお話 が予定されています!