Android mobile minne

fastlaneを使ってAndroidアプリを複数のトラックで審査に出す方法

Android mobile minne

minne事業部プロダクト開発チームのtepiです。アプリ開発のCIではド定番と言えるfastlaneですが、ドキュメントに複数のトラック、特に段階的にロールアウトするパーセントを決めてリリースする方法の古い情報しかなかったので触って調べてみました。
本記事では最終的に以下のように、アルファ版は100%で公開、プロダクション版は20%で公開が同時にできる状態を目指します。

最終結果

参考ドキュメント:fastlane公式ドキュメント(upload_to_play_store関数)
※fastlaneのセットアップは公式ドキュメントや他の記事を参照ください。

  1. 結論
  2. fastlaneの基本
  3. 複数のトラックに審査を出したい
  4. 片方は段階リリースにする
  5. 注意点
  6. まとめ

結論

以下のように記載するとできます。

gradle(task: 'bundleRelease')
upload_to_play_store(
  aab: lane_context[SharedValues::GRADLE_AAB_OUTPUT_PATH],
  track: 'alpha',
)
upload_to_play_store(
  track: 'alpha',
  track_promote_to: 'production',
  rollout: '0.2',
  skip_upload_metadata: true,
  skip_upload_images: true,
  skip_upload_screenshots: true,
  skip_upload_changelogs: true,
  skip_upload_aab: true,
  skip_upload_apk: true,
)

fastlaneの基本

fastlaneでは以下のようにすることで、直前に実行されているビルド結果を用いて、指定されたトラック(リリースバージョン)にリリースを行ってくれます。

gradle(task: 'bundleRelease')
upload_to_play_store(
  track: 'alpha',
)

trackには、productionalphabetainternal等が指定できます。自分では使ったことが無いのですが、調べてみるとオープンテストでは好きな名前が指定できるようで、名前に合わせて指定すれば良いようです。

複数のトラックに審査を出したい

上記を見たらすぐにわかるかと思いますが以下のようにすれば複数のトラックにアップロードすることが可能です。

gradle(task: 'bundleRelease')
upload_to_play_store(
  track: 'alpha',
)
upload_to_play_store(
  track: 'production',
)

簡単ですね。

片方は段階リリースにする

では本題の片方のトラックを段階リリースで審査に出していきたいと思います。

fastlaneにはrolloutというパラメーターがあり、リリースするパーセントを決めることができます。なお、rolloutの値は数字ですが文字列で指定する必要があり、数字で指定するとエラーとなります。

upload_to_play_store(
  track: 'production',
  rollout: 0.2,
)

# ↑だとエラーで、「'version_code' value must be a Integer! Found String instead.」と出ます。

今回は20%にしたいので以下のように設定してみました。

gradle(task: 'bundleRelease')
upload_to_play_store(
  track: 'alpha',
)
upload_to_play_store(
  track: 'production',
  rollout: '0.2',
)

残念ながらこれだとUnable to find the requested release on track - 'production'と出てうまくいきません。

自分の読解力のせいかもしれませんが、どうにもこのエラーの意味がよくわかりませんでした。ただ、調べていくとこのGitHubのIssueのコメントが見つかりました。

どうやらアルファ版を元にproductionにプロモートするように指定すれば良いようです。また、すでに審査に出しているアルファ版をベースにして審査に出すため、その他の情報のアップロードが不要になるのでskipの指定をするようです。

ということで、最初に書いた結論のような記載となりました。

注意点

上記のrolloutの指定はアルファ版の審査に出している場合のみ正常に動作します。例えばアルファ版のトラックにリリースされているだけの場合はTrack 'alpha' doesn't have any releasesと出て、動作しませんでした(残念ながらその場合どう実装するのかはわかりませんでした)。

また、公式ドキュメントの別のページには、trackにrolloutの文字列を指定するよう記載されており、調べるとそういった記事も見つかりますが、最新のバージョンでは「'rollout' is no longer a valid track name - please use 'production' instead」と出て指定できません。

まとめ

試行錯誤を経て最終的に解決はできたものの、完璧に理解ができている状態ではありません。

自分の見解になりますが、エラー文内にある「release」や「track」という単語自体を指すものが曖昧、もしくは自分が理解できていない点が、デバッグを難しくする原因かもしれません。また、upload_to_play_storeという関数のみですべての事が可能である点も、恐らく設計には様々な理由があるとは思いますが、それがさらに複雑さを増しているように感じました。

現状fastlaneをなかなか試せていないのですが、改めて中身の理解を深めてみたり、ドキュメントはGitHubで管理されているようなのでぜひ改善のためにコントリビュートしてみたいです。

CIの改善も引き続きやっていきたい領域ではありますので、改善を手伝っていただける方お待ちしております!