はじめに
最近趣味で Springboot アプリケーションを作っていてデプロイ準備が地味に面倒だったので備忘録としてまとめる。
いくつかうまくいかなかった方法があるので、ここではうまく行った方法をまとめていく。
準備すること
環境別の properties を用意する
Redis や MySQL を利用している場合、開発環境と本番環境で異なる設定を利用したい場合がある。
この時 gradle のタスクとして切り出して、それぞれの環境に適用するべき properties ファイルを生成することが出来るがもう少し手抜きをする。
以下のようなディレクトリ構成で spring.profiles.active オプションで環境別の設定を利用することができる。
./src/main ├── java │ └── net └── resources ├── application-dev.properties ├── application-prod.properties ├── public └── templates
具体的には -Dspring.profile.active=dev だと application-dev.properties が読み込まれるようになる。
この設定を前提にする場合は、各環境毎のプロパティファイルを用意しておくだけでよい。
dev 環境を整える
普段、開発環境では Springboot を手元で立ち上げていて、アプリケーションで利用するミドルウェア群は docker-compose を使って用意したコンテナを利用している。
そのため開発環境で Springboot を立ち上げる時の設定を若干手を加える必要がある。
普段は bootRun を使用しているので bootRun の設定を以下のように書き換える。
bootRun { args = ["--spring.profiles.active=dev"] }
これで常に dev 環境用のプロパティファイルを ./gradlew bootRun 実行時に読み込める。
jar と resources を固める
単純に ./gradlew build の成果物である build/libs/*.jar と build/resources を tar に固めてどこかに置いておくだけ。
これは github action を使っていい感じにまとめる。
以下の yaml でよろしくやってくれる。
name: Create Application archive on: push: branches: [ main ] pull_request: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: actions/setup-java@v1 with: java-version: '11' # The JDK version to make available on the path. java-package: jdk # (jre, jdk, or jdk+fx) - defaults to jdk architecture: x64 # (x64 or x86) - defaults to x64 - name: Setup npm uses: actions/setup-node@v1 with: node-version: 14.x - run: cd ./frontend && npm i && npm run build && npm run postbuild - name: Grant execute permission for gradlew run: chmod +x gradlew - name: Build with Gradle run: ./gradlew build - name: Create Archive run: | mkdir archive cp ./build/libs/jvm-*.jar ./archive/jvm.jar cp -R ./build/resources ./archive/resources tar czvf archive.tar.gz archive/ - uses: actions/upload-artifact@v2 with: name: archive path: ./archive.tar.gz
番外編: redis でちょっとハマった
docker-compose で java, redis をいい感じにデプロイしようとしたらこけた。
この時の原因は参照している properties ファイルが異なることだった。
ここの準備を終えるまで環境別の properties ファイルを用意してなかったが、それが面倒なのであれば redis のコネクションドライバをコード内で上書きしてしまうのが楽だった。
結局この記事でやったことが適用できたので特にそういったことをする必要はなくなった。
おわりに
アーカイブ作ったり、環境別の設定をいい感じにする方法はわかったのでデプロイを自動化したい