如何配置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
相关产品推荐
相关产品推荐

