Gradle Play Publisher プラグインをアップデートする

はじめましてこんにちは、4月に Native チームに加わった @geckour です。

今回は、Google Play Console の管理を自動化してくれる Gradle プラグインである Gradle Play Publisher のバージョンを v1.2.2 から v2.2.1 に上げた話をします。

経緯

僕が現在触っているプロダクトでは、リリース作業時にコミットを指定して CI を実行すれば Google Play に公開される、という自動化が行われており、それを実現するためにこれまで Gradle Play Publisher の v1.2.2 を使っていました。
しかし、このバージョンで我々はある問題を踏み抜きました。

まず前提として

  • v1.0.0 では 50% リリースで公開していた
  • 新しいリリースの v1.0.1 は hotfix であるため v1.0.0 を上書きして 100% 公開でリリースしたい

という需要があったので (バージョン名は仮) 、先程のリポジトリにある README.md を参照しつつ [module]/build.gradle の設定を変更しました。

before

track = 'rollout'
userFraction = 0.5

after

track = 'production'
userFraction = 1

しかし、このように変更した上で gradlew publishApk としても、有効なトラックがないと怒られてリリースは公開されませんでした。

この時は手動で段階公開中のリリースを 100% 公開にし、再度新しいリリースを公開するという対応をしましたが、正直煩雑な上に人間のオペレーションがガッツリ入るのであまりやりたくはない作業でした。

そこで、この問題は Gradle Play Publisher v1.2.2 では Google Play Developer API の v3 に対応していないことが問題なのかもしれないと考え、また以前より

  • Gradle Play Publisher の v1 系のサポートが終了している
  • Gradle Play Publisher v1.2.2 において rollout の設定条件が分かりづらくオペレーションミスを生みやすい

といった問題を抱えていたこともあり、今回重い腰を上げて Gradle Play Publisher を v2.2.1 にアップデートするに至りました。

Gradle Play Publisher の設定マイグレーション

README.md の diff を見ながら作業を進めました。

具体的には

  • [projectRoot]/build.gradle

before

buildscript {
    dependencies {
        classpath 'com.github.triplet.gradle:play-publisher:1.2.2'
    }
}

after

buildscript {
    dependencies {
        classpath 'com.github.triplet.gradle:play-publisher:2.2.1'
    }
}
  • [module]/build.gradle

before

play {
    jsonFile = file('hoge.json')
    track = 'rollout'
    userFraction = 0.5
}

after

play {
    serviceAccountCredentials = file('hoge.json')
    track = 'production'
    userFraction = 0.5
}
  • ファイルのリネーム・ディレクトリ構造の変更
    • [module]/src/main/play/contactEmail[module]/src/main/play/contact-email.txt
    • [module]/src/main/play/contactPhone[module]/src/main/play/contact-phone.txt
    • [module]/src/main/play/contactWebsite[module]/src/main/play/contact-website.txt
    • [module]/src/main/play/defaultLanguage[module]/src/main/play/default-language.txt
    • [module]/src/main/play/ja-JP/listing/fulldescription[module]/src/main/play/listings/ja-JP/full-description.txt
    • [module]/src/main/play/ja-JP/listing/shortdescription[module]/src/main/play/listings/ja-JP/short-description.txt
    • [module]/src/main/play/ja-JP/listing/title[module]/src/main/play/listings/ja-JP/title.txt
    • [module]/src/main/play/ja-JP/listing/video[module]/src/main/play/listings/ja-JP/video-url.txt
    • [module]/src/main/play/ja-JP/whatsnew[module]/src/main/play/release-notes/ja-JP/default.txt

このような変更を行いました。
しかし、これによって私達は 50% の段階公開のリリースが作成されることを期待していたのですが、実際にできたのは 100% 公開のリリースでした。

Google Play Developer API のドキュメントを読んでみる

Google Play Developer API のドキュメント によると、段階公開の割合を指定する値であるところの userFraction が有効であるためにはそのリリースの statusinProgress であるか halted である必要がある と書いてあります。
つまり、プラグインの設定は

play {
    track = "production"
    userFraction = 0.5
    releaseStatus = "inProgress"
}

のようにする必要があり、 releaseStatus を省略してはいけない ということです。
そこでもう一度プラグインREADME.md を見てみると…
サンプルはあるものの、注意書きは特に何もありませんでした。
また、各設定値のデフォルト値についての記述がないこともミスリーディングを招いているのではないかと思いました。

おわりに

同じ悲しみを抱く人が少しでも減るように、 Pull request を出してみました。OSS って良いですね!

===== イベントのご案内 =====

2019年7月18日(木)に、TECHPLAYにてスタディサプリ/Quipper Product Meetup #3 を開催します。今回のテーマはSREで、以下4つのセッションをお届けする予定です。

  • Observability in StudySapuri
  • Canary release - フレームワークのアップグレードを安心して進めるためのリリース戦略
  • gRPC in スタディサプリ ENGLISH
  • CQRS+ESをKinesis,Spark,RDB,S3でやってみた

皆様のご参加をお待ちしております。詳細/お申し込みは https://techplay.jp/event/737389 をご覧ください!