<< All versions
Skill v1.0.2
currentAutomated scan100/100affaan-m/ecc/quarkus-verification
~2 modified
──Details
PublishedAugust 29, 2026 at 10:34 AM
Content Hashsha256:411a825ad1edae7f...
Git SHA656d4b574641
Bump Typepatch
──Files
Files (1 file, 11.4 KB)
SKILL.md11.4 KBactive
SKILL.md · 482 lines · 11.4 KB
version: "1.0.2" name: quarkus-verification description: Quarkusプロジェクト検証ループ:ビルド、静的分析、カバレッジ付きテスト、セキュリティスキャン、ネイティブコンパイル、本番環境またはPR前の差分レビュー。 origin: ECC
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;@Testvoid createUser_validInput_returnsUser() {var dto = new CreateUserDto("Alice", "alice@example.com");// 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 {@InjectUserRepository userRepository;@Test@Transactionalvoid findByEmail_existingUser_returnsUser() {User user = new User();user.name = "Alice";user.email = "alice@example.com";userRepository.persist(user);Optional<User> found = userRepository.findByEmail("alice@example.com");assertThat(found).isPresent();assertThat(found.get().name).isEqualTo("Alice");}}
API Tests
REST Assured でRESTエンドポイントテスト:
java
@QuarkusTestclass UserResourceTest {@Testvoid createUser_validInput_returns201() {given().contentType(ContentType.JSON).body("""{"name": "Alice", "email": "alice@example.com"}""").when().post("/api/users").then().statusCode(201).body("name", equalTo("Alice"));}@Testvoid 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 -eecho "=== Phase 1: Build ==="mvn clean verify -DskipTestsecho "=== Phase 2: Static Analysis ==="mvn checkstyle:check pmd:check spotbugs:checkecho "=== Phase 3: Tests + Coverage ==="mvn test jacoco:report jacoco:checkecho "=== Phase 4: Security Scan ==="mvn org.owasp:dependency-check-maven:checkecho "=== Phase 5: Native Compilation ==="mvn package -Dnative -Dquarkus.native.container-build=trueecho "=== 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: Verificationon: [push, pull_request]jobs:verify:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v7- name: Set up JDK 21uses: actions/setup-java@v5with:java-version: '21'distribution: 'temurin'- name: Cache Maven packagesuses: actions/cache@v6with:path: ~/.m2key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}- name: Buildrun: mvn clean verify -DskipTests- name: Test with Coveragerun: mvn test jacoco:report jacoco:check- name: Security Scanrun: mvn org.owasp:dependency-check-maven:check- name: Upload Coverageuses: codecov/codecov-action@v7with:token: ${{ secrets.CODECOV_TOKEN }}files: target/site/jacoco/jacoco.xml
Best Practices
- 全PRの前に検証ループ実行
- CI/CDパイプラインで自動化
- 問題は即座に修正、債務を溜めない
- カバレッジを80%以上に保つ
- 依存関係を定期的にアップデート
- 定期的にネイティブコンパイルテスト
- パフォーマンストレンドを監視
- 互換性破壊の変更を文書化
- セキュリティスキャン結果をレビュー
- 環境ごとに設定を検証