0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Spring Boot 3.5.6 → 3.5.16 バージョンアップ作業手順

0
Posted at
# Spring Boot 3.5.6 → 3.5.16 バージョンアップ作業手順

## 1. 目的

Spring Bootを3.5.6から3.5.16へ更新し、依存関係、ビルド、単体テスト、Spring ApplicationContext、各Profileおよびステージング環境で問題がないことを確認する。

## 2. 対象作業

以下を実施する。

1. Spring Bootのバージョンのみを3.5.16へ変更する
2. 3.5.6と3.5.16の依存関係ツリーを比較する
3. コンパイルと単体テストを実行する
4. Spring Context起動テストを実行する
5. 全Profileで起動確認する
6. ステージング環境で回帰テストを実施する

---

## 3. 事前準備

### 3.1 作業ブランチの作成

現在の対象ブランチを最新化する。
git switch <対象ブランチ>
git pull
バージョンアップ用ブランチを作成する。
git switch -c upgrade/spring-boot-3.5.16
### 3.2 現行バージョンの確認

Mavenの場合:
./mvnw help:effective-pom
./mvnw dependency:tree
Gradleの場合:
./gradlew dependencies
./gradlew buildEnvironment
以下を確認する。

* Spring Bootが3.5.6であること
* Javaバージョン
* MavenまたはGradleのバージョン
* Spring Boot管理外で固定している依存ライブラリ
* 使用しているProfile
* ステージング環境の起動方法
* 外部設定ファイル、環境変数、JVMオプション

### 3.3 現行バージョンのテスト

変更前の3.5.6で、既存テストが成功することを確認する。

Mavenの場合:

```bash
./mvnw clean test
Gradleの場合:
./gradlew clean test
変更前から失敗しているテストがある場合は、バージョンアップによる失敗と区別できるよう記録する。

### 3.4 現行依存関係ツリーの保存

Mavenの場合:

```bash
./mvnw dependency:tree \
  -Dverbose \
  -DoutputFile=dependency-tree-3.5.6.txt
Gradleの場合:
./gradlew dependencies \
  > dependency-tree-3.5.6.txt
必要に応じて、主要Configuration単位でも保存する。
./gradlew dependencies \
  --configuration runtimeClasspath \
  > runtime-classpath-3.5.6.txt

./gradlew dependencies \
  --configuration testRuntimeClasspath \
  > test-runtime-classpath-3.5.6.txt
### 完了条件

* 変更前のビルド結果が記録されている
* 変更前のテスト結果が記録されている
* 3.5.6の依存関係ツリーが保存されている
* 使用Profileと起動方法が整理されている

---

## 4. Spring Bootのバージョン変更

Spring Bootのバージョンだけを3.5.16へ変更する。

この段階では、他の依存ライブラリやアプリケーションコードを同時に変更しない。

### 4.1 Mavenの場合

Spring Boot Parentを利用している場合:
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.5.16</version>
    <relativePath/>
</parent>
BOMを利用している場合:
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>3.5.16</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
Spring Boot Maven Pluginのバージョンを明示している場合も確認する。
<plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>3.5.16</version>
</plugin>
### 4.2 Gradleの場合

Plugins DSLの場合:
plugins {
    id 'org.springframework.boot' version '3.5.16'
}
Kotlin DSLの場合:
plugins {
    id("org.springframework.boot") version "3.5.16"
}
Version Catalogや共通ビルド設定で管理している場合は、管理元の値を変更する。

### 4.3 変更内容の確認
git diff
Spring Bootのバージョン以外が変更されていないことを確認する。

### 完了条件

* Spring Bootのバージョンが3.5.16になっている
* 不要な依存ライブラリ更新が含まれていない
* アプリケーションコードの変更が含まれていない

---

## 5. 依存関係ツリーの比較

### 5.1 3.5.16の依存関係ツリーを保存

Mavenの場合:
./mvnw dependency:tree \
  -Dverbose \
  -DoutputFile=dependency-tree-3.5.16.txt
Gradleの場合:
./gradlew dependencies \
  > dependency-tree-3.5.16.txt
必要に応じてConfiguration単位でも保存する。
./gradlew dependencies \
  --configuration runtimeClasspath \
  > runtime-classpath-3.5.16.txt

./gradlew dependencies \
  --configuration testRuntimeClasspath \
  > test-runtime-classpath-3.5.16.txt
### 5.2 差分を取得

Mavenの場合:
diff -u \
  dependency-tree-3.5.6.txt \
  dependency-tree-3.5.16.txt \
  > dependency-tree-diff.txt
Gradleの場合:
diff -u \
  runtime-classpath-3.5.6.txt \
  runtime-classpath-3.5.16.txt \
  > runtime-classpath-diff.txt
