假设我有一个这样的拉取请求。
name: Workflow
on:
pull_request:
paths:
- '**/*.h'
- '**/*.c'
我通过配置 GitHub Actions 要求在拉取请求可合并之前通过状态检查来保护
master
分支。
现在我更新自述文件。我针对
master
发起拉取请求。拉取请求是不可合并的,因为状态检查永远不会返回成功,也不会返回失败。
建议?
文档建议创建另一个具有相同名称的操作,该操作在满足相反条件时运行。在你的情况下,你会想要
name: Workflow
on:
pull_request:
paths-ignore:
- '**/*.h'
- '**/*.c'
jobs:
build:
runs-on: ubuntu-latest
steps:
- run: 'echo "No build required" '
注意
paths-ignore
。
文档提供的答案(Vicky 的答案)对我来说无法正常工作。为 paths-ignore 提供多个值并不会阻止通用/重复工作流程的运行。由于原始工作流和重复/通用工作流都在运行,不幸的是,我们仍然能够在检查完成之前合并。
Github 上的此提交显示了一种不太复杂的可行处理方法:
相关片段(在“步骤”下):
- 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
以下是我发现的一些其他选项,看起来不太可行或更复杂:
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 之一,并设置分支保护规则,如下所示。