Spring Boot
Zenavo が検出する内容
pom.xml または build.gradle(.kts) があるリポジトリは zbpack で Java としてビルドされます。pom.xml に spring-boot-starter-parent がある場合、または Gradle のファイルに org.springframework.boot がある場合に Spring Boot アプリと判断されます。
| Maven | Gradle | |
|---|---|---|
| JDK | pom.xml の <java.version>、<maven.compiler.source>、<maven.compiler.target> | build.gradle の sourceCompatibility = … または targetCompatibility = … |
| ビルド | イメージの Maven で mvn clean dependency:list install -Dmaven.test.skip=true | Gradle 8.14.3 で gradle build -x test |
| 起動 | java -Dserver.port=$PORT -jar target/*.jar | java -Dserver.port=$PORT -jar build/libs/*.jar |
JDK は Eclipse Temurin で、バージョンが見つからなければ 17 です。テストはスキップされ、プロジェクトの mvnw や gradlew ラッパーは使われません。pom.xml に <packaging>war</packaging> があれば target/*.war を実行します。Zenavo は PORT をサービスのポート(zbpack のビルドでは 8080)に設定し、起動コマンドがそれを Spring の server.port として渡します。
別の方法で起動するには、Settings → Build → zbpack options で ZBPACK_JAVA_ARGS を設定します。起動コマンドは java にそれを続けたものになります。例:ZBPACK_JAVA_ARGS=-jar target/app.jar --spring.profiles.active=prod。
デプロイする前に
Gradle:plain jar をオフにする。 Spring Boot の Gradle プラグインは
*-plain.jarも書き出します。これはbuild/libsで先に並び、実行できません。build.gradleに追加してください。groovyjar { enabled = false }Gradle:zbpack が読む場所に Java のバージョンを書く。 zbpack が読むのは
build.gradleのsourceCompatibilityだけです。toolchain でバージョンを指定するプロジェクトやbuild.gradle.ktsを使うプロジェクトは JDK 17 でビルドされ、新しいコードでは失敗します。build.gradleにsourceCompatibility = '21'を追加するか、自分の Dockerfile を使ってください(後述)。ヘルスチェック。 Spring Boot アプリは起動に時間がかかります。
/actuator/healthへの HTTP のヘルスチェック(spring-boot-starter-actuatorが必要)を使い、開始猶予時間を 60 秒以上にしてください。
データベースに接続する
Spring が読むのは postgresql:// の接続文字列ではなく JDBC の URL なので、データベースのホストとポートの変数から組み立てます。
SPRING_DATASOURCE_URL=jdbc:postgresql://${POSTGRESQL_HOST}:${POSTGRESQL_PORT}/zenavo
SPRING_DATASOURCE_USERNAME=postgres
SPRING_DATASOURCE_PASSWORD=${POSTGRESQL_DB_PASSWORD}MySQL なら jdbc:mysql://${MYSQL_HOST}:${MYSQL_PORT}/zenavo、ユーザーは root、パスワードは ${MYSQL_DB_PASSWORD} です。コンソールから追加したデータベースの名前は zenavo です(データベース)。マイグレーションは Flyway か Liquibase で起動時に実行します。どちらかがクラスパスにあれば Spring Boot はデフォルトでそうします。
メモリ
JVM はコンテナのメモリからヒープのサイズを決めます。サービスにメモリ上限を設定し、変数でヒープがその大部分を使えるようにします。
JAVA_TOOL_OPTIONS=-XX:MaxRAMPercentage=75自分の Dockerfile を使う
ルートディレクトリの Dockerfile は zbpack の代わりに使われます。Gradle ラッパー、Kotlin DSL のビルド、小さなランタイムイメージを使いたいときに便利です。
FROM eclipse-temurin:21-jdk AS build
WORKDIR /src
COPY . .
RUN ./gradlew bootJar --no-daemon
FROM eclipse-temurin:21-jre
COPY --from=build /src/build/libs/*.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]Maven なら ./mvnw -DskipTests package でビルドし、target/*.jar をコピーします。サービスのポートは EXPOSE から決まり、Spring はデフォルトで 8080 を待ち受けます。
よくある問題
| 症状 | 原因 |
|---|---|
no main manifest attribute, in build/libs/…-plain.jar | Gradle が plain jar もビルドしています。jar タスクを無効にしてください。 |
invalid target release: 21 や release version 21 not supported | zbpack が JDK 17 を選びました。build.gradle の sourceCompatibility か pom.xml の <java.version> を設定するか、Dockerfile を使ってください。 |
| アプリが起動する前にヘルスチェックでデプロイが失敗する | 開始猶予時間が短すぎます。ヘルスチェックで延ばしてください。 |
OutOfMemoryError、または負荷がかかるとサービスが再起動する | ヒープが小さすぎるか、メモリ上限を超えています。メモリ上限と JAVA_TOOL_OPTIONS=-XX:MaxRAMPercentage=75 を設定してください。 |
Failed to configure a DataSource | SPRING_DATASOURCE_URL がないか、jdbc: の URL ではありません。 |