Quarkus Verification

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

by affaan-mef648e01899ba3e8dc6371642deaaf64b4477775No license275K starsListed Oct 9, 2026Updated Oct 9, 2026Repository updated 4 days ago

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

AI-generated overview

Guides a Quarkus verification loop covering build, static analysis, tests with coverage, security scans, native compilation and deployment checks.

What it does
Provides a ten-phase verification workflow for Quarkus services, from Maven or Gradle builds through static analysis, tests with JaCoCo coverage thresholds, dependency and API security scanning, GraalVM native compilation, performance testing, health checks, container image builds and configuration validation. It supplies example commands, test code snippets, checklists and a sample CI pipeline. The deliverable is a repeatable pre-PR or pre-production verification procedure rather than a generated artifact.
When to use it
Use before opening a pull request on a Quarkus service, after major refactoring or dependency upgrades, or as pre-deployment validation before staging or production. It also fits when you need to enforce coverage thresholds or check native image compatibility.
Requirements
Requires a Quarkus project with Maven or Gradle, a JDK, and optional tooling such as Checkstyle, PMD, SpotBugs, JaCoCo, OWASP dependency-check, SonarQube, Testcontainers, REST Assured, GraalVM, Docker, K6, Trivy or Grype. Some steps need network access, a running application, or credentials such as a SonarQube token. Ships no scripts; the shell and CI examples are inline instructions only.

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%以上に保つ
  • 依存関係を定期的にアップデート
  • 定期的にネイティブコンパイルテスト
  • パフォーマンストレンドを監視
  • 互換性破壊の変更を文書化
  • セキュリティスキャン結果をレビュー
  • 環境ごとに設定を検証

Source and attribution

Source:affaan-m/ECCindocs/ja-JP/skills/quarkus-verificationat commitef648e0

License: No license

Content belongs to its original authors. SourceWeft indexes it from a public repository.

Report or request removal