Quarkus Verification

affaan-m/ECC/docs/ja-JP/skills/quarkus-verification

作者 affaan-mef648e01899ba3e8dc6371642deaaf64b4477775無授權條款275K 個星標收錄於 2026年10月9日更新於 2026年10月9日儲存庫4 天前更新

Quarkusプロジェクト検証ループ:ビルド、静的分析、カバレッジ付きテスト、セキュリティスキャン、ネイティブコンパイル、本番環境またはPR前の差分レビュー。

AI 產生的概覽

引導 Quarkus 驗證循環,涵蓋建置、靜態分析、含涵蓋率的測試、安全掃描、原生編譯與部署檢查。

功能
提供針對 Quarkus 服務的十階段驗證流程,從 Maven 或 Gradle 建置,到靜態分析、含 JaCoCo 涵蓋率門檻的測試、相依性與 API 安全掃描、GraalVM 原生編譯、效能測試、健康檢查、容器映像建置與設定驗證。內容包含範例指令、測試程式碼片段、檢查清單與範例 CI 流程。產出是一套可重複的 PR 前或上線前驗證程序,而非產生的檔案。
適用情境
適用於在 Quarkus 服務上發起拉取請求之前、重大重構或相依性升級之後,或作為進入預備環境與正式環境前的部署驗證。也適合需要強制涵蓋率門檻或檢查原生映像相容性的情況。
執行需求
需要一個使用 Maven 或 Gradle 的 Quarkus 專案、JDK,以及選用工具如 Checkstyle、PMD、SpotBugs、JaCoCo、OWASP dependency-check、SonarQube、Testcontainers、REST Assured、GraalVM、Docker、K6、Trivy 或 Grype。部分步驟需要網路存取、執行中的應用程式或憑證(例如 SonarQube 權杖)。不附帶指令碼,其中的 shell 與 CI 範例僅為內嵌說明。

Quarkus Verification Loop

PR、メジャー変更後、および本番前に実行します。

When to Activate

  • Quarkusサービスのプルリクエスト開始前
  • メジャーリファクタリングまたは依存関係アップグレード後
  • ステージング本番環境前のプリデプロイメント検証
  • フル ビルド → リント → テスト → セキュリティスキャン → ネイティブコンパイルパイプライン実行
  • テストカバレッジが閾値を満たす(80%以上)ことを検証
  • ネイティブイメージ互換性テスト

Phase 1: Build

bash
# Mavenmvn clean verify -DskipTests
# Gradle./gradlew clean assemble -x test

ビルド失敗時は停止してコンパイルエラーを修正します。

Phase 2: Static Analysis

Checkstyle, PMD, SpotBugs (Maven)

bash
mvn checkstyle:check pmd:check spotbugs:check

SonarQube (if configured)

bash
mvn sonar:sonar \  -Dsonar.projectKey=my-quarkus-project \  -Dsonar.host.url=http://localhost:9000 \  -Dsonar.login=${SONAR_TOKEN}

Common Issues to Address

  • 未使用のインポートまたは変数
  • 複雑なメソッド(高い環状複雑度)
  • 潜在的なnullポインター逆参照
  • SpotBugsでフラグが立つセキュリティ問題

Phase 3: Tests + Coverage

bash
# 全テスト実行mvn clean test
# カバレッジレポート生成mvn jacoco:report
# カバレッジ閾値を強制(80%)mvn jacoco:check
# またはGradleで./gradlew test jacocoTestReport jacocoTestCoverageVerification

Test Categories

Unit Tests

モック化された依存関係でサービスロジックテスト:

java
@ExtendWith(MockitoExtension.class)class UserServiceTest {  @Mock UserRepository userRepository;  @InjectMocks UserService userService;
  @Test  void createUser_validInput_returnsUser() {    var dto = new CreateUserDto("Alice", "[email protected]");
    // Panacheのpersist()はvoid — doNothing + verifyを使用    doNothing().when(userRepository).persist(any(User.class));
    User result = userService.create(dto);
    assertThat(result.name).isEqualTo("Alice");    verify(userRepository).persist(any(User.class));  }}
Integration Tests

実データベース(Testcontainers)でテスト:

