如何在GitHub Actions中编写for/foreach循环批量处理PR评审操作?
GitHub Actions批量驳回草稿PR评审的实现方案
工作流触发规则
首先配置工作流的触发条件,仅当PR从草稿转为可评审状态时触发:
name: 自动驳回草稿阶段评审 on: pull_request_target: types: [ready_for_review] permissions: pull-requests: write
方案1:Shell脚本内循环实现(最简便,适合绝大多数场景)
直接在单一步骤内通过bash循环完成拉取评审、逐个驳回的全流程,不需要跨步骤传参:
jobs: dismiss-old-reviews: runs-on: ubuntu-latest steps: - name: 批量驳回草稿阶段所有评审 env: PR_NUMBER: ${{ github.event.pull_request.number }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | # 拉取该PR所有处于活跃状态的评审ID REVIEW_IDS=$(gh api repos/$GITHUB_REPOSITORY/pulls/$PR_NUMBER/reviews --jq '.[] | select(.state != "DISMISSED") | .id') # 循环逐个驳回评审 for REVIEW_ID in $REVIEW_IDS; do gh api \ --method POST \ repos/$GITHUB_REPOSITORY/pulls/$PR_NUMBER/reviews/$REVIEW_ID/dismissals \ -f message="PR已从草稿转为正式评审,自动驳回草稿阶段的历史评审" done
方案2:Actions Matrix矩阵循环实现(原生语法,适合需要并行处理的场景)
如果需要对每个评审的驳回操作做独立的日志、错误处理,可以用矩阵策略拆分任务:
jobs: get-review-ids: runs-on: ubuntu-latest outputs: review-ids: ${{ steps.get-ids.outputs.review-ids }} steps: - id: get-ids env: PR_NUMBER: ${{ github.event.pull_request.number }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | REVIEW_IDS=$(gh api repos/$GITHUB_REPOSITORY/pulls/$PR_NUMBER/reviews --jq '[.[] | select(.state != "DISMISSED") | .id]') echo "review-ids=$REVIEW_IDS" >> $GITHUB_OUTPUT dismiss-reviews: needs: get-review-ids runs-on: ubuntu-latest strategy: matrix: review-id: ${{ fromJson(needs.get-review-ids.outputs.review-ids) }} steps: - name: 驳回评审 ${{ matrix.review-id }} env: PR_NUMBER: ${{ github.event.pull_request.number }} REVIEW_ID: ${{ matrix.review-id }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} run: | gh api \ --method POST \ repos/$GITHUB_REPOSITORY/pulls/$PR_NUMBER/reviews/$REVIEW_ID/dismissals \ -f message="PR已从草稿转为正式评审,自动驳回草稿阶段的历史评审"
注意事项
- 两种方案都依赖GitHub官方的
gh命令行工具,Ubuntu默认的Actions运行环境已经预装,不需要额外安装 - 可根据需求调整评审过滤逻辑,比如只驳回特定用户的评审、只驳回要求变更的评审等,只需修改
jq过滤条件即可 - 如需保留评审内容,可调整驳回信息的文案,不会删除原评审的评论内容
内容的提问来源于stack exchange,提问作者Tom Hivert
相关产品推荐
相关产品推荐

