Uzzu::Blog

Software Design, and my life.

Dotenv GradleでGradle build scriptにdotenvを導入する

一般的に、Gradle ScriptやGradle Plugin上で外部からの設定値を取り扱う際は Gradle PropertiesやCommand-line flags、System Propertiesの仕組みを利用します。それらから参照される gradle.properties ファイルは、言いなりのままに(誰の?)設定を追加し続けると、秘匿値と秘匿する必要のない値が混在してしまい、加えて近年Gradle Plugin側からビルドに必要なパラメータとしてGradle Propertiesに設定する事を要求されるシーンが増えてきた為、結果的に gradle.propeties を編集する機会が増えてきて、開くたびに視界に入る秘匿値に溜息をついてきました。秘匿値は分離して管理したい。

最終的なゴールとしては AWS System Manager Parameter Storeのような外部の設定データ管理ストレージに載せる事になると思われますが、まずはミニマムスタートということで、環境変数にする事から始めます。

Gradleにおいて環境変数を参照する事は決して難しい事ではないですが、外の世界ではdotenvな文化があるので、これに追従する事にします。

まずは環境変数が存在しない場合 .env ファイルの内容を見にいくGradle Pluginを作成します。

https://github.com/uzzu/dotenv-gradle

Gradle Plugin Portal

作成しました。 このpluginでは .env または .env.template ファイルに利用する環境変数名を定義しておくと自動でextension化され、Gradle build script上で簡単に参照できるようになります。

例えば環境変数 HOGE_API_KEY を利用する場合、pluginを入れただけの状態では

env.isPresent("HOGE_API_KEY")               // true or false
env.fetch("HOGE_API_KEY")                   // 存在しない場合は例外をスロー
env.fetch("HOGE_API_KEY", "default_value")  // 存在しない場合引数の値を返却
env.fetchOrNull("HOGE_API_KEY")             // 存在しない場合はnull

このように参照しますが、project rootに .env.template, .env

HOGE_API_KEY=

な定義が存在していた場合

env.HOGE_API_KEY.isPresent                  // true or false
env.HOGE_API_KEY.value                      // 存在しない場合は例外をスロー
env.HOGE_API_KEY.orElse("default_value")    // 存在しない場合は引数の値を返却
env.HOGE_API_KEY.orNull()                   // 存在しない場合はnull

このように参照できます。Gradle Kotlin DSLを利用していれば入力補完が効きます。 環境変数を参照する際の優先度は従来のdotenvに同じく、システムの環境変数 > .env になっています。

という訳で、Dotenv Gradleを利用する事でGradle build script上で簡単に環境変数を取り扱えるようになりました。

この先:

  • .env.template を予め用意しておく
  • .env が存在しなければ、 .env.template の変数定義をもとに外部の設定データ管理ストレージから値を参照して .env を作成する

といった事が出来るようになると、今まで通り秘匿値がVCS管理化にない状態を維持しつつ、ビルドに必要な環境変数は .env.template で網羅されており、Gradle build script上ではGradle Kotlin DSLを利用していれば入力補完も効いて便利、という状況になって良さそうですね。Android Studio 4.0からGradle Kotlin DSLがサポートされます。

※くれぐれも .env はVCS管理下に置かないようにしましょう。

comments powered by Disqus