java
@QuarkusTest@QuarkusTestResource(PostgresTestResource.class)class UserRepositoryIntegrationTest {
  @Inject  UserRepository userRepository;
  @Test  @Transactional  void findByEmail_existingUser_returnsUser() {    User user = new User();    user.name = "Alice";    user.email = "[email protected]";    userRepository.persist(user);
    Optional<User> found = userRepository.findByEmail("[email protected]");
    assertThat(found).isPresent();    assertThat(found.get().name).isEqualTo("Alice");  }}
API Tests

REST Assured でRESTエンドポイントテスト:

java
@QuarkusTestclass UserResourceTest {
  @Test  void createUser_validInput_returns201() {    given()        .contentType(ContentType.JSON)        .body("""            {"name": "Alice", "email": "[email protected]"}            """)        .when().post("/api/users")        .then()        .statusCode(201)        .body("name", equalTo("Alice"));  }
  @Test  void createUser_invalidEmail_returns400() {    given()        .contentType(ContentType.JSON)        .body("""            {"name": "Alice", "email": "invalid"}            """)        .when().post("/api/users")        .then()        .statusCode(400);  }}

Coverage Report

詳細なカバレッジに対してtarget/site/jacoco/index.htmlを確認:

  • 全行カバレッジ(目標:80%以上)
  • ブランチカバレッジ(目標:70%以上)
  • カバレッジされていない重要パスを特定

Phase 4: Security Scanning

Dependency Vulnerabilities (Maven)

bash
mvn org.owasp:dependency-check-maven:check

CVEについて target/dependency-check-report.html を確認。

Quarkus Security Audit

bash
# 脆弱な拡張機能をチェックmvn quarkus:audit
# 全拡張機能をリストmvn quarkus:list-extensions

OWASP ZAP (API Security Testing)

bash
docker run -t ghcr.io/zaproxy/zaproxy:stable zap-api-scan.py \  -t http://localhost:8080/q/openapi \  -f openapi

Common Security Checks

  • 全シークレットが環境変数(コード内ではない)
  • 全エンドポイントの入力検証
  • 認証/認可設定済み
  • CORS適切に設定
  • セキュリティヘッダー設定
  • BCryptでパスワードハッシュ化
  • SQLインジェクション保護(パラメータ化クエリ)
  • 公開エンドポイントのレート制限

Phase 5: Native Compilation

GraalVM ネイティブイメージ互換性テスト:

bash
# ネイティブ実行ファイルビルドmvn package -Dnative
# またはコンテナでmvn package -Dnative -Dquarkus.native.container-build=true
# ネイティブ実行ファイルテスト./target/*-runner
# 基本スモークテスト実行curl http://localhost:8080/q/health/livecurl http://localhost:8080/q/health/ready

Native Image Troubleshooting

一般的な問題:

  • Reflection: 動的クラスのリフレクション設定追加
  • Resources: quarkus.native.resources.includesでリソース含める
  • JNI: ネイティブライブラリ使用時JNIクラス登録

リフレクション設定例:

java
@RegisterForReflection(targets = {MyDynamicClass.class})public class ReflectionConfiguration {}

Phase 6: Performance Testing

Load Testing with K6

javascript
// load-test.jsimport http from 'k6/http';import { check } from 'k6';
export const options = {  stages: [    { duration: '30s', target: 50 },    { duration: '1m', target: 100 },    { duration: '30s', target: 0 },  ],};
export default function () {  const res = http.get('http://localhost:8080/api/markets');  check(res, {    'status is 200': (r) => r.status === 200,    'response time < 200ms': (r) => r.timings.duration < 200,  });}

実行:

bash
k6 run load-test.js

Metrics to Monitor

  • レスポンスタイム(p50、p95、p99)
  • スループット(リクエスト/秒)
  • エラー率
  • メモリ使用量
  • CPU使用量

Phase 7: Health Checks

bash
# Livenesscurl http://localhost:8080/q/health/live
# Readinesscurl http://localhost:8080/q/health/ready
# 全ヘルスチェックcurl http://localhost:8080/q/health
# メトリクス(有効な場合)curl http://localhost:8080/q/metrics

期待されるレスポンス:

json
{  "status": "UP",  "checks": [    {      "name": "Database connection",      "status": "UP"    }  ]}

Phase 8: Container Image Build

bash
# コンテナイメージビルドmvn package -Dquarkus.container-image.build=true
# または特定のレジストリでmvn package \  -Dquarkus.container-image.build=true \  -Dquarkus.container-image.registry=docker.io \  -Dquarkus.container-image.group=myorg \  -Dquarkus.container-image.tag=1.0.0
# コンテナテストdocker run -p 8080:8080 myorg/my-quarkus-app:1.0.0

