日々常々

ふつうのプログラマがあたりまえにしたいこと。

開発時に実際にProfileをどう指定するか

導入

SpringBootでProfileを使用するようになると、何かのprofileを指定しないと起動しなくなるような構成になりがちだと思います。 たとえば application-local.ymlapplication-dev.ymlapplication-prod.yml など環境ごとのプロファイルを用意する場合です。

開発効率を考えればProfile無しでも動作するようにしておくのが良いこともあるのですが、それだと設定誤りなどで本番環境で動作してしまうリスクが残ります。 たとえば無印(not default)ではH2で動作するようにしておいて、prod で実際のデータベースに接続するように上書きしていた場合。設定漏れや誤りで上書きできなくても、一見正常に動作し、実はH2だった……などが考えられます。 この問題を検知できる別の仕組みがあれば無印を使用するのも良いかもしれませんが、必ず何かしらのProfileを使用すると言う落とし所が現実かなと思っています。

Profile設定方法

SpringBootでProfileを指定する方法はいくつかありますが、基本的にプロパティと同じ方法が取れます。つまり、次のいずれかを使用すると思います。

ほかにもありますが、よく使うのはこの辺りかなと思います。

詳しくは 公式リファレンス を参照してください。使ったことがある物もありますが、使ったことのない物もたくさんあります。

開発時のProfile指定

開発時のProfile設定方法も上記のいずれかを使用することになりますが、案外厄介です。 と言うのも、MavenやGradle自体のJavaシステムプロパティやコマンドライン引数に渡しても、ビルドツールに設定されます。

ビルドツール自体のプロセスとSpringBootのプロセスが異なるため、Javaシステムプロパティやコマンドライン引数はそのまま渡りません。 渡すためにそれぞれ固有の知識が必要になってきます。たとえば -P で受けたのをテストのプロセスに引き渡すような。 知っていれば迷わないですが、知らなければそのための調べたり試行錯誤したりすることになります。

結局私がどうしているか

環境変数一択になっています。コンテナ運用だと環境変数になりますし、本番の設定方法と同じにしたいって理由もありますが、実行方法にとわず設定方法が揺れないのが理由です。

Gradleだと。

SPRING_PROFILES_ACTIVE=hoge gradle bootRun

Mavenだと。

SPRING_PROFILES_ACTIVE=hoge mvn spring-boot:run

これらはシェルですが、WindowsPowerShellでも $env:SPRING_PROFILES_ACTIVE=hoge でできました。

IDEからの実行でも環境変数に追加でいけます。以下はIDEAの例。Profile複数使い分ける場合とか、それぞれで保存しとくと楽。

f:id:irof:20210215110907p:plain

ここまでは SPRING_PROFILES_ACTIVE と書いてきましたが、画像のように spring.profiles.active でもいけます。 もちろんVM OptionやProgram argumentに追加しても構いませんが、環境変数に統一と言う方針なのでこちらを使用。 AWS SDKを使用する場合はここに AWS_PROFILE を並べたりします。

これ別にProfile専用ではなく、全部のプロパティがこれでいけるんですよね。Profile用の専用の仕組みだとこれは使えない。 SPRING_APPLICATION_JSON 環境変数使えば一括での設定もできるのもたまに便利。たまに。

固定のProfileを設定するのであれば、それぞれのツールに設定してもいいと思います。ローカルで動作させるならどうせ local を指定するでしょうし。そう言うのなら「毎回必ず指定する」のは無駄なので、build.gradleだのpom.xmlだのに固定で書いておく方がいいと思う。

結論

……なんてものはないんだけど。 やり方はいくらでもあるし、どんなやり方をしてもいいと思います。

私が「個人ブログ」とかに求めるのってこういう「他の人はどうやってるか知らんし、もっと効率いい方法あるだろけど、自分はこんなことやったりするよ」な内容なんだよなーと思いながら書いたやつ。

https://twitter.com/irof/status/1357153181873020930

このブログもそう。

関連

irof.hateblo.jp