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

Seb*_*asH 19 bash continuous-integration exit-code gitlab gitlab-ci

我正在尝试设置一个 GitLab 管道,以便某些exit_codes对于我正在执行的脚本来说是可以的。我尝试过 shell 和 ruby​​ 脚本,但两者似乎都有相同的行为。

test_job:
  stage: build
  image: ruby:3.0
  script:
    - chmod +x ci/wrap.sh
    - ./ci/wrap.sh
  allow_failure:
    exit_codes:
      - 64
Run Code Online (Sandbox Code Playgroud)

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

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

管道错误

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

Seb*_*asH 20

我找到了解决这个问题的方法。显然,Gitlab Runner 使用该-e标志,这意味着任何非零退出代码都将取消该作业。可以使用 进行更新set +e,但您仍然需要捕获作业的实际退出代码。

$?在配置的两个不同行中使用是行不通的,因为 Gitlab 会echo在它们之间进行调用。

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

script:
  - set +e
  - ruby "ci/example.rb" || EXIT_CODE=$?
  - exit $EXIT_CODE
Run Code Online (Sandbox Code Playgroud)

  • “你能提供更多关于你在哪里运行 set +e 的信息吗?”他没有。如果您使用“||”捕获退出状态,则无需这样做。“如果你知道某个地方已配置?”它没有配置。您可以将 `set +e` 作为脚本的一部分。`如果给出了不允许的非零退出代码,会发生什么?`我不明白“不允许”。允许任何非零退出代码,并且当在“set -e”下运行时,它们会导致脚本终止。您可能想阅读 https://mywiki.wooledge.org/BashFAQ/105 。 (3认同)