Container Security Scan

bash
# Trivytrivy image myorg/my-quarkus-app:1.0.0
# Grypegrype myorg/my-quarkus-app:1.0.0

Phase 9: Configuration Validation

bash
# 全設定プロパティをチェックmvn quarkus:info
# 全設定ソースをリストcurl http://localhost:8080/q/dev/io.quarkus.quarkus-vertx-http/config

Environment-Specific Checks

  • データベースURLが環境ごとに設定
  • シークレットが外部化(Vault、環境変数)
  • ロギングレベルが適切
  • CORS origins が正しく設定
  • レート制限を設定
  • モニタリング/トレーシング有効化

Phase 10: Documentation Review

  • OpenAPI/Swaggerドキュメント最新(/q/swagger-ui)
  • READMEにセットアップ説明有り
  • APIの変更が文書化
  • 互換性破壊の変更にマイグレーションガイド
  • 設定プロパティが文書化

OpenAPI spec生成:

bash
curl http://localhost:8080/q/openapi -o openapi.json

Verification Checklist

Code Quality

  • ビルドが警告なしで成功
  • 静的分析がクリーン(高/中レベル問題なし)
  • コードがチーム規則に従う
  • PRにコメント・TODOなし

Testing

  • 全テスト成功
  • コードカバレッジ ≥ 80%
  • 実データベースでの統合テスト
  • セキュリティテスト成功
  • パフォーマンスが許容範囲内

Security

  • 依存関係の脆弱性なし
  • 認証/認可テスト済み
  • 入力検証が完全
  • シークレットがソースコードに無い
  • セキュリティヘッダー設定済み

Deployment

  • ネイティブコンパイル成功
  • コンテナイメージビルド成功
  • ヘルスチェック正しく動作
  • ターゲット環境の設定が有効

Native Image

  • ネイティブ実行ファイルビルド成功
  • ネイティブテスト成功
  • 起動時間 < 100ms
  • メモリフットプリント許容範囲

Automated Verification Script

bash
#!/bin/bashset -e
echo "=== Phase 1: Build ==="mvn clean verify -DskipTests
echo "=== Phase 2: Static Analysis ==="mvn checkstyle:check pmd:check spotbugs:check
echo "=== Phase 3: Tests + Coverage ==="mvn test jacoco:report jacoco:check
echo "=== Phase 4: Security Scan ==="mvn org.owasp:dependency-check-maven:check
echo "=== Phase 5: Native Compilation ==="mvn package -Dnative -Dquarkus.native.container-build=true
echo "=== All Phases Complete ==="echo "Review reports:"echo "  - Coverage: target/site/jacoco/index.html"echo "  - Security: target/dependency-check-report.html"echo "  - Native: target/*-runner"

CI/CD Integration

GitHub Actions Example

yaml
name: Verification
on: [push, pull_request]
jobs:  verify:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v7
      - name: Set up JDK 21        uses: actions/setup-java@v5        with:          java-version: '21'          distribution: 'temurin'
      - name: Cache Maven packages        uses: actions/cache@v6        with:          path: ~/.m2          key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
      - name: Build        run: mvn clean verify -DskipTests
      - name: Test with Coverage        run: mvn test jacoco:report jacoco:check
      - name: Security Scan        run: mvn org.owasp:dependency-check-maven:check
      - name: Upload Coverage        uses: codecov/codecov-action@v7        with:          token: ${{ secrets.CODECOV_TOKEN }}          files: target/site/jacoco/jacoco.xml

Best Practices

  • 全PRの前に検証ループ実行
  • CI/CDパイプラインで自動化
  • 問題は即座に修正、債務を溜めない
  • カバレッジを80%以上に保つ
  • 依存関係を定期的にアップデート
  • 定期的にネイティブコンパイルテスト
  • パフォーマンストレンドを監視
  • 互換性破壊の変更を文書化
  • セキュリティスキャン結果をレビュー
  • 環境ごとに設定を検証

來源與署名

來源:affaan-m/ECC位於docs/ja-JP/skills/quarkus-verification提交ef648e0

授權條款: 無授權條款

內容歸原作者所有。SourceWeft 從公開儲存庫中收錄這些內容。

檢舉或申請下架