それが僕には楽しかったんです。

ミドルウェアとかやってます

Springboot アプリケーションのデプロイ準備を考える

はじめに

最近趣味で 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 のコネクションドライバをコード内で上書きしてしまうのが楽だった。
結局この記事でやったことが適用できたので特にそういったことをする必要はなくなった。

おわりに

アーカイブ作ったり、環境別の設定をいい感じにする方法はわかったのでデプロイを自動化したい