即使npm发布失败,为什么Travis CI会报告构建成功?
我注意到构建https://travis-ci.org/neverendingqs/openssl-self-signed-certificate/builds/187723295,我忘了增加标签回购时的补丁版本。但是,即使npm发布由于版本已经存在而失败,构建报告为passing
。即使npm发布失败,为什么Travis CI会报告构建成功?
这里是日志的末尾:
Deploying application
NPM API key format changed recently. If your deployment fails, check your API key in ~/.npmrc.
http://docs.travis-ci.com/user/deployment/npm/
~/.npmrc size: 48
npm ERR! publish Failed PUT 403
npm ERR! Linux 4.8.12-040812-generic
npm ERR! argv "/home/travis/.nvm/v0.10.48/bin/node" "/home/travis/.nvm/v0.10.48/bin/npm" "publish"
npm ERR! node v0.10.48
npm ERR! npm v2.15.1
npm ERR! code E403
npm ERR! "You cannot publish over the previously published version 1.1.5." : openssl-self-signed-certificate
npm ERR!
npm ERR! If you need help, you may report this error at:
npm ERR! <https://github.com/npm/npm/issues>
npm ERR! Please include the following file with any support request:
npm ERR! /home/travis/build/neverendingqs/openssl-self-signed-certificate/npm-debug.log
No stash found.
Done. Your build exited with 0.
在情况下,它是很重要的,我有test
脚本packages.json
设置为exit 0
,但在发布阶段之前发生的,所以这不应该是问题(?)。
为什么Travis CI在发布失败时报告构建失败?
编辑:
我用特拉维斯CI CLI通过运行travis setup npm
,基于https://docs.travis-ci.com/user/deployment/npm/建立NPM发布。
我.travis.yml
看起来是这样的:
language: node_js
deploy:
provider: npm
email: myemail
api_key:
secure: blahblahblah
on:
tags: true
repo: neverendingqs/openssl-self-signed-certificate
你的脚本必须以0 退出状态已经退出这是特拉维斯关心的唯一事情。
如果你正在运行一个脚本,做:
npm publish
那么它应该做的:
npm publish || exit 1
或类似的东西,以确保与非该命令退出脚本-zero状态,如果npm publish
命令失败。
您没有包含任何代码示例,但这是我怀疑可能在这里发生的。
其实它更复杂。 假设你有一个脚本,script1
失败:
#!/bin/sh
exit 1
和你有另一个脚本,script2
运行它:
#!/bin/sh
./script1
然后运行./script2
也将导致错误 - 运行以下命令:
./script2 && echo OK || echo ERROR
将打印错误。但是当你以后有另一个命令时:
#!/bin/sh
./script1
echo
然后运行./script2
这次这次不会返回错误。运行:
./script2 && echo OK || echo ERROR
将打印确定。
因此,如果您的npm publish
是脚本中的最后一条命令,那么它应该导致整个脚本向系统返回一个错误状态,但是如果不是这样,则系统将获得状态0,意味着成功。
这一切都取决于特拉维斯运行的脚本实际上是怎样的。
我遇到了一个不同的问题,因为我们的一些封装和缩小脚本位于after_success
部分,甚至连接命令并没有使构建失败,直到我后来发现这是设计。
https://docs.travis-ci.com/user/customizing-the-build/#Breaking-the-Build
“如果任何在构建生命周期的第一四个阶段的命令返回一个非零退出代码,构建已破坏: 如果before_install
,安装或before_script
返回非零退出代码,构建有差错时,立即停止。 如果script
返回非零退出代码,构建失败,而是继续被标记为失败之前运行。 的after_success
退出代码,after_failure
,after_script
和后续阶段不会影响构建结果。但是,如果这些阶段超时一个,构建被标记为失败。”
所以我提出这些命令install
和非零退出代码并开始失败的构建。
我已经更新我如何生成'.travis.yml'内容的问题。 – neverendingqs