Github 操作:由于路径中的文件未更改,因此未运行所需的状态检查

问题描述 投票:0回答:3

假设我有一个这样的拉取请求。

name: Workflow

on:
   pull_request:
     paths:
       - '**/*.h'
       - '**/*.c'

我通过配置 GitHub Actions 要求在拉取请求可合并之前通过状态检查来保护

master
分支。

现在我更新自述文件。我针对

master
发起拉取请求。拉取请求是不可合并的,因为状态检查永远不会返回成功,也不会返回失败。

建议?

github github-actions
3个回答
12
投票

文档建议创建另一个具有相同名称的操作,该操作在满足相反条件时运行。在你的情况下,你会想要

name: Workflow

on:
   pull_request:
     paths-ignore:
       - '**/*.h'
       - '**/*.c'

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - run: 'echo "No build required" '

注意

paths-ignore

https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/defining-the-mergeability-of-pull-requests/troubleshooting-required-status-checks#处理跳过但必需的检查


1
投票

文档提供的答案(Vicky 的答案)对我来说无法正常工作。为 paths-ignore 提供多个值并不会阻止通用/重复工作流程的运行。由于原始工作流和重复/通用工作流都在运行,不幸的是,我们仍然能够在检查完成之前合并。

Github 上的此提交显示了一种不太复杂的可行处理方法:

https://github.com/android-password-store/Android-Password-Store/commit/0c45bffaba1192ea8a10173e709f439dbf32b089#diff-87ee5504a3e25ac558b343724c905f2f7949e8cec3d92b9c4300bb922 afa164f

相关片段(在“步骤”下):

    - name: Check if relevant files have changed
      uses: actions/[email protected]
      id: service-changed
      with:
        result-encoding: string
        script: |
          const result = await github.pulls.listFiles({
            owner: context.payload.repository.owner.login,
            repo: context.payload.repository.name,
            pull_number: context.payload.number,
            per_page: 100
          })
          const serviceChanged = result.data.filter(f => f.filename.startsWith("app/") || f.filename.endsWith("gradle") || f.filename.startsWith(".github") || f.filename.startsWith("gradle") || f.filename.endsWith("properties")).length > 0
          console.log(serviceChanged)
          return serviceChanged
    - name: Checkout repository
      if: ${{ steps.service-changed.outputs.result == 'true' }}
      uses: actions/checkout@v1

    - name: Copy CI gradle.properties
      if: ${{ steps.service-changed.outputs.result == 'true' }}
      run: mkdir -p ~/.gradle ; cp .github/ci-gradle.properties ~/.gradle/gradle.properties

以下是我发现的一些其他选项,看起来不太可行或更复杂:


0
投票

Github 文档建议使用条件而不是路径过滤器。更多信息请参见此处Github 文档

但是,我发现这种方法非常麻烦,尤其是对于单一存储库。

另一种选择是使用类似的东西 https://github.com/upsidr/merge-gatekeeper/tree/main

合并 Gatekeeper 的创建是为了为合并提供更多控制。通过让 Merge Gatekeeper 为所有 PR 运行,它可以检查所有其他已启动的 CI 作业,并确保所有作业均成功完成。如果有任何作业失败,Merge Gatekeeper 也会失败。这允许基于Merge Gatekeeper的合并保护,可以有效确保任何CI故障都会阻止合并。您所需要的只是将 Merge Gatekeeper 作为基于 PR 的 GitHub Action 之一,并设置分支保护规则,如下所示。

© www.soinside.com 2019 - 2024. All rights reserved.