Catalog
affaan-m/quarkus-verification

affaan-m

quarkus-verification

Verification loop for Quarkus projects: build, static analysis (Checkstyle, PMD, SpotBugs), tests with JaCoCo coverage, OWASP dependency and container security scans, GraalVM native compilation, health checks, and config validation. Use when verifying a Quarkus service before a PR, after major refactoring or dependency upgrades, or pre-deploy.

NewUpdated Sep 27, 2026

Quarkus Verification Loop

Run before PRs, after major changes, and pre-deploy.

When to Activate

  • Before opening a pull request for a Quarkus service
  • After major refactoring or dependency upgrades
  • Pre-deployment verification for staging or production
  • Running full build → lint → test → security scan → native compilation pipeline
  • Validating test coverage meets thresholds (80%+)
  • Testing native image compatibility

Phase 1: Build

# Maven
mvn clean verify -DskipTests

# Gradle
./gradlew clean assemble -x test

If build fails, stop and fix compilation errors.

Phase 2: Static Analysis

Checkstyle, PMD, SpotBugs (Maven)

mvn checkstyle:check pmd:check spotbugs:check

SonarQube (if configured)

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

Common Issues to Address

  • Unused imports or variables
  • Complex methods (high cyclomatic complexity)
  • Potential null pointer dereferences
  • Security issues flagged by SpotBugs

Phase 3: Tests + Coverage

# Run all tests
mvn clean test

# Generate coverage report
mvn jacoco:report

# Enforce coverage threshold (80%)
mvn jacoco:check

# Or with Gradle
./gradlew test jacocoTestReport jacocoTestCoverageVerification

Test Categories

Unit Tests

Test service logic with mocked dependencies:

@ExtendWith(MockitoExtension.class)
class UserServiceTest {
  @Mock UserRepository userRepository;
  @InjectMocks UserService userService;

