stages:
- quality
- test
- build
- deploy
variables:
METRICS: "stubs,types,churn,comments,complexity,clippy"
RULES: "all"
BASELINE_COMMITS: "20"
INTERVAL: "5"
quality:monitor:
stage: quality
image: rust:latest
cache:
paths:
- target/
- .cargo/
before_script:
- rustc --version && cargo --version
- apt-get update && apt-get install -y jq || true
script:
- cargo build --release --bin affi
- |
set +e
./target/release/affi receipt monitor \
--watch . \
--metrics $METRICS \
--rules $RULES \
--baseline-commits $BASELINE_COMMITS \
--interval $INTERVAL \
--output stderr,json \
--format json \
> violations.json 2>&1
MONITOR_EXIT=$?
set -e
cat violations.json || echo "{}"
# Parse and check for CRITICAL violations
CRITICAL=$(jq '.violations | map(select(.severity == "CRITICAL")) | length' violations.json 2>/dev/null || echo 0)
TOTAL=$(jq '.violations | length' violations.json 2>/dev/null || echo 0)
echo ""
echo "Quality Monitor Results"
echo "======================"
echo "Total violations: $TOTAL"
echo "Critical violations: $CRITICAL"
echo ""
if [ "$CRITICAL" -gt 0 ]; then
echo "❌ Pipeline FAILED: $CRITICAL CRITICAL quality violations"
exit 1
else
echo "✓ Quality check passed"
exit 0
fi
artifacts:
name: "quality-violations-${CI_COMMIT_SHORT_SHA}"
paths:
- violations.json
reports:
dotenv: violations.json
expire_in: 30 days
when: always
allow_failure: false retry:
max: 2
when:
- runner_system_failure
- stuck_or_timeout_failure
only:
- merge_requests
- main
- develop
quality:gate:
stage: quality
image: alpine:latest
before_script:
- apk add --no-cache jq curl
script:
- |
if [ -f violations.json ]; then
CRITICAL=$(jq '.violations | map(select(.severity == "CRITICAL")) | length' violations.json 2>/dev/null || echo 0)
if [ "$CRITICAL" -gt 0 ]; then
echo "❌ Quality Gate Failed: $CRITICAL CRITICAL violations"
exit 1
fi
fi
dependencies:
- quality:monitor
only:
- merge_requests
allow_failure: false