From fb2884b03c5bdec4e56423f8aaee9cac920180e2 Mon Sep 17 00:00:00 2001 From: xiaoxia Date: Mon, 27 Jul 2026 16:17:50 +0800 Subject: [PATCH] =?UTF-8?q?fix(ci):=20=E6=B7=BB=E5=8A=A0ci-gate=E6=B1=87?= =?UTF-8?q?=E6=80=BBjob=EF=BC=8C=E8=A7=A3=E5=86=B3=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=90=88=E5=B9=B6405=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitea/workflows/ci-pipeline.yml | 157 +++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) diff --git a/.gitea/workflows/ci-pipeline.yml b/.gitea/workflows/ci-pipeline.yml index cfb1edfc5..4d4e5b212 100755 --- a/.gitea/workflows/ci-pipeline.yml +++ b/.gitea/workflows/ci-pipeline.yml @@ -1662,3 +1662,160 @@ jobs: START_TIME="" [ -f /tmp/ci_job_start_time ] && START_TIME=$(cat /tmp/ci_job_start_time) python3 scripts/ci/ci_trace_report.py --service xiaoxia-saas-ci --status $STATUS --start-time "$START_TIME" || true + + ci-gate: + name: CI Gate + runs-on: ci-l2 + if: always() && github.event_name == 'pull_request' + needs: + - check-frontend-only + - validate-code-quality + - validate-type-check + - validate-migration + - unit-tests + - integration-tests + - frontend-lint + - frontend-unit-test + - build-pr + timeout-minutes: 3 + steps: + - name: Checkout code + shell: sh + env: + GITHUB_TOKEN: ${{ github.token }} + run: | + curl -sH "Authorization: token $GITHUB_TOKEN" \ + "${GITHUB_API_URL}/repos/${GITHUB_REPOSITORY}/raw/scripts/ci/step_checkout.sh?ref=${GITHUB_SHA}" \ + | bash + + - name: Evaluate CI Gate + id: gate + shell: bash + env: + GITHUB_TOKEN: ${{ github.token }} + PR_NUMBER: ${{ github.event.pull_request.number }} + PR_HEAD_SHA: ${{ github.event.pull_request.head.sha }} + RESULT_CHECK_FRONTEND: ${{ needs.check-frontend-only.result }} + RESULT_CODE_QUALITY: ${{ needs.validate-code-quality.result }} + RESULT_TYPE_CHECK: ${{ needs.validate-type-check.result }} + RESULT_MIGRATION: ${{ needs.validate-migration.result }} + RESULT_UNIT_TESTS: ${{ needs.unit-tests.result }} + RESULT_INTEGRATION: ${{ needs.integration-tests.result }} + RESULT_FRONTEND_LINT: ${{ needs.frontend-lint.result }} + RESULT_FRONTEND_UNIT: ${{ needs.frontend-unit-test.result }} + RESULT_BUILD_PR: ${{ needs.build-pr.result }} + run: | + set -eu + echo "=== CI Gate 评估 ===" + echo "" + echo "各job结果:" + echo " check-frontend-only: $RESULT_CHECK_FRONTEND" + echo " validate-code-quality: $RESULT_CODE_QUALITY" + echo " validate-type-check: $RESULT_TYPE_CHECK" + echo " validate-migration: $RESULT_MIGRATION" + echo " unit-tests: $RESULT_UNIT_TESTS" + echo " integration-tests: $RESULT_INTEGRATION" + echo " frontend-lint: $RESULT_FRONTEND_LINT" + echo " frontend-unit-test: $RESULT_FRONTEND_UNIT" + echo " build-pr: $RESULT_BUILD_PR" + echo "" + + # 判断PR类型 + SKIP_BACKEND="${{ needs.check-frontend-only.outputs.skip_backend }}" + SKIP_FRONTEND="${{ needs.check-frontend-only.outputs.skip_frontend }}" + echo "PR类型: skip_backend=$SKIP_BACKEND, skip_frontend=$SKIP_FRONTEND" + + # 必填检查项(根据PR类型决定) + # 通用检查(所有PR都必须过) + REQUIRED_GENERAL=( + "validate-code-quality:$RESULT_CODE_QUALITY" + "validate-type-check:$RESULT_TYPE_CHECK" + "validate-migration:$RESULT_MIGRATION" + "frontend-lint:$RESULT_FRONTEND_LINT" + "build-pr:$RESULT_BUILD_PR" + ) + + # 后端检查 + REQUIRED_BACKEND=( + "unit-tests:$RESULT_UNIT_TESTS" + ) + + # 前端检查 + REQUIRED_FRONTEND=( + "frontend-unit-test:$RESULT_FRONTEND_UNIT" + ) + + ALL_PASSED=true + FAILED_ITEMS=() + + check_job() { + local name=$1 + local result=$2 + if [ "$result" = "success" ]; then + echo " ✅ $name: success" + elif [ "$result" = "skipped" ]; then + echo " ⏭️ $name: skipped(跳过,不影响)" + else + echo " ❌ $name: $result" + ALL_PASSED=false + FAILED_ITEMS+=("$name=$result") + fi + } + + echo "" + echo "=== 通用检查(所有PR必填)===" + for item in "${REQUIRED_GENERAL[@]}"; do + name="${item%%:*}" + result="${item##*:}" + check_job "$name" "$result" + done + + if [ "$SKIP_BACKEND" != "true" ]; then + echo "" + echo "=== 后端检查 ===" + for item in "${REQUIRED_BACKEND[@]}"; do + name="${item%%:*}" + result="${item##*:}" + check_job "$name" "$result" + done + else + echo "" + echo "=== 后端检查(纯前端PR,跳过)===" + fi + + if [ "$SKIP_FRONTEND" != "true" ]; then + echo "" + echo "=== 前端检查 ===" + for item in "${REQUIRED_FRONTEND[@]}"; do + name="${item%%:*}" + result="${item##*:}" + check_job "$name" "$result" + done + else + echo "" + echo "=== 前端检查(纯后端PR,跳过)===" + fi + + echo "" + if [ "$ALL_PASSED" = "true" ]; then + echo "✅ CI Gate: PASSED" + echo "gate_result=success" >> $GITHUB_OUTPUT + exit 0 + else + echo "❌ CI Gate: FAILED" + echo "失败项: ${FAILED_ITEMS[*]}" + echo "gate_result=failure" >> $GITHUB_OUTPUT + exit 0 + fi + + - name: Report CI trace + if: always() + shell: sh + env: + AGENTLOOP_LICENSE_KEY: ${{ secrets.AGENTLOOP_LICENSE_KEY }} + run: | + STATUS="ok" + [ "${{ steps.gate.outputs.gate_result }}" = "success" ] || STATUS="error" + START_TIME="" + [ -f /tmp/ci_job_start_time ] && START_TIME=$(cat /tmp/ci_job_start_time) + python3 scripts/ci/ci_trace_report.py --service xiaoxia-saas-ci --status $STATUS --start-time "$START_TIME" || true