From 4a38216fb030f84c21cfdbd421642ec7724fb4d2 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Fri, 17 Jul 2026 20:41:03 +0800 Subject: [PATCH] =?UTF-8?q?fix(ci):=20=E4=BF=AE=E5=A4=8DCI=E7=8A=B6?= =?UTF-8?q?=E6=80=81=E6=A3=80=E6=9F=A5=E8=AF=AF=E5=88=A4=E5=AF=BC=E8=87=B4?= =?UTF-8?q?=E6=8F=90=E5=89=8D=E5=90=88=E5=B9=B6=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - check_ci_status.py: 找不到context时返回pending而非success (找不到=CI还没启动,应该等待;真跳过的会有skipped状态) - auto-merge.yml: 405时不立即退出,改为重试多轮后才放弃 (405可能是CI状态同步延迟,不是真的合并失败) - auto-merge.yml + auto-approve.yml: 增加30秒初始等待 (避免tar.gz checkout太快,CI还没写第一个status就检查) --- .gitea/workflows/auto-approve.yml | 4 ++++ .gitea/workflows/auto-merge.yml | 35 ++++++++++++++++++++++++------- scripts/check_ci_status.py | 5 +++-- 3 files changed, 35 insertions(+), 9 deletions(-) mode change 100644 => 100755 .gitea/workflows/auto-approve.yml mode change 100644 => 100755 .gitea/workflows/auto-merge.yml mode change 100644 => 100755 scripts/check_ci_status.py diff --git a/.gitea/workflows/auto-approve.yml b/.gitea/workflows/auto-approve.yml old mode 100644 new mode 100755 index 16533c602..bd6916f0b --- a/.gitea/workflows/auto-approve.yml +++ b/.gitea/workflows/auto-approve.yml @@ -62,6 +62,10 @@ jobs: done echo + # 初始等待30秒,给CI启动写status的时间,避免checkout太快导致全找不到context误判 + echo "等待30秒让CI启动..." + sleep 30 + # 轮询等待,最多20分钟(120次x10秒) for attempt in $(seq 1 120); do ALL_SUCCESS=true diff --git a/.gitea/workflows/auto-merge.yml b/.gitea/workflows/auto-merge.yml old mode 100644 new mode 100755 index d7214a570..caa762850 --- a/.gitea/workflows/auto-merge.yml +++ b/.gitea/workflows/auto-merge.yml @@ -60,10 +60,19 @@ jobs: fi echo + # 初始等待30秒,给CI启动写status的时间,避免checkout太快导致全找不到context误判 + echo "等待30秒让CI启动..." + sleep 30 + + # 405连续计数器:连续多次合并返回405才放弃 + MERGE_405_COUNT=0 + MAX_405_RETRIES=6 + # 轮询等待,最多30分钟(180次x10秒) for attempt in $(seq 1 180); do ALL_SUCCESS=true ANY_FAILED=false + ANY_PENDING=false echo "--- 第${attempt}次检查 ($(date '+%H:%M:%S')) ---" @@ -77,6 +86,9 @@ jobs: if [ "$STATE" = "failure" ] || [ "$STATE" = "error" ]; then ANY_FAILED=true fi + if [ "$STATE" = "pending" ]; then + ANY_PENDING=true + fi done # 检查审批状态 @@ -116,13 +128,19 @@ jobs: echo "自动合并成功" exit 0 elif [ "$HTTP_CODE" = "405" ]; then - echo "合并失败(405),可能有冲突或门禁未通过" - curl -s -X POST \ - -H "Authorization: token ${MERGE_TOKEN}" \ - -H "Content-Type: application/json" \ - -d '{"body": "Auto merge failed: PR may have conflicts or unresolved checks. Please review manually."}' \ - "${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/issues/${PR_NUMBER}/comments" > /dev/null 2>&1 || true - exit 0 + MERGE_405_COUNT=$((MERGE_405_COUNT + 1)) + echo "⚠️ 合并返回405(第${MERGE_405_COUNT}次),可能CI状态尚未同步或有未解决的门禁,继续等待重试..." + cat /tmp/merge_resp.json 2>/dev/null || true + echo + if [ "$MERGE_405_COUNT" -ge "$MAX_405_RETRIES" ]; then + echo "❌ 连续${MAX_405_RETRIES}次合并返回405,放弃自动合并" + curl -s -X POST \ + -H "Authorization: token ${MERGE_TOKEN}" \ + -H "Content-Type: application/json" \ + -d '{"body": "Auto merge failed after multiple 405 errors: PR may have conflicts or unresolved checks. Please review manually."}' \ + "${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/issues/${PR_NUMBER}/comments" > /dev/null 2>&1 || true + exit 1 + fi else echo "自动合并失败 (HTTP $HTTP_CODE)" cat /tmp/merge_resp.json 2>/dev/null || true @@ -133,6 +151,9 @@ jobs: "${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/issues/${PR_NUMBER}/comments" > /dev/null 2>&1 || true exit 1 fi + else + # 本轮不满足合并条件,重置405计数器 + MERGE_405_COUNT=0 fi if [ "$ANY_FAILED" = "true" ]; then diff --git a/scripts/check_ci_status.py b/scripts/check_ci_status.py old mode 100644 new mode 100755 index 13b82ede0..603071d50 --- a/scripts/check_ci_status.py +++ b/scripts/check_ci_status.py @@ -42,8 +42,9 @@ def main(): print(status) return - # 找不到这个context也视为通过(该workflow没触发=不需要检查) - print("success") + # 找不到这个context说明CI还没开始写状态,返回pending继续等待 + # (如果workflow真的被跳过,它会有一条status为skipped的记录) + print("pending") if __name__ == "__main__": -- 2.54.0