見出し画像

Androidアプリ、デプロイ自動化の話

Androidアプリエンジニアの奈良です。
最近、子どもがドラえもんを観るようになって、星野源にハマっています。
トゥートゥートゥトゥトゥトゥトゥー♪

去年の暮れに、Androidアプリのデプロイを自動化しました。
その話を書きたいと思います。

なぜ自動化しようと思ったか

アプリを開発してリリースするまでの間、実質コードを書いている時間以外の時間が結構存在し、開発環境を損ねているという課題がずっとありました。

弊社スペースマーケットでは、Working Group(以下、WG)という直接施策などとは切り離した作業ができる活動があるのですが、去年4QのWGにおいて、上記問題の改善をWGの目標にしました。

その改善の一部としてデプロイ時間の短縮があり、その方法としてデプロイの自動化をしました。

どこまで自動化するか

内部テストへのデプロイを自動で実施できるようにしました。

Google Play Storeへのリリースでは、「内部テスト→アルファ版→ベータ版→製品版」と段階を踏むことができます。
製品版がいわゆるユーザさんに届けるリリースで、内部テストは予め登録しているテスター(主に、社内のエンジニア)のみにアプリをダウンロードできるようにするリリースです。

製品版にリリースする前に社内でテストを実施したいので、自動デプロイでは内部テストまでにしました。
これらのリリースでリリース対象となる成果物は同じもの(リリース時に内部テストでアップロードした成果物を選択できる)なので、内部テストへのアップロードが自動でできれば、製品版のリリースもかなり楽になります。

どのように自動化するか

結果を先に書くと、CircleCI + fastlaneで実施しました。

Debug環境のビルド・テストですでにCircleCIは利用していたのですが、そこにfastlaneを使ったコマンドを追加しました。

fastlaneを使用

デプロイツールではfastlaneかgradle-play-publisherのどちらを使うか迷いましたが、最終的にfastlaneにしました。
ほしい機能はどちらもあったのですが、最終的にiOS側でfastlaneを使う予定だったので、できるだけ同じツールの方がスケールしやすいだろうと思い、fastlaneを使うことにしました。

ちなみに、Fastfileはこんな感じです。

default_platform(:android)

platform :android do
 desc "Deploy a new version to the Google Play Internal"
 lane :internal do
   gradle(task: "### production build task ###")
   supply(
     track: 'internal',
     aab: ### Android App Bundle file ###,
     json_key: ### google play store api key ###,
     skip_upload_metadata: true,
     skip_upload_apk: true,
     skip_upload_images: true,
     skip_upload_screenshots: true
   )
 end
end

最低限の設定ですが、成果物のデプロイ以外では、リリースコメントもこれを機にfastlaneでアップロードするようにしました。

気をつけなければいけないのが、trackを'intarnal'にしておかないと、指定なしの場合、製品版にリリースしてしまうことです。

デプロイタイミング

自動デプロイを走らせるタイミングですが、releaseブランチを作成したときのみに、自動デプロイを走るようにしました。

Androidアプリでは開発したブランチはdevelopブランチに集約され、リリース時にreleaseブランチとmasterブランチへのPRを作成、承認をもらった後に製品版へのリリースを実施します。

CircleCIのworkflow機能を使うとブランチ名でどのjobを走らせるか決められるので、通常のPRではDebug環境のビルド・テストを実行させ、releaseブランチ作成時にはそこにプラスして、デプロイを実施しています。

無題のスプレッドシート(3)

以下が、CircleCIの設定ファイルです。

version: 2
jobs:
 test:
   # Unit Testing
 deploy:
   # 内部テスト版へのリリース

workflows:
 version: 2
 build_and_test:
   jobs:
     - test
     - deploy:
         requires:
           - test
         filters:
           branches:
             only:
               - /releases?\/ver.+/ # <- releaseブランチ作成時のみ実行

自動化した効果

releaseブランチで承認を待っている間に勝手にリリースされるので、
内部テスト環境へのデプロイは実質0秒(意識することがない)になりました。

また、自動化以外に良かった効果としては、リリース毎に書いていたリリースコメントをgit管理できるようになったことです。
git管理することで、PRレビューにも差分として表示されることになり、今まではPRコメントやSlackで確認してもらっていたのが、そのままPRレビュー時してもられるようになり、手間が一つなくなりました。
また、過去のコメントの参照もやりやすくなりました。

最後に

最後になりますが、スペースマーケットでは、サービスを成長させることが好きな新しい仲間を求めています!
ご興味を持たれた方は下記の採用サイトから詳細をご覧ください!


この記事が気に入ったらサポートをしてみませんか?