Reviewer 역할 검증 보고서 smoke #8
5 changed files with 623 additions and 0 deletions
|
|
@ -0,0 +1,3 @@
|
||||||
|
# role-reviewer-live-1522-001-attempt-2-run-71d436e6354c
|
||||||
|
|
||||||
|
Forge 이슈 작업 브랜치 `forge/role-reviewer-live-1522-001-attempt-2-run-71d436e6354c`.
|
||||||
120
verification/evidence-report.json
Normal file
120
verification/evidence-report.json
Normal file
|
|
@ -0,0 +1,120 @@
|
||||||
|
{
|
||||||
|
"evidence_report_version": "1.0",
|
||||||
|
"generated_at": "2026-07-14T15:22:00Z",
|
||||||
|
"source_report": "verification/smoke-test-report.json",
|
||||||
|
"summary": {
|
||||||
|
"total_checks": 17,
|
||||||
|
"passed": 0,
|
||||||
|
"failed": 0,
|
||||||
|
"warnings": 0,
|
||||||
|
"skipped": 0
|
||||||
|
},
|
||||||
|
"ci_pipeline_checklist": [
|
||||||
|
{
|
||||||
|
"id": "ci_build",
|
||||||
|
"description": "Build stage configured",
|
||||||
|
"status": "PENDING",
|
||||||
|
"message": "Run smoke-test.sh to populate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "ci_test",
|
||||||
|
"description": "Test stage configured",
|
||||||
|
"status": "PENDING",
|
||||||
|
"message": "Run smoke-test.sh to populate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "ci_package",
|
||||||
|
"description": "Package stage configured",
|
||||||
|
"status": "PENDING",
|
||||||
|
"message": "Run smoke-test.sh to populate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "ci_deploy",
|
||||||
|
"description": "Deploy/CI-CD pipeline configured",
|
||||||
|
"status": "PENDING",
|
||||||
|
"message": "Run smoke-test.sh to populate"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"operational_risks_checklist": [
|
||||||
|
{
|
||||||
|
"id": "risk_deployment",
|
||||||
|
"description": "Deployment strategy defined",
|
||||||
|
"status": "PENDING",
|
||||||
|
"message": "Run smoke-test.sh to populate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "risk_monitoring",
|
||||||
|
"description": "Monitoring configured",
|
||||||
|
"status": "PENDING",
|
||||||
|
"message": "Run smoke-test.sh to populate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "risk_backup",
|
||||||
|
"description": "Backup mechanism in place",
|
||||||
|
"status": "PENDING",
|
||||||
|
"message": "Run smoke-test.sh to populate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "risk_secret",
|
||||||
|
"description": "Secret management configured",
|
||||||
|
"status": "PENDING",
|
||||||
|
"message": "Run smoke-test.sh to populate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "risk_health",
|
||||||
|
"description": "Health check endpoints defined",
|
||||||
|
"status": "PENDING",
|
||||||
|
"message": "Run smoke-test.sh to populate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "risk_logging",
|
||||||
|
"description": "Logging framework configured",
|
||||||
|
"status": "PENDING",
|
||||||
|
"message": "Run smoke-test.sh to populate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "risk_error",
|
||||||
|
"description": "Error handling implemented",
|
||||||
|
"status": "PENDING",
|
||||||
|
"message": "Run smoke-test.sh to populate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "risk_rollback",
|
||||||
|
"description": "Rollback strategy documented",
|
||||||
|
"status": "PENDING",
|
||||||
|
"message": "Run smoke-test.sh to populate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "risk_shutdown",
|
||||||
|
"description": "Graceful shutdown handling",
|
||||||
|
"status": "PENDING",
|
||||||
|
"message": "Run smoke-test.sh to populate"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"core_tests": [
|
||||||
|
{
|
||||||
|
"id": "compilation",
|
||||||
|
"description": "Code compilation",
|
||||||
|
"status": "PENDING",
|
||||||
|
"message": "Run smoke-test.sh to populate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "unit_tests",
|
||||||
|
"description": "Unit test execution",
|
||||||
|
"status": "PENDING",
|
||||||
|
"message": "Run smoke-test.sh to populate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "role_matrix",
|
||||||
|
"description": "Role matrix implementation",
|
||||||
|
"status": "PENDING",
|
||||||
|
"message": "Run smoke-test.sh to populate"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "runtime",
|
||||||
|
"description": "Runtime integration",
|
||||||
|
"status": "PENDING",
|
||||||
|
"message": "Run smoke-test.sh to populate"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
190
verification/generate-evidence.sh
Normal file
190
verification/generate-evidence.sh
Normal file
|
|
@ -0,0 +1,190 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# Evidence Report Generator
|
||||||
|
# Parses smoke-test-report.json and generates evidence-report.json
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
SMOKE_REPORT="verification/smoke-test-report.json"
|
||||||
|
EVIDENCE_REPORT="verification/evidence-report.json"
|
||||||
|
|
||||||
|
echo "=== Generating Evidence Report ==="
|
||||||
|
|
||||||
|
# Check if smoke test report exists
|
||||||
|
if [ ! -f "$SMOKE_REPORT" ]; then
|
||||||
|
echo "Error: $SMOKE_REPORT not found. Run smoke-test.sh first."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Check if jq is available
|
||||||
|
if ! command -v jq &>/dev/null; then
|
||||||
|
echo "Error: jq is required but not installed."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Extract summary counts
|
||||||
|
TOTAL=$(jq '.summary.total' "$SMOKE_REPORT")
|
||||||
|
PASSED=$(jq '.summary.passed' "$SMOKE_REPORT")
|
||||||
|
FAILED=$(jq '.summary.failed' "$SMOKE_REPORT")
|
||||||
|
WARNED=$(jq '.summary.warned' "$SMOKE_REPORT")
|
||||||
|
SKIPPED=$(jq '.summary.skipped' "$SMOKE_REPORT")
|
||||||
|
|
||||||
|
# Extract test results using proper JSON array parsing
|
||||||
|
get_test_status() {
|
||||||
|
local test_name="$1"
|
||||||
|
jq -r ".results[] | select(.test == \"$test_name\") | .status" "$SMOKE_REPORT" 2>/dev/null || echo "UNKNOWN"
|
||||||
|
}
|
||||||
|
|
||||||
|
get_test_message() {
|
||||||
|
local test_name="$1"
|
||||||
|
jq -r ".results[] | select(.test == \"$test_name\") | .message" "$SMOKE_REPORT" 2>/dev/null || echo "No message"
|
||||||
|
}
|
||||||
|
|
||||||
|
# CI Pipeline Checklist (4 items)
|
||||||
|
CI_BUILD=$(get_test_status "ci_build_stage")
|
||||||
|
CI_BUILD_MSG=$(get_test_message "ci_build_stage")
|
||||||
|
CI_TEST=$(get_test_status "ci_test_stage")
|
||||||
|
CI_TEST_MSG=$(get_test_message "ci_test_stage")
|
||||||
|
CI_PACKAGE=$(get_test_status "ci_package_stage")
|
||||||
|
CI_PACKAGE_MSG=$(get_test_message "ci_package_stage")
|
||||||
|
CI_DEPLOY=$(get_test_status "ci_deploy_stage")
|
||||||
|
CI_DEPLOY_MSG=$(get_test_message "ci_deploy_stage")
|
||||||
|
|
||||||
|
# Operational Risks Checklist (9 items)
|
||||||
|
RISK_DEPLOY=$(get_test_status "risk_deployment_strategy")
|
||||||
|
RISK_DEPLOY_MSG=$(get_test_message "risk_deployment_strategy")
|
||||||
|
RISK_MONITOR=$(get_test_status "risk_monitoring")
|
||||||
|
RISK_MONITOR_MSG=$(get_test_message "risk_monitoring")
|
||||||
|
RISK_BACKUP=$(get_test_status "risk_backup")
|
||||||
|
RISK_BACKUP_MSG=$(get_test_message "risk_backup")
|
||||||
|
RISK_SECRET=$(get_test_status "risk_secret_management")
|
||||||
|
RISK_SECRET_MSG=$(get_test_message "risk_secret_management")
|
||||||
|
RISK_HEALTH=$(get_test_status "risk_health_check")
|
||||||
|
RISK_HEALTH_MSG=$(get_test_message "risk_health_check")
|
||||||
|
RISK_LOGGING=$(get_test_status "risk_logging")
|
||||||
|
RISK_LOGGING_MSG=$(get_test_message "risk_logging")
|
||||||
|
RISK_ERROR=$(get_test_status "risk_error_handling")
|
||||||
|
RISK_ERROR_MSG=$(get_test_message "risk_error_handling")
|
||||||
|
RISK_ROLLBACK=$(get_test_status "risk_rollback")
|
||||||
|
RISK_ROLLBACK_MSG=$(get_test_message "risk_rollback")
|
||||||
|
RISK_SHUTDOWN=$(get_test_status "risk_graceful_shutdown")
|
||||||
|
RISK_SHUTDOWN_MSG=$(get_test_message "risk_graceful_shutdown")
|
||||||
|
|
||||||
|
# Core Tests
|
||||||
|
COMPILATION=$(get_test_status "compilation")
|
||||||
|
COMPILATION_MSG=$(get_test_message "compilation")
|
||||||
|
UNIT_TESTS=$(get_test_status "unit_tests")
|
||||||
|
UNIT_TESTS_MSG=$(get_test_message "unit_tests")
|
||||||
|
ROLE_MATRIX=$(get_test_status "role_matrix_impl")
|
||||||
|
ROLE_MATRIX_MSG=$(get_test_message "role_matrix_impl")
|
||||||
|
RUNTIME=$(get_test_status "runtime_integration")
|
||||||
|
RUNTIME_MSG=$(get_test_message "runtime_integration")
|
||||||
|
|
||||||
|
# Generate evidence report
|
||||||
|
cat > "$EVIDENCE_REPORT" << 'EOF'
|
||||||
|
{
|
||||||
|
"evidence_report_version": "1.0",
|
||||||
|
"generated_at": "__TIMESTAMP__",
|
||||||
|
"source_report": "verification/smoke-test-report.json",
|
||||||
|
"summary": {
|
||||||
|
"total_checks": 0,
|
||||||
|
"passed": 0,
|
||||||
|
"failed": 0,
|
||||||
|
"warnings": 0,
|
||||||
|
"skipped": 0
|
||||||
|
},
|
||||||
|
"ci_pipeline_checklist": [],
|
||||||
|
"operational_risks_checklist": [],
|
||||||
|
"core_tests": []
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Build CI pipeline checklist JSON
|
||||||
|
CI_CHECKLIST=$(cat << JQEOF
|
||||||
|
[
|
||||||
|
{"id": "ci_build", "description": "Build stage configured", "status": "$CI_BUILD", "message": "$CI_BUILD_MSG"},
|
||||||
|
{"id": "ci_test", "description": "Test stage configured", "status": "$CI_TEST", "message": "$CI_TEST_MSG"},
|
||||||
|
{"id": "ci_package", "description": "Package stage configured", "status": "$CI_PACKAGE", "message": "$CI_PACKAGE_MSG"},
|
||||||
|
{"id": "ci_deploy", "description": "Deploy/CI-CD pipeline configured", "status": "$CI_DEPLOY", "message": "$CI_DEPLOY_MSG"}
|
||||||
|
]
|
||||||
|
JQEOF
|
||||||
|
)
|
||||||
|
|
||||||
|
# Build operational risks checklist JSON
|
||||||
|
RISK_CHECKLIST=$(cat << JQEOF
|
||||||
|
[
|
||||||
|
{"id": "risk_deployment", "description": "Deployment strategy defined", "status": "$RISK_DEPLOY", "message": "$RISK_DEPLOY_MSG"},
|
||||||
|
{"id": "risk_monitoring", "description": "Monitoring configured", "status": "$RISK_MONITOR", "message": "$RISK_MONITOR_MSG"},
|
||||||
|
{"id": "risk_backup", "description": "Backup mechanism in place", "status": "$RISK_BACKUP", "message": "$RISK_BACKUP_MSG"},
|
||||||
|
{"id": "risk_secret", "description": "Secret management configured", "status": "$RISK_SECRET", "message": "$RISK_SECRET_MSG"},
|
||||||
|
{"id": "risk_health", "description": "Health check endpoints defined", "status": "$RISK_HEALTH", "message": "$RISK_HEALTH_MSG"},
|
||||||
|
{"id": "risk_logging", "description": "Logging framework configured", "status": "$RISK_LOGGING", "message": "$RISK_LOGGING_MSG"},
|
||||||
|
{"id": "risk_error", "description": "Error handling implemented", "status": "$RISK_ERROR", "message": "$RISK_ERROR_MSG"},
|
||||||
|
{"id": "risk_rollback", "description": "Rollback strategy documented", "status": "$RISK_ROLLBACK", "message": "$RISK_ROLLBACK_MSG"},
|
||||||
|
{"id": "risk_shutdown", "description": "Graceful shutdown handling", "status": "$RISK_SHUTDOWN", "message": "$RISK_SHUTDOWN_MSG"}
|
||||||
|
]
|
||||||
|
JQEOF
|
||||||
|
)
|
||||||
|
|
||||||
|
# Build core tests JSON
|
||||||
|
CORE_TESTS=$(cat << JQEOF
|
||||||
|
[
|
||||||
|
{"id": "compilation", "description": "Code compilation", "status": "$COMPILATION", "message": "$COMPILATION_MSG"},
|
||||||
|
{"id": "unit_tests", "description": "Unit test execution", "status": "$UNIT_TESTS", "message": "$UNIT_TESTS_MSG"},
|
||||||
|
{"id": "role_matrix", "description": "Role matrix implementation", "status": "$ROLE_MATRIX", "message": "$ROLE_MATRIX_MSG"},
|
||||||
|
{"id": "runtime", "description": "Runtime integration", "status": "$RUNTIME", "message": "$RUNTIME_MSG"}
|
||||||
|
]
|
||||||
|
JQEOF
|
||||||
|
)
|
||||||
|
|
||||||
|
# Calculate checklist counts
|
||||||
|
CI_PASSED=$(echo "$CI_CHECKLIST" | jq '[.[] | select(.status == "PASS")] | length')
|
||||||
|
CI_FAILED=$(echo "$CI_CHECKLIST" | jq '[.[] | select(.status == "FAIL")] | length')
|
||||||
|
CI_WARNED=$(echo "$CI_CHECKLIST" | jq '[.[] | select(.status == "WARN")] | length')
|
||||||
|
|
||||||
|
RISK_PASSED=$(echo "$RISK_CHECKLIST" | jq '[.[] | select(.status == "PASS")] | length')
|
||||||
|
RISK_FAILED=$(echo "$RISK_CHECKLIST" | jq '[.[] | select(.status == "FAIL")] | length')
|
||||||
|
RISK_WARNED=$(echo "$RISK_CHECKLIST" | jq '[.[] | select(.status == "WARN")] | length')
|
||||||
|
|
||||||
|
CORE_PASSED=$(echo "$CORE_TESTS" | jq '[.[] | select(.status == "PASS")] | length')
|
||||||
|
CORE_FAILED=$(echo "$CORE_TESTS" | jq '[.[] | select(.status == "FAIL")] | length')
|
||||||
|
CORE_WARNED=$(echo "$CORE_TESTS" | jq '[.[] | select(.status == "WARN")] | length')
|
||||||
|
CORE_SKIPPED=$(echo "$CORE_TESTS" | jq '[.[] | select(.status == "SKIP")] | length')
|
||||||
|
|
||||||
|
TOTAL_CHECKS=$((4 + 9 + 4))
|
||||||
|
TOTAL_PASSED=$((CI_PASSED + RISK_PASSED + CORE_PASSED))
|
||||||
|
TOTAL_FAILED=$((CI_FAILED + RISK_FAILED + CORE_FAILED))
|
||||||
|
TOTAL_WARNED=$((CI_WARNED + RISK_WARNED + CORE_WARNED))
|
||||||
|
TOTAL_SKIPPED=$((0 + 0 + CORE_SKIPPED))
|
||||||
|
|
||||||
|
# Update evidence report
|
||||||
|
REPORT_CONTENT=$(cat "$EVIDENCE_REPORT")
|
||||||
|
REPORT_CONTENT=$(echo "$REPORT_CONTENT" | sed "s/__TIMESTAMP__/$(date -Iseconds)/")
|
||||||
|
REPORT_CONTENT=$(echo "$REPORT_CONTENT" | jq \
|
||||||
|
--argjson total "$TOTAL_CHECKS" \
|
||||||
|
--argjson passed "$TOTAL_PASSED" \
|
||||||
|
--argjson failed "$TOTAL_FAILED" \
|
||||||
|
--argjson warned "$TOTAL_WARNED" \
|
||||||
|
--argjson skipped "$TOTAL_SKIPPED" \
|
||||||
|
'.summary = {"total_checks": $total, "passed": $passed, "failed": $failed, "warnings": $warned, "skipped": $skipped}')
|
||||||
|
|
||||||
|
REPORT_CONTENT=$(echo "$REPORT_CONTENT" | jq --argjson cil "$CI_CHECKLIST" '.ci_pipeline_checklist = $cil')
|
||||||
|
REPORT_CONTENT=$(echo "$REPORT_CONTENT" | jq --argjson rcl "$RISK_CHECKLIST" '.operational_risks_checklist = $rcl')
|
||||||
|
REPORT_CONTENT=$(echo "$REPORT_CONTENT" | jq --argjson ct "$CORE_TESTS" '.core_tests = $ct')
|
||||||
|
|
||||||
|
echo "$REPORT_CONTENT" > "$EVIDENCE_REPORT"
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
echo "=== Evidence Report Summary ==="
|
||||||
|
echo "Total Checks: $TOTAL_CHECKS"
|
||||||
|
echo "Passed: $TOTAL_PASSED"
|
||||||
|
echo "Failed: $TOTAL_FAILED"
|
||||||
|
echo "Warnings: $TOTAL_WARNED"
|
||||||
|
echo "Skipped: $TOTAL_SKIPPED"
|
||||||
|
echo ""
|
||||||
|
echo "CI Pipeline (4 items): $CI_PASSED passed, $CI_FAILED failed, $CI_WARNED warnings"
|
||||||
|
echo "Operational Risks (9 items): $RISK_PASSED passed, $RISK_FAILED failed, $RISK_WARNED warnings"
|
||||||
|
echo "Core Tests (4 items): $CORE_PASSED passed, $CORE_FAILED failed, $CORE_WARNED warnings, $CORE_SKIPPED skipped"
|
||||||
|
echo ""
|
||||||
|
echo "Evidence report saved to: $EVIDENCE_REPORT"
|
||||||
|
|
||||||
|
exit 0
|
||||||
51
verification/run-verification.sh
Normal file
51
verification/run-verification.sh
Normal file
|
|
@ -0,0 +1,51 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# Complete Verification Runner
|
||||||
|
# Runs smoke-test.sh then generate-evidence.sh
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "=========================================="
|
||||||
|
echo "Runtime Role Matrix - Verification Suite"
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Step 1: Run smoke tests
|
||||||
|
echo ">>> Step 1: Running Smoke Tests..."
|
||||||
|
echo ""
|
||||||
|
bash verification/smoke-test.sh
|
||||||
|
SMOKE_EXIT=$?
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Step 2: Generate evidence report
|
||||||
|
echo ">>> Step 2: Generating Evidence Report..."
|
||||||
|
echo ""
|
||||||
|
bash verification/generate-evidence.sh
|
||||||
|
EVIDENCE_EXIT=$?
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Step 3: Display results
|
||||||
|
echo "=========================================="
|
||||||
|
echo "Verification Complete"
|
||||||
|
echo "=========================================="
|
||||||
|
echo ""
|
||||||
|
echo "Output files:"
|
||||||
|
echo " - verification/smoke-test-report.json"
|
||||||
|
echo " - verification/evidence-report.json"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Show evidence report summary if jq available
|
||||||
|
if command -v jq &>/dev/null; then
|
||||||
|
echo "Evidence Report Summary:"
|
||||||
|
jq '.summary' verification/evidence-report.json 2>/dev/null || true
|
||||||
|
echo ""
|
||||||
|
echo "CI Pipeline Checklist:"
|
||||||
|
jq -r '.ci_pipeline_checklist[] | " [\(.status)] \(.description)"' verification/evidence-report.json 2>/dev/null || true
|
||||||
|
echo ""
|
||||||
|
echo "Operational Risks Checklist:"
|
||||||
|
jq -r '.operational_risks_checklist[] | " [\(.status)] \(.description)"' verification/evidence-report.json 2>/dev/null || true
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Exit with appropriate code
|
||||||
|
exit $((SMOKE_EXIT || EVIDENCE_EXIT))
|
||||||
259
verification/smoke-test.sh
Normal file
259
verification/smoke-test.sh
Normal file
|
|
@ -0,0 +1,259 @@
|
||||||
|
#!/bin/bash
|
||||||
|
# Smoke Test Script for Runtime Role Matrix
|
||||||
|
# Validates: Compilation, Unit Tests, CI Pipeline, Operational Risks
|
||||||
|
|
||||||
|
REPORT_FILE="verification/smoke-test-report.json"
|
||||||
|
|
||||||
|
echo "=== Runtime Role Matrix Smoke Test ==="
|
||||||
|
echo "Timestamp: $(date -Iseconds)"
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Initialize results array
|
||||||
|
declare -a RESULTS=()
|
||||||
|
|
||||||
|
# Test result helper
|
||||||
|
add_result() {
|
||||||
|
local test_name="$1"
|
||||||
|
local status="$2"
|
||||||
|
local message="$3"
|
||||||
|
RESULTS+=("{\"test\": \"$test_name\", \"status\": \"$status\", \"message\": \"$message\"}")
|
||||||
|
}
|
||||||
|
|
||||||
|
# CI Pipeline Stage Verification (4 items)
|
||||||
|
test_ci_pipeline() {
|
||||||
|
echo "--- CI Pipeline Stage Verification ---"
|
||||||
|
|
||||||
|
# 1. Build stage
|
||||||
|
if [ -f "pom.xml" ] || [ -f "build.gradle" ]; then
|
||||||
|
add_result "ci_build_stage" "PASS" "Build configuration exists"
|
||||||
|
else
|
||||||
|
add_result "ci_build_stage" "FAIL" "No build configuration found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2. Test stage
|
||||||
|
if [ -f "pom.xml" ] && grep -q "<artifactId>maven-surefire-plugin</artifactId>" pom.xml 2>/dev/null; then
|
||||||
|
add_result "ci_test_stage" "PASS" "Test stage configured"
|
||||||
|
elif [ -f "build.gradle" ] && grep -q "test" build.gradle 2>/dev/null; then
|
||||||
|
add_result "ci_test_stage" "PASS" "Test stage configured"
|
||||||
|
else
|
||||||
|
add_result "ci_test_stage" "WARN" "Test stage configuration unclear"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3. Package stage
|
||||||
|
if [ -f "pom.xml" ] && grep -q "<packaging>jar</packaging>" pom.xml 2>/dev/null; then
|
||||||
|
add_result "ci_package_stage" "PASS" "Package stage configured"
|
||||||
|
else
|
||||||
|
add_result "ci_package_stage" "WARN" "Package stage configuration unclear"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 4. Deploy stage
|
||||||
|
if [ -f ".github/workflows" ] || [ -f ".gitlab-ci.yml" ] || [ -f "Jenkinsfile" ]; then
|
||||||
|
add_result "ci_deploy_stage" "PASS" "CI/CD pipeline detected"
|
||||||
|
else
|
||||||
|
add_result "ci_deploy_stage" "WARN" "No CI/CD pipeline configuration found"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Operational Risk Checks (9 items)
|
||||||
|
test_operational_risks() {
|
||||||
|
echo "--- Operational Risk Verification ---"
|
||||||
|
|
||||||
|
# 1. Deployment Strategy
|
||||||
|
if [ -f "deployment.yaml" ] || [ -f "docker-compose.yml" ] || [ -f "helm/" ]; then
|
||||||
|
add_result "risk_deployment_strategy" "PASS" "Deployment configuration exists"
|
||||||
|
else
|
||||||
|
add_result "risk_deployment_strategy" "WARN" "No explicit deployment strategy found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 2. Monitoring
|
||||||
|
if [ -f "monitoring/prometheus.yml" ] || [ -f "monitoring/grafana.json" ] || grep -rq "prometheus\|grafana\|metrics" . 2>/dev/null; then
|
||||||
|
add_result "risk_monitoring" "PASS" "Monitoring configuration detected"
|
||||||
|
else
|
||||||
|
add_result "risk_monitoring" "WARN" "No monitoring configuration found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 3. Backup
|
||||||
|
if grep -rq "backup\|restore" . 2>/dev/null; then
|
||||||
|
add_result "risk_backup" "PASS" "Backup mechanism referenced"
|
||||||
|
else
|
||||||
|
add_result "risk_backup" "WARN" "No backup mechanism documented"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 4. Secret Management
|
||||||
|
if [ -f ".env.example" ] || [ -f "secrets.yaml" ] || grep -rq "vault\|secretsmanager\|k8s-secret" . 2>/dev/null; then
|
||||||
|
add_result "risk_secret_management" "PASS" "Secret management approach detected"
|
||||||
|
else
|
||||||
|
add_result "risk_secret_management" "WARN" "No secret management configuration found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 5. Health Check
|
||||||
|
if grep -rq "health\|liveness\|readiness" . 2>/dev/null; then
|
||||||
|
add_result "risk_health_check" "PASS" "Health check endpoints defined"
|
||||||
|
else
|
||||||
|
add_result "risk_health_check" "WARN" "No health check configuration found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 6. Logging
|
||||||
|
if grep -rq "logging\|logback\|log4j\|slf4j" . 2>/dev/null; then
|
||||||
|
add_result "risk_logging" "PASS" "Logging framework configured"
|
||||||
|
else
|
||||||
|
add_result "risk_logging" "WARN" "No logging configuration found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 7. Error Handling
|
||||||
|
if grep -rq "exception\|error\|try-catch" . 2>/dev/null; then
|
||||||
|
add_result "risk_error_handling" "PASS" "Error handling patterns detected"
|
||||||
|
else
|
||||||
|
add_result "risk_error_handling" "WARN" "No explicit error handling found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 8. Rollback Strategy
|
||||||
|
if grep -rq "rollback\|revert\|undo" . 2>/dev/null; then
|
||||||
|
add_result "risk_rollback" "PASS" "Rollback strategy documented"
|
||||||
|
else
|
||||||
|
add_result "risk_rollback" "WARN" "No rollback strategy found"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 9. Graceful Shutdown
|
||||||
|
if grep -rq "shutdown\|terminate\|destroy\|@PreDestroy" . 2>/dev/null; then
|
||||||
|
add_result "risk_graceful_shutdown" "PASS" "Graceful shutdown handling detected"
|
||||||
|
else
|
||||||
|
add_result "risk_graceful_shutdown" "WARN" "No graceful shutdown handling found"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Core Functionality Tests
|
||||||
|
test_compilation() {
|
||||||
|
echo "--- Test: Compilation ---"
|
||||||
|
if [ -f "pom.xml" ]; then
|
||||||
|
if command -v mvn &>/dev/null; then
|
||||||
|
mvn compile -q 2>/dev/null && add_result "compilation" "PASS" "Maven compilation successful" || add_result "compilation" "FAIL" "Maven compilation failed"
|
||||||
|
else
|
||||||
|
add_result "compilation" "SKIP" "Maven not installed"
|
||||||
|
fi
|
||||||
|
elif [ -f "build.gradle" ]; then
|
||||||
|
if command -v gradle &>/dev/null; then
|
||||||
|
gradle compileJava -q 2>/dev/null && add_result "compilation" "PASS" "Gradle compilation successful" || add_result "compilation" "FAIL" "Gradle compilation failed"
|
||||||
|
else
|
||||||
|
add_result "compilation" "SKIP" "Gradle not installed"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
add_result "compilation" "WARN" "No build configuration found"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
test_unit_tests() {
|
||||||
|
echo "--- Test: Unit Tests ---"
|
||||||
|
if [ -f "pom.xml" ]; then
|
||||||
|
if command -v mvn &>/dev/null; then
|
||||||
|
mvn test -q 2>/dev/null && add_result "unit_tests" "PASS" "Unit tests passed" || add_result "unit_tests" "FAIL" "Unit tests failed"
|
||||||
|
else
|
||||||
|
add_result "unit_tests" "SKIP" "Maven not installed"
|
||||||
|
fi
|
||||||
|
elif [ -f "build.gradle" ]; then
|
||||||
|
if command -v gradle &>/dev/null; then
|
||||||
|
gradle test -q 2>/dev/null && add_result "unit_tests" "PASS" "Unit tests passed" || add_result "unit_tests" "FAIL" "Unit tests failed"
|
||||||
|
else
|
||||||
|
add_result "unit_tests" "SKIP" "Gradle not installed"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
add_result "unit_tests" "WARN" "No build configuration found"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
test_role_matrix() {
|
||||||
|
echo "--- Test: Role Matrix Implementation ---"
|
||||||
|
if [ -d "src/main/java" ]; then
|
||||||
|
if grep -rq "Role\|Permission\|Principal" src/main/java 2>/dev/null; then
|
||||||
|
add_result "role_matrix_impl" "PASS" "Role matrix classes detected"
|
||||||
|
else
|
||||||
|
add_result "role_matrix_impl" "WARN" "Role matrix implementation unclear"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
add_result "role_matrix_impl" "WARN" "Source directory not found"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
test_runtime_integration() {
|
||||||
|
echo "--- Test: Runtime Integration ---"
|
||||||
|
if grep -rq "runtime\|dynamic\|reflection" . 2>/dev/null; then
|
||||||
|
add_result "runtime_integration" "PASS" "Runtime integration patterns detected"
|
||||||
|
else
|
||||||
|
add_result "runtime_integration" "WARN" "Runtime integration patterns not found"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Run all tests (without set -e to allow WARN/SKIP handling)
|
||||||
|
test_ci_pipeline
|
||||||
|
test_operational_risks
|
||||||
|
test_compilation
|
||||||
|
test_unit_tests
|
||||||
|
test_role_matrix
|
||||||
|
test_runtime_integration
|
||||||
|
|
||||||
|
# Generate JSON report
|
||||||
|
echo ""
|
||||||
|
echo "=== Generating Report ==="
|
||||||
|
|
||||||
|
cat > "$REPORT_FILE" << 'EOF'
|
||||||
|
{
|
||||||
|
"timestamp": "__TIMESTAMP__",
|
||||||
|
"summary": {
|
||||||
|
"total": 0,
|
||||||
|
"passed": 0,
|
||||||
|
"failed": 0,
|
||||||
|
"warned": 0,
|
||||||
|
"skipped": 0
|
||||||
|
},
|
||||||
|
"results": []
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Build results JSON array
|
||||||
|
RESULTS_JSON="["
|
||||||
|
first=true
|
||||||
|
for r in "${RESULTS[@]}"; do
|
||||||
|
if [ "$first" = true ]; then
|
||||||
|
first=false
|
||||||
|
else
|
||||||
|
RESULTS_JSON+=", "
|
||||||
|
fi
|
||||||
|
RESULTS_JSON+="$r"
|
||||||
|
done
|
||||||
|
RESULTS_JSON+="]"
|
||||||
|
|
||||||
|
# Update report with results
|
||||||
|
REPORT_CONTENT=$(cat "$REPORT_FILE")
|
||||||
|
REPORT_CONTENT=$(echo "$REPORT_CONTENT" | sed "s/__TIMESTAMP__/$(date -Iseconds)/")
|
||||||
|
REPORT_CONTENT=$(echo "$REPORT_CONTENT" | jq --argjson results "$RESULTS_JSON" '.results = $results')
|
||||||
|
|
||||||
|
# Calculate summary
|
||||||
|
TOTAL=$(echo "$RESULTS_JSON" | jq 'length')
|
||||||
|
PASSED=$(echo "$RESULTS_JSON" | jq '[.[] | select(.status == "PASS")] | length')
|
||||||
|
FAILED=$(echo "$RESULTS_JSON" | jq '[.[] | select(.status == "FAIL")] | length')
|
||||||
|
WARNED=$(echo "$RESULTS_JSON" | jq '[.[] | select(.status == "WARN")] | length')
|
||||||
|
SKIPPED=$(echo "$RESULTS_JSON" | jq '[.[] | select(.status == "SKIP")] | length')
|
||||||
|
|
||||||
|
REPORT_CONTENT=$(echo "$REPORT_CONTENT" | jq \
|
||||||
|
--argjson total "$TOTAL" \
|
||||||
|
--argjson passed "$PASSED" \
|
||||||
|
--argjson failed "$FAILED" \
|
||||||
|
--argjson warned "$WARNED" \
|
||||||
|
--argjson skipped "$SKIPPED" \
|
||||||
|
'.summary = {"total": $total, "passed": $passed, "failed": $failed, "warned": $warned, "skipped": $skipped}')
|
||||||
|
|
||||||
|
echo "$REPORT_CONTENT" > "$REPORT_FILE"
|
||||||
|
|
||||||
|
# Print summary
|
||||||
|
echo ""
|
||||||
|
echo "=== Test Summary ==="
|
||||||
|
echo "Total: $TOTAL"
|
||||||
|
echo "Passed: $PASSED"
|
||||||
|
echo "Failed: $FAILED"
|
||||||
|
echo "Warnings: $WARNED"
|
||||||
|
echo "Skipped: $SKIPPED"
|
||||||
|
echo ""
|
||||||
|
echo "Report saved to: $REPORT_FILE"
|
||||||
|
|
||||||
|
# Exit with appropriate code
|
||||||
|
exit 0
|
||||||
Loading…
Add table
Add a link
Reference in a new issue