You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置GitHub Action:无活跃PR时才执行push触发的pytest工作流

解决方案:避免分支有开放PR时重复运行push触发的pytest工作流

问题背景

我有一个GitHub仓库,其中的CI Workflow工作流会在拉取请求(pull requests)时运行pytest和job2两个任务,且两者必须通过。我还希望另一个名为pytest_on_push的工作流在每次推送(push)时运行相同的pytest,方便用户发起PR前知道提交会不会破坏分支。但我不希望当分支已有开放PR后,推送时还运行pytest_on_push,因为这会重复执行pytest,完全没必要。我试了下面两种方法但都没成功:

  • 通过if: github.event_name != 'pull_request'阻止pytest_on_push的任务或步骤
  • 寻找类似on: push if not pull_request的语法

实现思路

GitHub Actions没有原生的触发条件能直接判断分支是否存在开放PR,但可以通过在工作流中添加前置检查步骤,调用GitHub CLI或API查询当前分支的开放PR状态,再根据结果决定是否执行pytest任务。

修改后的pytest_on_push工作流

下面是完整的配置文件,通过GitHub CLI检查分支的开放PR状态:

name: pytest_on_push
on:
  push:
    branches-ignore:
      - develop
      - production

jobs:
  check_open_pr:
    name: 检查分支是否有开放PR
    runs-on: ubuntu-latest
    outputs:
      has_open_pr: ${{ steps.check_pr.outputs.has_open_pr }}
    steps:
      - name: 拉取代码
        uses: actions/checkout@v4
      
      - name: 安装GitHub CLI
        run: sudo apt-get install gh -y
      
      - name: 认证GitHub CLI
        run: echo "${{ secrets.GITHUB_TOKEN }}" | gh auth login --with-token
      
      - name: 查询开放PR数量
        id: check_pr
        run: |
          BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)
          # 统计当前分支的开放PR数量
          PR_COUNT=$(gh pr list --head "$BRANCH_NAME" --state open --json number --jq 'length')
          if [ "$PR_COUNT" -eq 0 ]; then
            echo "has_open_pr=false" >> "$GITHUB_OUTPUT"
          else
            echo "has_open_pr=true" >> "$GITHUB_OUTPUT"
          fi

  pytest:
    name: pytest
    runs-on: ubuntu-latest
    needs: check_open_pr
    # 只有当没有开放PR时才执行该任务
    if: ${{ needs.check_open_pr.outputs.has_open_pr == 'false' }}
    steps:
      - name: 拉取代码
        uses: actions/checkout@v4

      - name: 运行Pytest
        run: make test-ci

备选方案:用GitHub API替代CLI

如果不想依赖GitHub CLI,可以用curl调用GitHub API实现相同功能,替换check_open_pr中的查询步骤即可:

- name: 通过API查询开放PR数量
  id: check_pr
  run: |
    BRANCH_NAME=$(git rev-parse --abbrev-ref HEAD)
    API_URL="https://api.github.com/repos/${{ github.repository }}/pulls?head=${{ github.repository_owner }}:$BRANCH_NAME&state=open"
    # 用curl请求API并统计结果数量
    PR_COUNT=$(curl -s -H "Authorization: token ${{ secrets.GITHUB_TOKEN }}" "$API_URL" | jq 'length')
    if [ "$PR_COUNT" -eq 0 ]; then
      echo "has_open_pr=false" >> "$GITHUB_OUTPUT"
    else
      echo "has_open_pr=true" >> "$GITHUB_OUTPUT"
    fi

注意事项

  • secrets.GITHUB_TOKEN是GitHub Actions自动生成的内置密钥,拥有当前仓库的读写权限,无需额外配置
  • 确保运行环境安装了jq(Ubuntu默认预装,其他环境可通过apt-get install jq或对应包管理器安装)

内容的提问来源于stack exchange,提问作者Mark_Anderson

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 10:40:25