diff --git a/.gitea/workflows/ci-pipeline.yml b/.gitea/workflows/ci-pipeline.yml index 07d3d0223..e834fb87d 100755 --- a/.gitea/workflows/ci-pipeline.yml +++ b/.gitea/workflows/ci-pipeline.yml @@ -58,24 +58,56 @@ jobs: run: | set -eu PR_NUMBER=$(echo "$GITHUB_REF" | sed 's|refs/pull/||; s|/.*||') - API_URL="${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/pulls/${PR_NUMBER}/files?limit=300" - FILES=$(curl -s -H "Authorization: token ${GITHUB_TOKEN}" "$API_URL" | python3 -c "import sys,json; [print(f['filename']) for f in json.load(sys.stdin)]") - FRONTEND_COUNT=$(echo "$FILES" | grep -c '^apps/web/' || true) - BACKEND_COUNT=$(echo "$FILES" | grep -cv '^apps/web/' || true) - TOTAL=$(echo "$FILES" | grep -cv '^$' || true) - echo "变更文件: ${TOTAL} 个 (前端: ${FRONTEND_COUNT}, 后端/公共: ${BACKEND_COUNT})" - if [ "$BACKEND_COUNT" = "0" ] && [ "$FRONTEND_COUNT" -gt "0" ]; then + + # 分页获取所有变更文件(修复>300文件时漏判) + ALL_FILES="" + PAGE=1 + while true; do + API_URL="${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/pulls/${PR_NUMBER}/files?limit=300&page=${PAGE}" + PAGE_FILES=$(curl -s -H "Authorization: token ${GITHUB_TOKEN}" "$API_URL" | python3 -c "import sys,json; files=json.load(sys.stdin); [print(f['filename']) for f in files]; sys.exit(0 if len(files)==300 else 1)" 2>/dev/null || true) + PAGE_COUNT=$(echo "$PAGE_FILES" | wc -l) + if [ "$PAGE_COUNT" -lt 300 ]; then HAS_MORE=1; else HAS_MORE=0; fi + ALL_FILES="${ALL_FILES}${PAGE_FILES}"$'\n' + if [ "$HAS_MORE" != "0" ]; then + break + fi + PAGE=$((PAGE + 1)) + done + + FRONTEND_COUNT=$(echo "$ALL_FILES" | grep -c '^apps/web/' || true) + TOTAL=$(echo "$ALL_FILES" | grep -cv '^$' || true) + BACKEND_COUNT=$(( TOTAL - FRONTEND_COUNT )) + + # 基础设施文件:改了就强制全量CI(不跳过任何检查) + INFRA_COUNT=$(echo "$ALL_FILES" | grep -cE '^(infra/|Dockerfile|\.gitea/workflows/|scripts/ci/|docker/)' || true) + + echo "变更文件: ${TOTAL} 个 (前端: ${FRONTEND_COUNT}, 后端/公共: ${BACKEND_COUNT}, 基础设施: ${INFRA_COUNT})" + + # 判定是否纯前端/纯后端 + PURE_FRONTEND=false + PURE_BACKEND=false + if [ "$BACKEND_COUNT" = "0" ] && [ "$FRONTEND_COUNT" -gt "0" ] && [ "$INFRA_COUNT" = "0" ]; then + PURE_FRONTEND=true + elif [ "$FRONTEND_COUNT" = "0" ] && [ "$BACKEND_COUNT" -gt "0" ] && [ "$INFRA_COUNT" = "0" ]; then + PURE_BACKEND=true + fi + + if [ "$PURE_FRONTEND" = "true" ]; then echo "skip_backend=true" >> $GITHUB_OUTPUT echo "skip_frontend=false" >> $GITHUB_OUTPUT echo "✅ 纯前端改动,跳过后端检查" - elif [ "$FRONTEND_COUNT" = "0" ] && [ "$BACKEND_COUNT" -gt "0" ]; then + elif [ "$PURE_BACKEND" = "true" ]; then echo "skip_backend=false" >> $GITHUB_OUTPUT echo "skip_frontend=true" >> $GITHUB_OUTPUT echo "🔧 纯后端改动,跳过前端检查" else echo "skip_backend=false" >> $GITHUB_OUTPUT echo "skip_frontend=false" >> $GITHUB_OUTPUT - echo "🔧 包含全栈变更,运行完整CI" + if [ "$INFRA_COUNT" -gt "0" ]; then + echo "🏗️ 包含基础设施变更,强制运行完整CI" + else + echo "🔧 包含全栈变更,运行完整CI" + fi fi - name: Report CI trace