Github Actions:如果特定文件夹发生更改,则在工作流程中运行步骤/作业

33

有没有办法根据特定文件夹中的更改来控制工作流程中要运行哪些任务/步骤?

例如:

我的 git 仓库中有以下文件夹:a、b、c。每次将 PR 合并到我的分支时,就会触发一个工作流程。该工作流程将执行如下任务:A -> B -> C。我想仅在 "a/**" 文件夹中存在更改时运行任务 A,在 "b/**" 中存在更改时运行任务 B,以此类推。

所以,如果在 PR 中只更改了 "a/**""b/**",则工作流程会跳过任务 C 的执行,使工作流程变为 A->B


这可能也会有所帮助 https://www.meziantou.net/executing-github-actions-jobs-or-steps-only-when-specific-files-change.htm - Can Rau
2个回答

49

您可以在作业或步骤级别使用具有if条件的paths-filter自定义操作,使用setup作业作为初步检查您的特定路径是否已更新,并将结果保存为输出。

以下是一个示例

name: Paths Filter Example

on: [push, workflow_dispatch]

jobs:
  paths-filter:
    runs-on: ubuntu-latest
    outputs:
      output1: ${{ steps.filter.outputs.workflows }}
    steps:
    - uses: actions/checkout@v2
    - uses: dorny/paths-filter@v2
      id: filter
      with:
        filters: |
          workflows:
            - '.github/workflows/**'
    # run only if 'workflows' files were changed
    - name: workflow tests
      if: steps.filter.outputs.workflows == 'true'
      run: echo "Workflow file"

    # run only if not 'workflows' files were changed
    - name: not workflow tests
      if: steps.filter.outputs.workflows != 'true'
      run: echo "NOT workflow file"

  next-job:
    runs-on: ubuntu-latest
    # Wait from the paths-filter to be completed before starting next-job
    needs: paths-filter
    if: needs.paths-filter.outputs.output1 == 'true'
    steps:
      ...

这样,你的工作中可能会出现这样的内容:A --> BA --> C,具体取决于已更新的路径。


next-job 的语法需要做一个小调整:应该写成 if: needs.paths-filter.outputs.output1 == 'true' 或者 if: ${{ needs.paths-filter.outputs.output1 == 'true' }} - HeyZiko

21

17
这个控制在工作流水平上。它不会控制根据路径执行哪些工作。我想要的可能是一个 if: 标签在工作步骤中,用于检查路径是否有变化。 - ASHISH M.G
3
您需要为每个作业创建一个工作流程 - 此条件仅适用于整个工作流程。 - mmomtchev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接