Android
fastlane

TravisCI + fastlaneでPlayStoreにアプリを配信する


やること

Androidアプリをmasterにpushした時に、TravisCIからアプリをビルドしてPlayStoreに配信する。

fastlaneとTravisCIのそれぞれの初歩は知っていたが、いざ組み合わせて使おうとすると設定に手間取ったのでメモ。


前提条件


  • AndroidアプリのソースコードをGitHubで管理していること

  • GitHubのmasterにpushした時に、Travis CIのビルドが動くように設定していること

  • fastlaneの初期設定は実施済みであること



  • apkへの署名はGoogleではなく、自分で行うものとする


ポイント

以下のセキュアな情報を平文でソースコードに含めないようにする。


  • リリース用のapkファイルの署名に使う情報 -> Travis CIの環境変数に設定

  • Play Storeに配信する時の認証用のJSONファイル -> 暗号化してリポジトリに置く


設定内容


apkのビルド時に署名をする

fastlane/Fastfileのdeployレーンの記述を修正して、apkの署名に必要な情報をビルド時に渡す。

desc "Deploy a new version to the Google Play"

lane :deploy do
gradle(task: "clean assembleRelease",
print_command: false,
properties: {
"android.injected.signing.store.file" => Dir.pwd + "/../app.jks",
"android.injected.signing.store.password" => ENV["SIGNING_STORE_PASSWORD"],
"android.injected.signing.key.alias" => ENV["SIGNING_KEY_ALIAS"],
"android.injected.signing.key.password" => ENV["SIGNING_KEY_PASSWORD"],
}
)
upload_to_play_store
end

修正点は、print_commandとpropertiesの記述を追加していること。

print_commandをfalseにしているのは、gradleの実行コマンドをビルドログに出力させないため。

(gradleの実行コマンドの引数にキーストアのパスワードが渡しているので表示させたくない)

propertiesは、apkの署名に必要な情報を指定している。

キーストアファイルはフルパスで指定しないとビルド時にエラーになる。ここではDir.pwdを使って、キーストアファイルのフルパスを組み立てている(キーストアファイルをapp.jksという名前でプロジェクトフォルダ直下に置いている前提)。

パスワード、エイリアス名はハードコーディングでしてしまうとセキュリティ上の問題になるので、Travis上のビルド実行時の環境変数から取得するようにしている(環境変数の設定は次で説明)。


Travis CIの環境変数にapkの署名用の情報を設定


  1. Travis上の対象リポジトリのページにアクセス -> More Options -> Settings

    image.png


  2. Envrionment Variablesから3つの変数を追加

    追加する時、「Display value in build log」にチェックを入れないこと。チェックを入れるとビルドログに値が出力されてしまう。なお、変数名は上述のFastfileと一致していれば何でも良い。



  • SIGNING_STORE_PASSWORD(キーストアのパスワード)

  • SIGNING_KEY_ALIAS(キーのエリアス)

  • SIGNING_KEY_PASSWORD(署名キーのパスワード)

image.png


PlayStoreへの配信用のJSONファイルのパスを設定

fastlane/Appfileに記述。ローカルPCのフルパスになっていたら、相対パスに書き換えておく。

以下、プロジェクト直下にXXX.jsonというファイル名で配置している場合の記述例。

json_key_file("XXX.json") # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one


PlayStoreへ配信用のJSONファイルの暗号化

アプリのプロジェクトディレクトリ直下で、Terminalから以下のコマンドを実行。

これでTravisから読み込める暗号化ファイルを作成できる。

gem install travis

travis login --com
travis encrypt-file <JSONファイル> --add

--addは、「.travis.yml」に暗号化したファイルの復号コマンドをbefore_installに追記するという意味。「.travis.yml」を見ると、"openssl aes-256-cbc 〜〜〜"というような行が追加されるはず。


.travis.ymlの記述

以下、travis.ymlの記述例。

language: android

android:
components:
- ...

before_install:
# JSONファイルの復号(travisの自動追記なので自分で書く必要なし)
- openssl aes-256-cbc ~~~
# fastlaneのインストール
- bundle install --path vendor/bundle

script:
# fastlaneのdeployレーンを実行(apkのビルド、署名、PlayStoreへ配信)
- bundle exec fastlane deploy

branches:
only:
# masterが修正されたときのみPlayStoreに配信
- master

fastlane deployをscriptで実行している必然性はなし。

deployなどの他のフェーズに移しても問題なし。


動作を確認する

ここまでに加えた修正をcommit&push。

Travisのビルドが実行されるので終わるまで待つ。

PlayStoreを見るとビルドしたapkが配信されていることが確認できるはず。


おまけ(.gitignoreの記述)

fastlaneの出力物はgitで管理する必要はないので無視する。

.gitignoreに以下を記述。

# fastlane specific

**/fastlane/report.xml

# deliver temporary files
**/fastlane/Preview.html

# snapshot generated screenshots
**/fastlane/screenshots

# scan temporary files
**/fastlane/test_output

公式ページより。

https://docs.fastlane.tools/best-practices/source-control/


参考

fastlaneからgradleを実行する方法の詳細

https://docs.fastlane.tools/actions/build_android_app/

Travisから使うファイルの暗号化の方法

https://docs.travis-ci.com/user/encrypting-files/