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 操作步骤默认使用
语义吗?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