  @Test
  void createUser_validInput_returnsUser() {
    var dto = new CreateUserDto("Alice", "alice@example.com");

    // Panache persist() is void — use 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

Test with real database (Testcontainers):

@QuarkusTest
@QuarkusTestResource(PostgresTestResource.class)
class UserRepositoryIntegrationTest {

  @Inject
  UserRepository userRepository;

  @Test
  @Transactional
  void 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

Test REST endpoints with REST Assured:

@QuarkusTest
class UserResourceTest {

  @Test
  void 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"));
  }

  @Test
  void createUser_invalidEmail_returns400() {
    given()
        .contentType(ContentType.JSON)
        .body("""
            {"name": "Alice", "email": "invalid"}
            """)
        .when().post("/api/users")
        .then()
        .statusCode(400);
  }
}

Coverage Report

Check target/site/jacoco/index.html for detailed coverage:

  • Overall line coverage (target: 80%+)
  • Branch coverage (target: 70%+)
  • Identify uncovered critical paths

Phase 4: Security Scanning

Dependency Vulnerabilities (Maven)

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

Review target/dependency-check-report.html for CVEs.

Quarkus Security Audit

# Check vulnerable extensions
mvn quarkus:audit

# List all extensions
mvn quarkus:list-extensions

OWASP ZAP (API Security Testing)

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

Common Security Checks

  • All secrets in environment variables (not in code)
  • Input validation on all endpoints
  • Authentication/authorization configured
  • CORS properly configured
  • Security headers set
  • Passwords hashed with BCrypt
  • SQL injection protection (parameterized queries)
  • Rate limiting on public endpoints

Phase 5: Native Compilation

Test GraalVM native image compatibility:

# Build native executable
mvn package -Dnative

# Or with container
mvn package -Dnative -Dquarkus.native.container-build=true

# Test native executable
./target/*-runner

# Run basic smoke tests
curl http://localhost:8080/q/health/live
curl http://localhost:8080/q/health/ready

Native Image Troubleshooting

Common issues:

  • Reflection: Add reflection config for dynamic classes
  • Resources: Include resources with quarkus.native.resources.includes
  • JNI: Register JNI classes if using native libraries

Example reflection config:

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

Phase 6: Performance Testing

Load Testing with K6

// load-test.js
import 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,
  });
}

Run:

k6 run load-test.js

Metrics to Monitor

  • Response time (p50, p95, p99)
  • Throughput (requests/sec)
  • Error rate
  • Memory usage
  • CPU usage

Phase 7: Health Checks

# Liveness
curl http://localhost:8080/q/health/live

# Readiness
curl http://localhost:8080/q/health/ready

# All health checks
curl http://localhost:8080/q/health

# Metrics (if enabled)
curl http://localhost:8080/q/metrics

Expected responses:

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

Phase 8: Container Image Build

# Build container image
mvn package -Dquarkus.container-image.build=true

# Or with specific registry
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

# Test container
docker run -p 8080:8080 myorg/my-quarkus-app:1.0.0

Container Security Scan

# Trivy
trivy image myorg/my-quarkus-app:1.0.0

# Grype
grype myorg/my-quarkus-app:1.0.0

Phase 9: Configuration Validation

# Check all configuration properties
mvn quarkus:info

# List all config sources
curl http://localhost:8080/q/dev/io.quarkus.quarkus-vertx-http/config

Environment-Specific Checks

  • Database URLs configured per environment
  • Secrets externalized (Vault, env vars)
  • Logging levels appropriate
  • CORS origins set correctly
  • Rate limiting configured
  • Monitoring/tracing enabled

Phase 10: Documentation Review

  • OpenAPI/Swagger docs up to date (/q/swagger-ui)
  • README has setup instructions
  • API changes documented
  • Migration guide for breaking changes
  • Configuration properties documented

Generate OpenAPI spec:

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

Verification Checklist

Code Quality

  • Build passes without warnings
  • Static analysis clean (no high/medium issues)
  • Code follows team conventions
  • No commented-out code or TODOs in PR

Testing

  • All tests pass
  • Code coverage ≥ 80%
  • Integration tests with real database
  • Security tests pass
  • Performance within acceptable limits

Security

  • No dependency vulnerabilities
  • Authentication/authorization tested
  • Input validation complete
  • Secrets not in source code
  • Security headers configured

Deployment

  • Native compilation successful
  • Container image builds
  • Health checks respond correctly
  • Configuration valid for target environment

Native Image

  • Native executable builds
  • Native tests pass
  • Startup time < 100ms
  • Memory footprint acceptable

Automated Verification Script

#!/bin/bash
set -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

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

  • Run verification loop before every PR
  • Automate in CI/CD pipeline
  • Fix issues immediately; don't accumulate debt
  • Keep coverage above 80%
  • Update dependencies regularly
  • Test native compilation periodically
  • Monitor performance trends
  • Document breaking changes
  • Review security scan results
  • Validate configuration for each environment
Files1
1 files · 1.0 KB

Select a file to preview

Overall Score

82/100

Grade

B

Good

Grades are signals, not a certification. Always review a skill yourself before use.

Safety

82

Quality

85

Clarity

88

Completeness

78

Summary

A comprehensive verification loop for Quarkus projects covering build, static analysis, testing with JaCoCo coverage, OWASP security scanning, GraalVM native compilation, health checks, and configuration validation. The skill provides structured guidance for running a complete quality gate before PR submission, major refactoring, or deployment.

Static Analysis Findings

1 finding

Patterns detected by deterministic static analysis before AI scoring. Hover over any finding code for detailed information and remediation guidance.

Network Access
SEC-060Outbound Network Request8x in 1 file

Outbound network request (curl/wget/fetch)

SKILL.mdcurl http://8x

Detected Capabilities

shell execution (mvn, gradle commands)file reading and analysis (coverage reports, security scan reports)docker execution (OWASP ZAP, Trivy, container builds)http requests (curl health checks, metrics, openapi)build and compilation (Maven, Gradle, GraalVM native)code analysis (Checkstyle, PMD, SpotBugs, SonarQube)test execution (unit, integration, API tests)load testing (K6)code examples (Java, JavaScript, YAML)

Trigger Keywords

Phrases that agents use to match this skill to user intent.

quarkus verificationpre-pr checksnative image testjacoco coveragedependency vulnerability scanquarkus security auditnative compilation check

Risk Signals

INFO

Multiple curl http://localhost requests to local health and metrics endpoints

SKILL.md: Phases 5, 7 (curl http://localhost:8080/q/health/live, /q/health/ready, /q/metrics, /q/dev/..., k6 load-test.js)
INFO

SonarQube integration with -Dsonar.host.url=http://localhost:9000 and token injection

SKILL.md: Phase 2 (SonarQube section, -Dsonar.login=${SONAR_TOKEN})
INFO

Environment variable reference for credentials: ${SONAR_TOKEN}

SKILL.md: Phase 2 (SonarQube command)
INFO

Docker execution for container image scanning (Trivy, Grype) and OWASP ZAP security testing

SKILL.md: Phase 4 and Phase 8 (docker run commands)
INFO

Local Docker container execution for test image: docker run -p 8080:8080

SKILL.md: Phase 8 (container build testing)

Referenced Domains

External domains referenced in skill content, detected by static analysis.

localhost

Use Cases

  • - Pre-PR verification: Run the full verification loop to ensure code quality, test coverage, and security before submitting a pull request for a Quarkus service - Post-refactoring validation: Verify that major refactoring or dependency upgrades don't break compilation, tests, or introduce vulnerabilities - Pre-deployment checks: Validate staging or production deployments with comprehensive testing, native compilation, and health checks - Coverage enforcement: Ensure test coverage meets organizational thresholds (80%+) with JaCoCo report analysis - Native image compatibility: Test GraalVM native compilation and runtime behavior before using in containerized environments - Security auditing: Run dependency vulnerability scans, OWASP ZAP API testing, and authentication/authorization validation
  • CI/CD pipeline automation: Integrate verification phases into GitHub Actions or other CI/CD systems for automated quality gates

Quality Notes

  • Comprehensive coverage of all phases in a Quarkus verification workflow with clear structure and logical progression
  • Excellent use of code examples for all major sections (Maven/Gradle commands, Java tests, JavaScript load tests, YAML CI/CD configuration)
  • Well-documented checklist format makes it easy for developers to track progress and ensure nothing is missed
  • Practical guidance on common issues, troubleshooting, and best practices for each phase
  • Clear distinctions between unit tests, integration tests, and API tests with complete working code examples
  • Includes both Maven and Gradle alternatives for build commands, acknowledging different project setups
  • Security phase is thorough with multiple scanning approaches (dependency check, Quarkus audit, OWASP ZAP, container scanning)
  • Native compilation section addresses realistic challenges like reflection, resources, and JNI configuration
  • CI/CD integration example with GitHub Actions is production-ready and includes caching optimization
  • Performance testing phase with K6 includes realistic load stages and key metrics to monitor
  • Verification checklist at the end ensures all critical areas are covered before deployment
  • Environment-specific configuration validation ensures secrets and settings are properly externalized
  • Strong emphasis on best practices like running before every PR, automating in CI/CD, and not accumulating technical debt
Model: claude-haiku-4-5-20251001Analyzed: Sep 27, 2026

Reviews

Add this skill to your library to leave a review.

No reviews yet

Be the first to share your experience.

Version History

  1. v2.0

    Contract changed: description

    ✦ AIDescription expanded to detail specific tools (Checkstyle, PMD, SpotBugs, JaCoCo, OWASP, GraalVM) andactivation scenarios.

    triggering2026-09-27

    LATEST
  2. v1.2

    Content updated

    ✦ AIUpdates Docker image registry from owasp/zap2docker-stable to ghcr.io/zaproxy/zaproxy:stable and bumps GitHub Actions versions (checkout, setup-java, cache, codecov).

    2026-09-09

    View This Version
  3. v1.1

    Content updated

    ✦ AIWhitespace normalization in CI/CD Integration section; no behavioral changes to build, test, or security steps.

    2026-07-14

    View This Version
  4. v1.0

    2026-05-15

    View This VersionInitial version

Use affaan-m/quarkus-verification in your dev environment

Command Palette

Search for a command to run...