diff --git a/skills/gitlink-quality-gate/scripts/03-ci-check.sh b/skills/gitlink-quality-gate/scripts/03-ci-check.sh index 7868e2b..71659d2 100644 --- a/skills/gitlink-quality-gate/scripts/03-ci-check.sh +++ b/skills/gitlink-quality-gate/scripts/03-ci-check.sh @@ -1,7 +1,7 @@ #!/bin/bash # ================================================================ # Phase 3: CI 状态检查 -# 功能:检查 PR 关联的 CI 构建状态 +# 功能:检查 PR 关联的 CI 构建状态(尝试多个端点) # 使用:bash 03-ci-check.sh # ================================================================ 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 "[========================================]" diff --git a/skills/gitlink-quality-gate/scripts/04-quality-gate-decision.sh b/skills/gitlink-quality-gate/scripts/04-quality-gate-decision.sh index ecb52c0..18e84cb 100644 --- a/skills/gitlink-quality-gate/scripts/04-quality-gate-decision.sh +++ b/skills/gitlink-quality-gate/scripts/04-quality-gate-decision.sh @@ -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 ≥ $THRESHOLD,CI 通过" + echo " 评分 $QUALITY_SCORE ≥ $THRESHOLD,CI $CI_STATUS_TEXT" if [ "$DRY_RUN" = "true" ]; then echo ""