diff --git a/.github/workflows/auto_merge_renovate_prs.yml b/.github/workflows/auto_merge_renovate_prs.yml index 6d6c5b864..8a1d1cf8c 100644 --- a/.github/workflows/auto_merge_renovate_prs.yml +++ b/.github/workflows/auto_merge_renovate_prs.yml @@ -1,39 +1,60 @@ name: Auto merge Renovate PRs on: + schedule: + - cron: "*/10 * * * *" + workflow_dispatch: pull_request: - types: [opened, synchronize, reopened, ready_for_review] + types: [ready_for_review] jobs: automerge: runs-on: ubuntu-latest - if: github.actor == 'renovate[bot]' || github.actor == 'mend-renovate[bot]' steps: - - name: Extract update type from PR body - id: check + - name: Checkout + uses: actions/checkout@v4 + + - name: List open PRs from Renovate run: | - body="${{ github.event.pull_request.body }}" - echo "PR Body: $body" - - update_type=$(echo "$body" | grep -Eo '\|\s+[a-zA-Z0-9/_-]+\s+\|\s+(major|minor|patch)\s+\|' | head -n1 | awk -F'|' '{print $3}' | xargs) - echo "Detected update_type=$update_type" - - echo "update_type=$update_type" >> $GITHUB_OUTPUT - - - name: Wait for all checks - uses: lewagon/wait-on-check-action@v1.3.4 - with: - ref: ${{ github.event.pull_request.head.sha }} - repo-token: ${{ secrets.GITHUB_TOKEN }} - wait-interval: 15 - running-workflow-name: "Auto merge Renovate PRs" - - - name: Merge PR if patch/minor - if: steps.check.outputs.update_type == 'patch' || steps.check.outputs.update_type == 'minor' - run: | - gh pr merge ${{ github.event.pull_request.number }} \ - --merge \ - --delete-branch \ - --repo ${{ github.repository }} + prs=$(gh pr list \ + --repo ${{ github.repository }} \ + --state open \ + --json number,title,body,author \ + --jq '.[] | select(.author.login=="renovate[bot]" or .author.login=="mend-renovate[bot]") | .number') + + echo "Found PRs: $prs" + echo "prs=$prs" >> $GITHUB_ENV + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Process each PR + if: env.prs != '' + run: | + for pr in $prs; do + echo "Checking PR #$pr ..." + body=$(gh pr view $pr --repo ${{ github.repository }} --json body --jq .body) + + update_type=$(echo "$body" | grep -Eo '\|\s+[a-zA-Z0-9/_-]+\s+\|\s+(major|minor|patch)\s+\|' | head -n1 | awk -F'|' '{print $3}' | xargs) + echo "PR #$pr update_type=$update_type" + + if [[ "$update_type" == "patch" || "$update_type" == "minor" ]]; then + echo "Waiting for checks on PR #$pr ..." + gh pr checks $pr --repo ${{ github.repository }} + + # 检查状态是否全绿 + state=$(gh pr checks $pr --repo ${{ github.repository }} --json status,state --jq '.[].status' | grep -v COMPLETED || true) + if [[ -z "$state" ]]; then + echo "Merging PR #$pr ..." + gh pr merge $pr \ + --merge \ + --delete-branch \ + --repo ${{ github.repository }} + else + echo "PR #$pr still has pending checks, skipping." + fi + else + echo "Skipping PR #$pr (not patch/minor)" + fi + done env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}