Windowsでは、Git Bashの`diff`またはIDEの比較機能を使用する。

### 5.3 確認対象

特に以下を確認する。

* Spring Framework
* Spring Security
* Spring Data
* Hibernate ORM
* Jackson
* Tomcat、Jetty、Undertow
* Netty
* Reactor
* Micrometer
* Logback
* Spring Kafka
* Spring AMQP
* DBドライバー
* Flyway
* Liquibase
* Testcontainers
* JUnit
* Mockito

### 5.4 競合確認

以下の状態がないことを確認する。

* 同一ライブラリの複数バージョン
* Spring Boot管理バージョンの意図しない上書き
* `omitted for conflict`
* `FAILED`
* 解決不能な依存関係
* SNAPSHOT版の混入
* `NoSuchMethodError`につながる可能性のある不整合

Mavenの場合:
./mvnw dependency:analyze
Gradleの場合:
./gradlew dependencyInsight \
  --dependency jackson-databind \
  --configuration runtimeClasspath
必要に応じて対象ライブラリを変更して確認する。

### 記録事項

依存関係の変更を次の形式で記録する。

| ライブラリ           |      変更前 |      変更後 | 影響箇所     | 確認方法      |
| --------------- | -------: | -------: | -------- | --------- |
| Jackson         | 変更前バージョン | 変更後バージョン | JSON API | API回帰テスト  |
| Hibernate ORM   | 変更前バージョン | 変更後バージョン | DBアクセス   | DB結合テスト   |
| Spring Security | 変更前バージョン | 変更後バージョン | 認証・認可    | セキュリティテスト |

### 完了条件

* 3.5.6と3.5.16の依存関係差分が保存されている
* 主要ライブラリの変更内容が整理されている
* 未解決の依存関係競合がない
* 意図しないバージョン固定がない

---

## 6. コンパイルと単体テスト

### 6.1 クリーンビルド

Mavenの場合:
./mvnw clean compile
./mvnw test
一括実行する場合:
./mvnw clean verify
Gradleの場合:
./gradlew clean compileJava
./gradlew test
一括実行する場合:
./gradlew clean check
### 6.2 確認対象

* コンパイルエラー
* 非推奨APIの警告
* テスト失敗
* `NoSuchMethodError`
* `ClassNotFoundException`
* `BeanCreationException`
* Jacksonのシリアライズ差分
* Mockitoなどテストライブラリの挙動差
* 日付、enum、nullのテスト
* 例外メッセージに依存したテスト

### 6.3 テスト失敗時の対応

失敗原因を次のいずれかに分類する。

1. Spring Boot更新による挙動変更
2. 依存ライブラリ更新による挙動変更
3. テストコードが内部実装へ依存している
4. 変更前から存在していた不具合
5. 実行環境や外部サービスの問題

修正が必要な場合は、Spring Bootのバージョン変更とは別コミットにする。

例:
git add pom.xml
git commit -m "Upgrade Spring Boot to 3.5.16"
git add src
git commit -m "Adjust tests for Spring Boot 3.5.16"
### 完了条件

* コンパイルが成功する
* 単体テストがすべて成功する
* 未調査の警告や例外が残っていない
* 修正理由が記録されている

---

## 7. Spring Context起動テスト

### 7.1 基本テスト

以下のようなApplicationContext起動テストを実行する。
@SpringBootTest
class ApplicationContextTest {

    @Test
    void contextLoads() {
    }
}
必要に応じて、テスト用Profileを指定する。
@SpringBootTest
@ActiveProfiles("test")
class TestProfileContextTest {

    @Test
    void contextLoads() {
    }
}
### 7.2 実行

Mavenの場合:
./mvnw test \
  -Dtest=ApplicationContextTest
Gradleの場合:
./gradlew test \
  --tests "*ApplicationContextTest"
### 7.3 確認対象

* ApplicationContextが正常に生成される
* Bean生成に失敗しない
* 依存性注入が成功する
* Auto Configurationが正常に適用される
* `@ConfigurationProperties`のバインドに成功する
* DataSourceが正常に初期化される
* SecurityFilterChainが生成される
* Jackson関連Beanが生成される
* SchedulerやBatch関連Beanが生成される
* 循環参照が発生しない
* 起動時に外部サービスへ不要な接続を行わない

### 7.4 外部サービスの扱い

Contextテストで外部API、Kafka、RabbitMQ、SMTPなどへ接続しないよう、次のいずれかを使用する。

* テスト用Profile
* Testcontainers
* Mock Server
* WireMock
* テスト用Bean
* 外部接続を無効化するテスト設定

外部サービスのBeanをすべてモック化すると、実際のAuto Configuration問題を検出できなくなるため、必要最小限にする。

### 完了条件

