GitHub 操作步骤默认使用 `set -e` 语义吗?

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

GitHub 操作工作流程中的常见模式是运行如下所示的内容:

  - name: Install and Build 🔧
    run: |
      npm ci
      npm run build

显然,目的是仅当第一个命令成功时才运行第二个命令。

在 Linux 上运行时,问题就变成了 shell 是否以

set -e
语义运行。 这个答案表明
set -e
语义是默认的。

我试图在文档中找到该信息,但我有点困惑它是如何指定的。关于 退出代码 的部分包含 shell/sh shell 的以下内容:

使用

set -eo pipefail
实现快速失败行为:显式指定
shell: bash
时设置此选项。默认情况下不应用。

这似乎与其他答案(和问题!)相矛盾,并且意味着上述模式实际上是无效的,因为即使第一行失败,第二行也会被执行。

我只是误读了文档,还是真的有必要始终手动指定

set -e
或显式添加
shell: bash
以获得所需的行为?

github-actions
1个回答
7
投票

GitHub 操作步骤默认使用

set -e
语义吗?

是的,确实如此。

根据

jobs.<job_id>.steps[*].shell
sh
bash
调用确实包含
-e
,无论指定还是未指定。

  • 未指定:
    bash -e {0}
  • shell: bash
    bash --noprofile --norc -eo pipefail {0}
  • shell: sh
    sh -e {0}

但是,此部分在退出代码和错误操作首选项下指定:

bash
/
sh
:使用
set -eo pipefail
的快速失败行为:当显式指定
shell: bash
时设置此选项。默认情况下不应用它。

仅适用于 Bash 的

-o pipefail
部分。不过,它本来可以更明确。

已在 GitHub 文档存储库 上创建了一个问题来修改此内容: https://github.com/github/docs/issues/23853


更新

相应的 PR 已合并,并且 退出代码和错误操作首选项 部分现在明确提到了这一点:

  • bash
    /
    sh
    • 默认情况下,使用
      set -e
      sh
      强制执行快速失败行为。当指定
      bash
      时,
      shell: bash
      也适用于强制从生成非零退出状态的管道中提前退出。
      
      
© www.soinside.com 2019 - 2024. All rights reserved.