diff --git a/Jenkinsfile b/Jenkinsfile index c46c25b..70334bd 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -8,7 +8,7 @@ pipeline { parameters { booleanParam(name: 'PUSH_IMAGES', defaultValue: true, description: 'Push images to registry') - string(name: 'QUALITY_GATE_PUSHGATEWAY_URL', defaultValue: '', description: 'Optional Pushgateway base URL for quality gate metrics') + string(name: 'QUALITY_GATE_PUSHGATEWAY_URL', defaultValue: 'http://platform-quality-gateway.monitoring.svc.cluster.local:9091', description: 'Pushgateway base URL for quality gate metrics') string(name: 'REGISTRY_CREDENTIALS_ID', defaultValue: 'registry-bstein-dev', description: 'Jenkins credentials id for registry.bstein.dev') } diff --git a/scripts/ci/quality_gate.sh b/scripts/ci/quality_gate.sh index cf85600..d42a3f7 100755 --- a/scripts/ci/quality_gate.sh +++ b/scripts/ci/quality_gate.sh @@ -14,9 +14,61 @@ mkdir -p "${REPORT_DIR}" cat >"${METRICS_FILE}" <<'METRICS' # HELP platform_quality_gate_runs_total Number of quality gate runs by result. # TYPE platform_quality_gate_runs_total counter -platform_quality_gate_runs_total{suite="lesavka",status="fail"} 1 +platform_quality_gate_runs_total{suite="lesavka",status="ok"} 0 +platform_quality_gate_runs_total{suite="lesavka",status="failed"} 1 METRICS +fetch_remote_counter() { + local status="$1" + if [[ -z "${PUSHGATEWAY_URL}" ]]; then + echo 0 + return 0 + fi + + curl --silent --show-error --fail "${PUSHGATEWAY_URL%/}/metrics" 2>/dev/null | awk -v suite="lesavka" -v status="${status}" ' + /^platform_quality_gate_runs_total\{/ { + if (index($0, "job=\"platform-quality-ci\"") == 0) next + if (index($0, "suite=\"" suite "\"") == 0) next + if (index($0, "status=\"" status "\"") == 0) next + print int($2) + found = 1 + exit + } + END { + if (!found) print 0 + }' +} + +refresh_counter_metrics() { + local outcome status_line ok_count failed_count tmp_file + status_line="$(awk '/^platform_quality_gate_runs_total\{suite="lesavka"/ {print; exit}' "${METRICS_FILE}" 2>/dev/null || true)" + outcome="$(printf '%s' "${status_line}" | sed -n 's/.*status="\([^"]*\)".*/\1/p')" + [[ -n "${outcome}" ]] || outcome="failed" + + ok_count="$(fetch_remote_counter ok)" + failed_count="$(fetch_remote_counter failed)" + if [[ "${outcome}" == "ok" ]]; then + ok_count=$((ok_count + 1)) + else + failed_count=$((failed_count + 1)) + fi + + tmp_file="$(mktemp "${REPORT_DIR}/metrics.prom.XXXXXX")" + { + echo '# HELP platform_quality_gate_runs_total Number of quality gate runs by result.' + echo '# TYPE platform_quality_gate_runs_total counter' + echo "platform_quality_gate_runs_total{suite=\"lesavka\",status=\"ok\"} ${ok_count}" + echo "platform_quality_gate_runs_total{suite=\"lesavka\",status=\"failed\"} ${failed_count}" + awk ' + /^# HELP platform_quality_gate_runs_total / {next} + /^# TYPE platform_quality_gate_runs_total / {next} + /^platform_quality_gate_runs_total\{suite="lesavka"/ {next} + {print} + ' "${METRICS_FILE}" + } >"${tmp_file}" + mv "${tmp_file}" "${METRICS_FILE}" +} + publish_metrics() { if [[ -z "${PUSHGATEWAY_URL}" ]]; then echo "Skipping Pushgateway publish: QUALITY_GATE_PUSHGATEWAY_URL is not set" @@ -25,7 +77,7 @@ publish_metrics() { curl --fail --silent --show-error \ --data-binary @"${METRICS_FILE}" \ - "${PUSHGATEWAY_URL%/}/metrics/job/platform_quality_gate/suite/lesavka" + "${PUSHGATEWAY_URL%/}/metrics/job/platform-quality-ci/suite/lesavka" } status=0 @@ -94,7 +146,7 @@ over_500 = sum(1 for item in files if item['loc'] > 500) metrics = [] metrics.append('# HELP platform_quality_gate_runs_total Number of quality gate runs by result.') metrics.append('# TYPE platform_quality_gate_runs_total counter') -status_label = 'pass' if not regressions and not missing_from_baseline else 'fail' +status_label = 'ok' if not regressions and not missing_from_baseline else 'failed' metrics.append(f'platform_quality_gate_runs_total{{suite="lesavka",status="{status_label}"}} 1') metrics.append('# HELP platform_quality_gate_workspace_line_coverage_percent Workspace line coverage percent.') metrics.append('# TYPE platform_quality_gate_workspace_line_coverage_percent gauge') @@ -178,6 +230,7 @@ else fi publish_status=0 +refresh_counter_metrics if publish_metrics; then : else