fix: CI 状态检测改为读取状态文件,不再硬编码为通过

This commit is contained in:
赵昌 2026-07-07 17:03:14 +08:00
parent 3a1565422c
commit 40609fa0f8
2 changed files with 67 additions and 24 deletions

View File

@ -1,7 +1,7 @@
#!/bin/bash
# ================================================================
# Phase 3: CI 状态检查
# 功能:检查 PR 关联的 CI 构建状态
# 功能:检查 PR 关联的 CI 构建状态(尝试多个端点)
# 使用bash 03-ci-check.sh <owner> <repo> <pr_id>
# ================================================================
set -e
@ -18,31 +18,59 @@ echo "[ Phase 3: CI 状态检查 ]"
echo "[ PR #$PR_ID ($OWNER/$REPO) ]"
echo "[========================================]"
# Step 1: 获取 CI 构建列表
echo "[INFO] 获取 CI 构建列表..."
BUILDS=$(gitlink-cli ci +builds --owner "$OWNER" --repo "$REPO" --format json 2>&1) || {
echo "[WARN] 获取构建列表失败: $BUILDS"
BUILDS='{"data":[]}'
}
echo "$BUILDS" > "$OUTPUT_DIR/ci-builds.json"
CI_PASSING="unknown"
CI_DETAIL=""
# Step 2: 获取 CI 运行记录
echo "[INFO] 获取 CI 运行记录..."
RUNS=$(gitlink-cli ci +runs --owner "$OWNER" --repo "$REPO" --format json 2>&1) || {
echo "[WARN] 获取运行记录失败(可能不支持): $RUNS"
RUNS='{"data":[]}'
}
echo "$RUNS" > "$OUTPUT_DIR/ci-runs.json"
# 尝试方法1: ci +builds
echo "[INFO] 尝试 ci +builds..."
BUILDS=$(gitlink-cli ci +builds --owner "$OWNER" --repo "$REPO" --format json 2>&1) || BUILDS=""
if [ -n "$BUILDS" ]; then
echo "$BUILDS" > "$OUTPUT_DIR/ci-builds.json"
# AI Agent 在此解析 builds 数据
fi
# Step 3: AI 分析 CI 状态
echo "[INFO] AI 分析 CI 状态中..."
echo "[INFO] 检查PR 分支关联的最新构建状态"
# 尝试方法2: ci +runs
echo "[INFO] 尝试 ci +runs..."
RUNS=$(gitlink-cli ci +runs --owner "$OWNER" --repo "$REPO" --format json 2>&1) || RUNS=""
if [ -n "$RUNS" ]; then
echo "$RUNS" > "$OUTPUT_DIR/ci-runs.json"
# 检查是否有 running 或成功的 run
RUN_STATUS=$(echo "$RUNS" | node -e "
let s='';
process.stdin.on('data',d=>s+=d).on('end',()=>{
try {
const d=JSON.parse(s).data||{};
const runs=d.runs||[];
if(runs.length===0){process.stdout.write('unknown');return;}
const hasRunning=runs.some(r=>r.status==='running'||r.status==='pending');
const hasSuccess=runs.some(r=>r.status==='success');
const hasFail=runs.some(r=>r.status==='fail'||r.status==='error');
if(hasRunning)process.stdout.write('running');
else if(hasSuccess&&!hasFail)process.stdout.write('passing');
else if(hasFail)process.stdout.write('failing');
else process.stdout.write('unknown');
}catch(e){process.stdout.write('unknown');}
});
" 2>/dev/null || echo "unknown")
CI_PASSING="$RUN_STATUS"
CI_DETAIL="ci +runs 返回 ${RUN_STATUS}"
fi
# AI Agent 在此处解析 CI 数据,判断是否全部通过
# 输出CI 状态布尔值、详细信息
# 如果所有方法都失败
if [ "$CI_PASSING" = "unknown" ]; then
echo "[WARN] 无法获取 CI 状态API 可能不支持该仓库)"
CI_DETAIL="未检测到 CI 配置或 API 不可用"
fi
# 写入状态文件供 Phase 4 读取
echo "$CI_PASSING" > "$OUTPUT_DIR/ci-status-$PR_ID.txt"
echo "$CI_DETAIL" > "$OUTPUT_DIR/ci-detail-$PR_ID.txt"
echo "[INFO] CI 状态: $CI_PASSING"
echo "[INFO] $CI_DETAIL"
echo ""
echo "[========================================]"
echo "[ Phase 3 完成 ]"
echo "[ CI 数据: $OUTPUT_DIR/ci-builds.json ]"
echo "[ CI 状态: $CI_PASSING ]"
echo "[========================================]"

View File

@ -40,15 +40,30 @@ echo " 评分模型: 总分 = CodeReview×40% + CI×30% + 设计一致性×30%"
echo " 门槛: ≥ 70 分且 CI 通过 → 自动合并"
echo ""
# 读取 CI 状态文件(由 03-ci-check.sh 生成)
CI_FILE="$OUTPUT_DIR/ci-status-$PR_ID.txt"
CI_STATUS_TEXT="unknown"
if [ -f "$CI_FILE" ]; then
CI_STATUS_TEXT=$(cat "$CI_FILE")
fi
# 占位评分AI 在实际运行时计算填充)
CODE_REVIEW_SCORE=85
CI_STATUS=100
DESIGN_SCORE=80
# CI 状态映射
case "$CI_STATUS_TEXT" in
passing) CI_STATUS=100; CI_PASSING=true; CI_LABEL="✅ 通过" ;;
running) CI_STATUS=50; CI_PASSING=false; CI_LABEL="⏳ 运行中" ;;
failing) CI_STATUS=0; CI_PASSING=false; CI_LABEL="❌ 失败" ;;
*) CI_STATUS=0; CI_PASSING=false; CI_LABEL="⚠️ 未知(未检测到 CI" ;;
esac
QUALITY_SCORE=$(( CODE_REVIEW_SCORE * 40 / 100 + CI_STATUS * 30 / 100 + DESIGN_SCORE * 30 / 100 ))
CI_PASSING=true
echo " CodeReview 评分: $CODE_REVIEW_SCORE/100"
echo " CI 状态: $CI_STATUS/100 ($([ "$CI_PASSING" = "true" ] && echo "✅ 通过" || echo "❌ 失败"))"
echo " CI 状态: $CI_STATUS_TEXT ($CI_LABEL)"
echo " 设计一致性: $DESIGN_SCORE/100"
echo " 质量总分: $QUALITY_SCORE/100"
echo ""
@ -58,7 +73,7 @@ THRESHOLD=70
if [ "$QUALITY_SCORE" -ge "$THRESHOLD" ] && [ "$CI_PASSING" = "true" ]; then
echo "✅ 门禁判定:通过"
echo " 评分 $QUALITY_SCORE$THRESHOLDCI 通过"
echo " 评分 $QUALITY_SCORE$THRESHOLDCI $CI_STATUS_TEXT"
if [ "$DRY_RUN" = "true" ]; then
echo ""