Gitlab CI 忽略 1 以外的脚本退出代码

Posted

技术标签:

【中文标题】Gitlab CI 忽略 1 以外的脚本退出代码【英文标题】:Gitlab CI ignores script exit code other than 1 【发布时间】:2021-07-08 23:36:37 【问题描述】:

我正在尝试建立一个 gitlab 管道,以便某些 exit_codes 可以用于正在执行的脚本。 我已经尝试过 shell 和 ruby​​ 脚本,但两者似乎都有相同的行为。

如您所见,我只是在执行脚本,仅此而已,我的期望是,最后执行的脚本被用作作业的退出状态。

在脚本中我只调用“exit 64”,在这种情况下这应该是“允许的失败”,但是管道日志显示作业由于退出代码 1 而失败:

如何让 gitlab 接受此(或 ruby​​)脚本的退出代码作为作业退出代码?

【问题讨论】:

不要将代码发布为屏幕截图。听起来您从脚本中收到错误代码 1 而不是 64。你确定那里没有失败吗? 【参考方案1】:

我找到了解决这个问题的方法,显然 gitlab-runner 使用“-e”标志,这意味着任何非 0 退出代码都会取消作业。 这可以通过使用“set +e”来更新,但是您仍然需要捕获作业的实际退出代码。

使用 $?在两个不同的配置行中不起作用,因为 gitlab 会在它们之间“回显”调用。

所以需要直接捕获退出代码,例如:

  script:
    - ruby "ci/example.rb" || EXIT_CODE=$?
    - exit $EXIT_CODE

【讨论】:

我也有同样的问题。您能否提供有关您在哪里运行 set +e 的更多信息,或者您是否知道某个配置的位置?此外,如果给出了不允许的非零退出代码,会发生什么情况?我认为这对您的答案很有用。【参考方案2】:

这是我关闭早期故障并稍后检查结果代码的技巧:

  script:
    - set +e +o pipefail
    - python missing_module.py 2>&1 | grep found; result=$?
    - set -e -o pipefail
    - "[ $result == 0 ]"

这将关闭提前退出并运行我们认为如果错误文本中出现“found”则失败可接受的命令。然后它会重新打开提前退出并测试我们保存的退出代码是否正确。

【讨论】:

以上是关于Gitlab CI 忽略 1 以外的脚本退出代码的主要内容,如果未能解决你的问题,请参考以下文章

GITLAB CI错误加载密钥“/dev/fd/63”:格式无效错误:作业失败:退出代码1

Gitlab CI/CD 在“清理项目目录和基于文件的变量”时失败,并显示“错误:作业失败:退出代码 1”

gitlab ci false传递

如何使手动作业始终在 GitLab CI 上成功退出?

gitlab ci 管道部署 ftp 失败

将脚本移动到 gitlab-ci.yml 中的单独文件中以避免代码重复并将其包含在多个文件中