Github Actions:为什么 shell 脚本中的中间命令失败会导致整个步骤失败?

mic*_*ohl 9 bash continuous-integration grep github-actions

我在 Github Actions 工作中有一个步骤:

      - name: Check for changes
        run: |
          diff=$( git diff --name-only 'origin/main' )
          changed_files=$( echo $diff | grep -c src/my_folder ) # this fails

          # more script lines
          # that are unrelated
Run Code Online (Sandbox Code Playgroud)

Error: Process completed with exit code 1. 仅当 grep 找不到任何内容时才会失败。如果 中有匹配项$diff,则此步骤按预期进行。但当然它也需要在没有匹配的情况下工作。

我可以在本地或在脚本内运行它,没有问题,退出代码总是0(在 Mac 上)。

我不明白问题是什么。经过几个小时的反复试验和研究,我了解到这grep在 Github 操作中显然很棘手,但我没有找到任何提示或适当的文档,我应该如何解决这个确切的情况。

如果我将失败的线路更改为

echo $( echo $diff | grep -c src/my_folder ) # this works and prints out the result
Run Code Online (Sandbox Code Playgroud)

这可以毫无问题地执行。

但是,即使没有发现任何结果,如何将 grep 输出放入变量中呢?

pyn*_*exj 11

根据文档,默认情况下 Github Actions 允许set -e运行该步骤的命令。这就是为什么中间命令失败可能导致整个步骤失败的原因。要完全控制步骤的命令,您可以这样做:

  - name: Check for changes
    shell: bash {0}
    run: |
      diff=$( git diff --name-only 'origin/main' )
      changed_files=$( echo $diff | grep -c src/my_folder )

      # ...
      # ...
Run Code Online (Sandbox Code Playgroud)

set -e或者您可以在步骤脚本的开头禁用默认值:

  - name: Check for changes
    run: |
      set +x

      diff=$( git diff --name-only 'origin/main' )
      changed_files=$( echo $diff | grep -c src/my_folder )

      # ...
      # ...
Run Code Online (Sandbox Code Playgroud)