GitLab 没有在作业中正确传播退出代码

Doo*_*mel 5 node.js npm gitlab

.gitlab-ci.yml为使用pnpm. 工作清单是:

deploy_npm:
  image: node:16.14.0-bullseye-slim
  stage: deploy
  before_script:
    - npm install -g pnpm@6.32.2
    - pnpm build
  script:
    - pnpm publish
    - echo $?
Run Code Online (Sandbox Code Playgroud)

问题是,当我没有使用.npmrc正确的身份验证令牌创建文件时,并且收到“未经授权”错误,作业状态仍然成功,因为退出状态为0。如果我在本地环境中运行相同的命令,那么退出状态将为1.

npm notice Publishing to ****************
npm ERR! code E401
npm ERR! 401 Unauthorized - PUT *******************
npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2022-07-08T13_22_44_392Z-debug-0.log
$ echo $?
0
Cleaning up project directory and file based variables
00:01
Job succeeded
Run Code Online (Sandbox Code Playgroud)

同样的事情也会发生FATAL_ERROR在 Vite 构建中(当运行程序内存不足时),所以我的假设是 GitLab 在传播退出代码方面存在问题。有什么办法可以解决这个问题吗?我尝试过设置诸如FF_ENABLE_BASH_EXIT_CODE_CHECK或 之类的功能标志FF_USE_NEW_BASH_EVAL_STRATEGY,但它们没有帮助。

cie*_*ech 0

你应该小心使用 $? 直接在 gitlab ci 的脚本中,因为这当然会显示最后一个错误代码,但也会返回一个等于 0 的新错误,这可以根据功能标志配置改变作业行为。

您可以尝试使用下面的解决方法(既调试又强制退出代码值) - 它将退出代码保存到变量,显示其值,并用它强制运行退出。

deploy_npm:
  image: node:16.14.0-bullseye-slim
  stage: deploy
  before_script:
    - npm install -g pnpm@6.32.2
    - pnpm build
  script:
    - set +e
    - pnpm publish && exit_code=$? || exit_code=$?
    - set -e
    - echo "command finished with $exit_code"
    - exit $exit_code
Run Code Online (Sandbox Code Playgroud)