diff --git a/scripts/ci/notify-awoooi-cicd.sh b/scripts/ci/notify-awoooi-cicd.sh index 58869c55..22b349bc 100755 --- a/scripts/ci/notify-awoooi-cicd.sh +++ b/scripts/ci/notify-awoooi-cicd.sh @@ -15,23 +15,20 @@ WORKFLOW_URL="${AWOOI_CICD_WORKFLOW_URL:-${AWOOOI_CICD_WORKFLOW_URL:-http://192. DURATION_SECONDS="${AWOOI_CICD_DURATION_SECONDS:-${AWOOOI_CICD_DURATION_SECONDS:-0}}" SUMMARY="${AWOOI_CICD_SUMMARY:-${AWOOOI_CICD_SUMMARY:-}}" -if ! command -v python3 >/dev/null 2>&1; then - echo "python3 missing; cannot build Alertmanager JSON payload" >&2 - exit 2 -fi - payload_file="$(mktemp)" trap 'rm -f "$payload_file"' EXIT -JOB_NAME="$JOB_NAME" \ -STATUS_RAW="$STATUS_RAW" \ -STAGE="$STAGE" \ -COMMIT_SHA="$COMMIT_SHA" \ -TRIGGERED_BY="$TRIGGERED_BY" \ -WORKFLOW_URL="$WORKFLOW_URL" \ -DURATION_SECONDS="$DURATION_SECONDS" \ -SUMMARY="$SUMMARY" \ -python3 - <<'PY' > "$payload_file" +export JOB_NAME +export STATUS_RAW +export STAGE +export COMMIT_SHA +export TRIGGERED_BY +export WORKFLOW_URL +export DURATION_SECONDS +export SUMMARY + +build_payload_with_python() { + python3 - <<'PY' from __future__ import annotations import datetime as dt @@ -84,6 +81,69 @@ payload = { } print(json.dumps(payload, ensure_ascii=False)) PY +} + +build_payload_with_node() { + node <<'JS' +const statusCandidates = new Set(["running", "success", "failed", "pending"]); +let status = (process.env.STATUS_RAW || "running").trim().toLowerCase(); +if (!statusCandidates.has(status)) { + status = "running"; +} + +let severity = "info"; +if (status === "failed") { + severity = "critical"; +} else if (status === "pending") { + severity = "warning"; +} + +const stage = (process.env.STAGE || "ci").trim().slice(0, 40); +const safeStage = stage.replace(/[^A-Za-z0-9_]+/g, "_").replace(/^_+|_+$/g, "") || "ci"; +const alertname = `CI_${safeStage}_${status}`; + +const payload = { + version: "4", + status: "firing", + receiver: "awoooi-cicd", + groupLabels: { alertname }, + commonLabels: { alertname, severity }, + commonAnnotations: {}, + externalURL: process.env.WORKFLOW_URL || "", + alerts: [ + { + status: "firing", + labels: { + alertname, + severity, + stage, + status, + commit: process.env.COMMIT_SHA || "", + triggered_by: process.env.TRIGGERED_BY || "CI", + duration_seconds: process.env.DURATION_SECONDS || "0", + }, + annotations: { + summary: process.env.JOB_NAME || "CI/CD Pipeline", + description: process.env.SUMMARY || "", + workflow_url: process.env.WORKFLOW_URL || "", + }, + startsAt: new Date().toISOString(), + }, + ], +}; + +process.stdout.write(JSON.stringify(payload)); +JS +} + +if command -v python3 >/dev/null 2>&1; then + build_payload_with_python > "$payload_file" +elif command -v node >/dev/null 2>&1; then + build_payload_with_node > "$payload_file" +else + echo "python3 and node missing; cannot build Alertmanager JSON payload" >&2 + exit 2 +fi if [ "${AWOOI_CICD_DRY_RUN:-${AWOOOI_CICD_DRY_RUN:-0}}" = "1" ]; then cat "$payload_file"