fix(ci): build cicd notification payload without python
All checks were successful
Code Review / ai-code-review (push) Successful in 11s

This commit is contained in:
Your Name
2026-05-19 14:03:06 +08:00
parent 570b99e9fd
commit 170f927bc6

View File

@@ -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"