2818f44282
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 13s
CI/CD Pipeline / Frontend Lint (pull_request) Successful in 24s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 8s
CI/CD Pipeline / Validate - Type Check (mypy) (pull_request) Successful in 1m26s
CI/CD Pipeline / Validate - Migration (alembic) (pull_request) Successful in 1m24s
CI/CD Pipeline / Build Staging API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Staging Worker Image (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Has been skipped
Preview Deploy / Deploy Preview Environment (pull_request) Failing after 25s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Has been skipped
CI/CD Pipeline / Build Production API Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Web Image (pull_request) Has been skipped
CI/CD Pipeline / Build Production Worker Image (pull_request) Has been skipped
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Has been skipped
CI/CD Pipeline / PR Build Web Image (pull_request) Successful in 1m44s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 1m36s
AI Code Review / AI Code Review (pull_request) Successful in 2m3s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 2m57s
CI/CD Pipeline / Deploy Production (pull_request) Has been skipped
CI/CD Pipeline / Staging E2E Tests (pull_request) Has been skipped
CI/CD Pipeline / Staging API Integration Tests (pull_request) Has been skipped
CI/CD Pipeline / ACR Image Cleanup (pull_request) Has been skipped
CI/CD Pipeline / Validate - Code Quality (pull_request) Successful in 7m10s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
CI/CD Pipeline / Canary Release to Production (pull_request) Has been skipped
CI/CD Pipeline / Unit Tests (pull_request) Successful in 9m58s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 4m41s
CI/CD Pipeline / CI Gate (pull_request) Successful in 3s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Has been cancelled
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 34s
- auto_merge.sh: 去掉90次x30秒的轮询循环,改为单次检查 - 超时从45分钟缩短为3分钟 - CI未通过/未就绪时直接退出,不占用Runner - 由pr-auto-scan每5分钟定时扫描兜底,CI通过后自动合并 - 保留405重试机制(单次运行内最多3次) 问题:auto-merge job轮询等待CI通过,最长占Runner 45分钟,资源浪费。 修复:改为短作业模式——检查一次CI状态,满足就合并,不满足就退出。 兜底:pr-auto-scan.yml每5分钟扫描所有open PR,CI全绿的自动审批+合并。
114 lines
4.2 KiB
YAML
Executable File
114 lines
4.2 KiB
YAML
Executable File
name: PR Automation
|
|
|
|
on:
|
|
pull_request:
|
|
types: [synchronize, opened, ready_for_review, review_requested]
|
|
workflow_dispatch:
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
jobs:
|
|
auto-approve:
|
|
name: Auto Approve on CI Green
|
|
runs-on: ci-check
|
|
if: github.event_name == 'pull_request' && !github.event.pull_request.draft
|
|
timeout-minutes: 3 # 长等待模式:等CI全绿后自动合并,不遗漏任何PR
|
|
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: "🔍 脚本语法自检"
|
|
shell: bash
|
|
run: |
|
|
ERROR=0
|
|
for f in scripts/ci/*.sh; do [ -f "$f" ] && bash -n "$f" 2>&1 || ERROR=$((ERROR+1)); done
|
|
for f in scripts/ci/*.py; do [ -f "$f" ] && python3 -m py_compile "$f" 2>&1 || ERROR=$((ERROR+1)); done
|
|
if [ "$ERROR" -ne 0 ]; then echo "❌ 语法自检失败 ($ERROR个)"; exit 1; fi
|
|
echo "✅ 脚本语法自检通过"
|
|
|
|
- name: Auto approve when CI passes
|
|
shell: bash
|
|
env:
|
|
GITHUB_TOKEN: ${{ github.token }}
|
|
REVIEW_TOKEN: ${{ secrets.REVIEW_GITEA_TOKEN }}
|
|
PR_NUMBER: ${{ github.event.pull_request.number }}
|
|
PR_HEAD_SHA: ${{ github.event.pull_request.head.sha }}
|
|
run: |
|
|
bash scripts/ci/auto_approve.sh
|
|
- 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
|
|
|
|
auto-merge:
|
|
name: Auto Merge on CI Green + Approved
|
|
runs-on: ci-check
|
|
if: github.event_name == 'pull_request' && !github.event.pull_request.draft && github.event.pull_request.base.ref == 'develop'
|
|
timeout-minutes: 3 # 短作业模式:检查一次,不满足就退出,由pr-auto-scan每5分钟定时兜底
|
|
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: "🔍 脚本语法自检(防止脚本bug导致所有PR挂掉)"
|
|
shell: bash
|
|
run: |
|
|
echo "=== CI脚本语法自检 ==="
|
|
ERROR=0
|
|
for f in scripts/ci/*.sh; do
|
|
[ -f "$f" ] || continue
|
|
if ! bash -n "$f" 2>&1; then
|
|
echo "FAIL: $f"
|
|
ERROR=1
|
|
fi
|
|
done
|
|
for f in scripts/ci/*.py; do
|
|
[ -f "$f" ] || continue
|
|
if ! python3 -m py_compile "$f" 2>&1; then
|
|
echo "FAIL: $f"
|
|
ERROR=1
|
|
fi
|
|
done
|
|
if [ "$ERROR" -ne 0 ]; then
|
|
echo "❌ 脚本语法自检失败"
|
|
exit 1
|
|
fi
|
|
echo "✅ 所有CI脚本语法自检通过"
|
|
|
|
- name: Auto merge when CI passes and approved
|
|
shell: bash
|
|
env:
|
|
GITHUB_TOKEN: ${{ github.token }}
|
|
MERGE_TOKEN: ${{ secrets.REVIEW_GITEA_TOKEN }}
|
|
PR_NUMBER: ${{ github.event.pull_request.number }}
|
|
PR_HEAD_SHA: ${{ github.event.pull_request.head.sha }}
|
|
BASE_REF: ${{ github.event.pull_request.base.ref }}
|
|
run: |
|
|
bash scripts/ci/auto_merge.sh
|
|
- 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
|