メモ2ブログ

メモtoウェブログ。旧ブログはこちら。 http://sakebook.blogspot.jp/

gradle.propertiesはリポジトリに含めるべきか

gradleのタスクのプロパティ値を定義できる

gradle.propertiesで定義した値は、build.gradle内で使うことが出来ます。 なので、署名時に必要な情報をgradle.propertiesで定義してファイル自体はリポジトリに含めない方法を取っていました。
しかし、さまざまなプラグインで各プロジェクトのgradle.propertiesで定義した値を使うことがあるため、リポジトリに含めないとTravis CIやサーバに用意したJenkinsなど、CIサーバでビルドするときにエラーが起きることが多々あります。

リポジトリに含めたくない情報は~/.gradle/gradle.propertiesで定義する

~/.gradle/gradle.propertiesで定義した値も、プロジェクトから参照できます。
各プロジェクトで定義した値と名前が重複していた場合は、~/.gradle/gradle.propertiesで定義した値で上書きされます。

使い方

次のように使います。${module}の部分は適宜置き換えてください。

  • ~/.gradle/gradle.properties
...
systemProp.${module}_store_pass=store_pass
systemProp.${module}_alias=this is alias
systemProp.${module}_key_pass="key pass"
...
  • ${module}/build.gradle
...
task valueTest << {
    println System.properties[project.getName() + '_store_pass']
    println System.properties[project.getName() + '_alias']
    println System.properties[project.getName() + '_key_pass']
}...
$ /.gradlew -q valueTest
store_pass
this is alias
"key pass"

スペースでもクォーテーションで括る必要はありません。

プロジェクトのgradle.propertiesリポジトリに含める

これで機密情報と分離できるので、gradle.propertiesリポジトリに含めることができるようになります。

課題

自前のサーバに置いたJenkinsなら、~/.gradle/gradle.propertiesに事前に記述できますが、CIホスティングサービスなどでは難しいので、タスクの引数に指定するか、テスト時はテスト用の署名にするなどの方法を取らないと難しそうです。
また、プロジェクトが増えてくると管理が大変かもしれません。もっとスマートな方法があればそちらで管理したいですね。

参考

第14章 色々なチュートリアル / Gradle 日本語ドキュメント