* ApplicationContext起動テストが成功する
* Bean生成エラーがない
* Configuration Propertiesのバインドエラーがない
* 起動ログに未調査の重大な警告がない

---

## 8. 全Profileでの起動確認

## 8.1 対象Profileの洗い出し

以下から使用Profileを確認する。

* `application-*.properties`
* `application-*.yaml`
* デプロイスクリプト
* Dockerfile
* Docker Compose
* Kubernetes Manifest
* CI/CD定義
* 環境変数
* 運用手順書

例:

* `local`
* `test`
* `development`
* `staging`
* `production`
* `batch`
* `migration`

### 8.2 Profileごとの起動

JARを作成する。

Mavenの場合:
./mvnw clean package
Gradleの場合:
./gradlew clean bootJar
Profileを指定して起動する。
java -jar app.jar \
  --spring.profiles.active=<profile>
環境変数を使用する場合:
SPRING_PROFILES_ACTIVE=<profile> \
java -jar app.jar
本番で外部設定ファイルを使用する場合は、同じ構成で確認する。
java -jar app.jar \
  --spring.profiles.active=<profile> \
  --spring.config.additional-location=file:./config/
### 8.3 Profileごとの確認項目

* 正しいProfileが有効になっている
* 起動が正常に完了する
* DB接続先が想定どおり
* 外部APIのURLが想定どおり
* Kafka、RabbitMQ、Redisなどの接続先が想定どおり
* SSL設定が想定どおり
* ログレベルが想定どおり
* Feature Flagが想定どおり
* `spring.config.import`の読み込み結果が想定どおり
* 外部設定がJAR内設定を正しく上書きする
* Actuator Healthが正常
* 不要なクラウド設定が有効化されていない

### 8.4 安全上の注意

本番Profileを確認する際は、実際の本番DBや外部サービスへ接続しない。

次のいずれかを使用する。

* 本番相当の検証用設定
* 接続先をテスト環境へ差し替えた外部設定
* Secretをダミー値へ置換
* 外部送信機能を無効化
* SchedulerやBatchの自動実行を無効化

### 8.5 記録表

| Profile      | 起動結果  | DB接続  | 外部接続  | Health  | 備考 |
| ------------ | ----- | ----- | ----- | ------- | -- |
| local        | OK/NG | OK/NG | OK/NG | UP/DOWN |    |
| test         | OK/NG | OK/NG | OK/NG | UP/DOWN |    |
| staging      | OK/NG | OK/NG | OK/NG | UP/DOWN |    |
| production相当 | OK/NG | OK/NG | OK/NG | UP/DOWN |    |

### 完了条件

* 対象となるすべてのProfileで起動確認が完了している
* 設定値の読み込み結果が期待どおり
* 外部設定の上書き結果が期待どおり
* 未解決の起動エラーがない

---

## 9. ステージング環境へのデプロイ

### 9.1 デプロイ前確認

* ビルド成果物が3.5.16で作成されている
* GitコミットIDを記録している
* Docker Image Tagを記録している
* DB Migrationの有無を確認している
* ステージング用設定を確認している
* ロールバック対象の旧成果物を保持している
* 監視とログを確認できる状態にしている

### 9.2 デプロイ

通常のリリース手順に従い、ステージング環境へデプロイする。

デプロイ後、以下を確認する。

* Podまたはプロセスが正常起動する
* Restart Loopが発生していない
* Readiness Probeが成功する
* Liveness Probeが成功する
* `/actuator/health`が`UP`
* 起動ログに重大な例外がない
* DB Migrationが正常終了する

---

## 10. ステージング環境での回帰テスト

### 10.1 スモークテスト

最初に主要機能が利用可能であることを確認する。

* アプリケーション起動
* ログイン
* 主要画面表示
* 主要API
* DB参照
* DB更新
* Health Check
* 外部サービス接続

スモークテストが失敗した場合は、詳細な回帰テストへ進まず原因を調査する。

### 10.2 API回帰テスト

* GET、POST、PUT、PATCH、DELETE
* JSONリクエスト/レスポンス
* 日付・時刻
* enum
* null
* ページング
* ソート
* 入力エラー
* 業務エラー
* 例外レスポンス
* ファイルアップロード/ダウンロード

可能であれば、3.5.6環境と3.5.16環境のレスポンスを比較する。

JSON比較では、動的値を除外する。

例:

* ID
* タイムスタンプ
* トレースID
* ランダム値
* 表示順が保証されない項目

### 10.3 認証・認可テスト

* ログイン成功・失敗
* ログアウト
* JWT検証
* Token期限切れ
* 権限別アクセス
* 未認証アクセス
* 権限不足
* CORS
* CSRF
* Actuatorの公開範囲

