name: AI Code Review on: pull_request: types: - opened - synchronize - reopened # 同一个 PR 只跑一个 review,新的取消旧的 concurrency: group: code-review-${{ gitea.repository }}-${{ gitea.event.pull_request.number }} cancel-in-progress: true jobs: code-review: name: AI Code Review runs-on: ubuntu-latest # 跳过草稿 PR if: ${{ !gitea.event.pull_request.draft }} steps: # actions/checkout 由 runner 在宿主机层面处理,不受容器网络影响 - name: Checkout code uses: actions/checkout@v3 with: fetch-depth: 0 # 网络波动自动重试2次 retry: max_attempts: 2 retry_on: error - name: Install dependencies run: | # 确保 python3-pip 可用(兼容不同基础镜像) if ! python3 -m pip --version >/dev/null 2>&1; then apt-get update -qq && apt-get install -y -qq python3-pip python3-venv >/dev/null 2>&1 fi # 部分镜像 ensurepip 方式兜底 if ! python3 -m pip --version >/dev/null 2>&1; then python3 -m ensurepip --upgrade 2>/dev/null || curl -sS https://bootstrap.pypa.io/get-pip.py | python3 fi python3 -m pip install --upgrade pip python3 -m pip install requests - name: Run AI Code Review env: # Gitea 配置(自动从运行环境获取) GITEA_API_URL: ${{ gitea.server_url }} GITEA_TOKEN: ${{ secrets.REVIEW_GITEA_TOKEN }} REPO_NAME: ${{ gitea.repository }} PR_NUMBER: ${{ gitea.event.pull_request.number }} # LLM 提供商: coze (扣子原生Bot) / openai (OpenAI兼容) LLM_PROVIDER: "coze" # 扣子模式配置(默认国内站 api.coze.cn) LLM_BASE_URL: ${{ secrets.LLM_BASE_URL }} LLM_API_KEY: ${{ secrets.LLM_API_KEY }} COZE_BOT_ID: ${{ secrets.COZE_BOT_ID }} LLM_MODEL: ${{ secrets.LLM_MODEL }} # 可选参数 MAX_DIFF_CHARS: "30000" LLM_TIMEOUT: "120" run: | python3 scripts/ci_code_review.py # 审查脚本异常不影响 CI 通过 continue-on-error: true - name: Report CI trace if: always() shell: sh env: AGENTLOOP_LICENSE_KEY: ${{ secrets.AGENTLOOP_LICENSE_KEY }} run: | STATUS="ok" [ ${{ job.status }} = "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