8c0c34300f
P1修复(2026-08-30 CI巡检实证): Gitea 1.26.4 调度器bug:被 concurrency cancel 的 run,其 job 会在数小时后 被复活重跑(attempt=2)。实测 42597 号 run 18:46 被取消,21:46 复活, 与正常流水线并行烧了1.5小时 runner(Validate+UnitTests+staging构建全套), 合并高峰双流水线CPU超卖导致单测 14分→30分。 改动: 1. 新增 scripts/ci/ci_run_selfcheck.sh:job 启动第一步实时查本 run 状态, 若 conclusion 为 cancelled/skipped(被复活的僵尸job)立即退出(exit 78), API 故障时不阻断(unknown 照常执行) 2. ci-pipeline.yml 12 个重量级 job(validate×3、unit/integration/frontend×2、 build-pr/build-staging/staging-e2e/api-tests/build-production)首步插入自检 3. dedupe-check 情形2增强:同一 head_sha 的 push 流水线不只是在跑时去重, 已 success 完成时 PR 侧测试同样跳过(消除竞态窗口双跑)
35 lines
1.8 KiB
Bash
Executable File
35 lines
1.8 KiB
Bash
Executable File
#!/bin/bash
|
||
# CI job 运行前自检 —— 防 Gitea 1.26 调度 bug:
|
||
# 被 concurrency cancel 的 run,其已派发的 job 可能在数小时后被调度器复活重跑
|
||
# (2026-08-30 实测:18:46 取消的 run,21:46 复活 attempt=2,与正常流水线抢 runner 1.5 小时)。
|
||
# job 启动第一步先实时查本 run 状态,若已终结(cancelled/skipped),容器立即退出不烧资源。
|
||
#
|
||
# 用法:在重量级 job(Validate/Unit Tests/Integration/Frontend/Build/E2E 类)的
|
||
# 首个 step 中加入:bash scripts/ci/ci_run_selfcheck.sh
|
||
set -u
|
||
|
||
echo "▶ CI 运行前自检(僵尸 run 复活防护)..."
|
||
|
||
if [ -z "${GITHUB_API_URL:-}" ] || [ -z "${GITHUB_REPOSITORY:-}" ] || [ -z "${GITHUB_TOKEN:-}" ] || [ -z "${GITHUB_RUN_ID:-}" ]; then
|
||
echo "⚠️ 缺少 GITHUB_* 环境变量(GITHUB_RUN_ID/GITHUB_TOKEN),跳过自检(不阻断)"
|
||
exit 0
|
||
fi
|
||
|
||
CONCLUSION=$(curl -sf -H "Authorization: token ${GITHUB_TOKEN}" --max-time 10 \
|
||
"${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID}" 2>/dev/null \
|
||
| python3 -c "import json,sys; print(json.load(sys.stdin).get('conclusion') or 'running')" 2>/dev/null || echo "unknown")
|
||
|
||
case "${CONCLUSION}" in
|
||
cancelled|skipped)
|
||
echo "::error::本 run(${GITHUB_RUN_ID}) 状态已为 ${CONCLUSION},却仍被调度器派发执行——判定为 Gitea 复活的僵尸 job,立即退出,不再占用 runner"
|
||
exit 78 # EX_CONFIG:非零退出让调度器知晓该 job 终结(避免被当成功空跑)
|
||
;;
|
||
running|unknown|"")
|
||
# unknown 时不阻断(API 临时故障),正常执行
|
||
echo "✅ run ${GITHUB_RUN_ID} 状态正常(${CONCLUSION:-running}),继续执行"
|
||
;;
|
||
*)
|
||
echo "✅ run ${GITHUB_RUN_ID} 结论=${CONCLUSION}(已终结但非取消),继续执行"
|
||
;;
|
||
esac
|