fix(awooop): route ci notifications through event mirror
Some checks failed
Code Review / ai-code-review (push) Successful in 14s
CD Pipeline / tests (push) Successful in 1m18s
CD Pipeline / post-deploy-checks (push) Has been cancelled
CD Pipeline / build-and-deploy (push) Has been cancelled

This commit is contained in:
Your Name
2026-05-12 13:58:08 +08:00
parent d356cd32fc
commit ad8ead2546
11 changed files with 461 additions and 59 deletions

100
scripts/ci/notify-awoooi-cicd.sh Executable file
View File

@@ -0,0 +1,100 @@
#!/usr/bin/env bash
# 2026-05-12 Codex: CI/CD 通知先走 AWOOI Alertmanager 入口,讓 TelegramGateway
# 鏡像出站訊息到 AwoooP呼叫端保留直接 Telegram fallback。
set -euo pipefail
API_BASE="${AWOOOI_API_URL:-http://192.168.0.125:32334}"
ALERTMANAGER_URL="${AWOOOI_ALERTMANAGER_URL:-${API_BASE%/}/api/v1/webhooks/alertmanager}"
JOB_NAME="${AWOOI_CICD_JOB_NAME:-${AWOOOI_CICD_JOB_NAME:-CI/CD Pipeline}}"
STATUS_RAW="${AWOOI_CICD_STATUS:-${AWOOOI_CICD_STATUS:-running}}"
STAGE="${AWOOI_CICD_STAGE:-${AWOOOI_CICD_STAGE:-ci}}"
COMMIT_SHA="${AWOOI_CICD_COMMIT_SHA:-${AWOOOI_CICD_COMMIT_SHA:-${GITHUB_SHA:-}}}"
TRIGGERED_BY="${AWOOI_CICD_TRIGGERED_BY:-${AWOOOI_CICD_TRIGGERED_BY:-${GITHUB_ACTOR:-CI}}}"
WORKFLOW_URL="${AWOOI_CICD_WORKFLOW_URL:-${AWOOOI_CICD_WORKFLOW_URL:-http://192.168.0.110:3001/wooo/awoooi/actions}}"
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"
from __future__ import annotations
import datetime as dt
import json
import os
import re
status = (os.environ.get("STATUS_RAW") or "running").strip().lower()
if status not in {"running", "success", "failed", "pending"}:
status = "running"
severity = "info"
if status == "failed":
severity = "critical"
elif status == "pending":
severity = "warning"
stage = (os.environ.get("STAGE") or "ci").strip()[:40]
safe_stage = re.sub(r"[^A-Za-z0-9_]+", "_", stage).strip("_") or "ci"
alertname = f"CI_{safe_stage}_{status}"
payload = {
"version": "4",
"status": "firing",
"receiver": "awoooi-cicd",
"groupLabels": {"alertname": alertname},
"commonLabels": {"alertname": alertname, "severity": severity},
"commonAnnotations": {},
"externalURL": os.environ.get("WORKFLOW_URL", ""),
"alerts": [
{
"status": "firing",
"labels": {
"alertname": alertname,
"severity": severity,
"stage": stage,
"status": status,
"commit": os.environ.get("COMMIT_SHA", ""),
"triggered_by": os.environ.get("TRIGGERED_BY", "CI"),
"duration_seconds": os.environ.get("DURATION_SECONDS", "0"),
},
"annotations": {
"summary": os.environ.get("JOB_NAME", "CI/CD Pipeline"),
"description": os.environ.get("SUMMARY", ""),
"workflow_url": os.environ.get("WORKFLOW_URL", ""),
},
"startsAt": dt.datetime.now(dt.timezone.utc).isoformat().replace("+00:00", "Z"),
}
],
}
print(json.dumps(payload, ensure_ascii=False))
PY
if [ "${AWOOI_CICD_DRY_RUN:-${AWOOOI_CICD_DRY_RUN:-0}}" = "1" ]; then
cat "$payload_file"
exit 0
fi
curl -fsS \
--connect-timeout "${AWOOI_CICD_CONNECT_TIMEOUT:-5}" \
--max-time "${AWOOI_CICD_MAX_TIME:-12}" \
-H "Content-Type: application/json" \
--data-binary "@${payload_file}" \
"$ALERTMANAGER_URL" >/dev/null
echo "AwoooP-mirrored CI/CD notification sent via ${ALERTMANAGER_URL}"