### 10.4 DB回帰テスト

* 登録
* 検索
* 更新
* 削除
* Transaction Commit
* Transaction Rollback
* 複雑な検索条件
* ページング
* ソート
* 排他制御
* DB制約
* Flyway/Liquibase

### 10.5 外部連携テスト

利用しているものを対象とする。

* 外部REST API
* Kafka
* RabbitMQ
* Redis
* SMTP
* SFTP
* オブジェクトストレージ
* OAuth2/OIDC Provider
* 決済、通知などの外部サービス

確認内容:

* 正常接続
* 認証
* SSL/TLS
* タイムアウト
* Retry
* エラー時の処理
* 再接続
* メッセージ送受信

### 10.6 Batch・Scheduler

* Batchの正常終了
* Schedulerの起動
* 多重起動防止
* エラー時の再実行
* Transaction
* 実行履歴
* 外部送信の重複がない

### 10.7 Actuatorと監視

* Health
* Readiness
* Liveness
* Metrics
* Prometheus
* Info
* Log
* Alert
* DB Connection Pool
* HTTPエラー率
* レスポンスタイム
* JVM Memory
* GC
* Thread数

### 10.8 性能の簡易比較

主要APIについて、3.5.6と3.5.16を比較する。

* 平均レスポンスタイム
* p95
* p99
* Error Rate
* CPU
* Memory
* DB Connection Pool
* GC
* 外部API応答時間

明確な性能劣化がある場合は、本番リリース前に原因を確認する。

### 完了条件

* スモークテストが成功する
* 主要業務機能の回帰テストが成功する
* 認証・認可が正常
* DB処理が正常
* 外部連携が正常
* Actuatorと監視が正常
* 重大な性能劣化がない
* 未解決の重大障害がない

---

## 11. 不具合発生時の切り分け

不具合が発生した場合は、次の順番で確認する。

1. 3.5.6で同じ問題が発生するか
2. Spring Bootのバージョン変更以外の差分がないか
3. 依存関係ツリーに意図しない差分がないか
4. Profileと外部設定が正しいか
5. 環境変数、JVMオプション、起動引数が同じか
6. DBや外部サービスの状態に違いがないか
7. Spring Bootまたは依存ライブラリの変更によるものか

問題を再現する際は、ログ、リクエスト、レスポンス、設定値、スタックトレースを保存する。

---

## 12. ロールバック手順

ステージング環境で重大な問題が発生した場合は、次を実施する。

1. 3.5.16のデプロイを停止する
2. 3.5.6の旧成果物または旧Docker Imageへ戻す
3. 必要に応じて設定ファイルを旧版へ戻す
4. Health Checkを確認する
5. 主要機能のスモークテストを実行する
6. ロールバック結果を記録する

DB Migrationがある場合は、Migrationの後方互換性とロールバック可否を事前に確認する。

---

## 13. 成果物

作業完了時に、以下を残す。

* Spring Bootバージョン変更のGit差分
* 3.5.6の依存関係ツリー
* 3.5.16の依存関係ツリー
* 依存関係の比較結果
* コンパイル結果
* 単体テスト結果
* Spring Contextテスト結果
* Profile別起動確認結果
* ステージング回帰テスト結果
* 発生した不具合と対応内容
* 性能比較結果
* リリース可否判断
* ロールバック確認結果

---

## 14. 最終判定チェックリスト

### バージョン変更

* [ ] Spring Bootのみ3.5.16へ変更した
* [ ] 不要な依存ライブラリ変更がない
* [ ] 変更内容をGitで確認した

### 依存関係

* [ ] 3.5.6と3.5.16の依存関係を比較した
* [ ] 主要ライブラリの変更を確認した
* [ ] バージョン競合がない
* [ ] Spring Boot管理外の固定バージョンを確認した

### ビルド・テスト

* [ ] コンパイルが成功した
* [ ] 単体テストが成功した
* [ ] Spring Context起動テストが成功した
* [ ] 重大な起動時警告がない

### Profile

* [ ] すべての対象Profileで起動確認した
* [ ] 外部設定の上書きを確認した
* [ ] DBや外部サービスの接続先が正しい
* [ ] 本番Profileから本番環境へ誤接続していない

### ステージング

* [ ] ステージングへのデプロイが成功した
* [ ] スモークテストが成功した
* [ ] 主要機能の回帰テストが成功した
* [ ] 認証・認可が正常
* [ ] DB処理が正常
* [ ] 外部連携が正常
* [ ] Actuatorと監視が正常
* [ ] 重大な性能劣化がない

### リリース判定

* [ ] 未解決の重大障害がない
* [ ] 既知の問題と回避策を記録した
* [ ] ロールバック手順を確認した
* [ ] 本番リリース可能と判断した
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?