Node.js 为什么即使npm发布失败,Travis CI仍报告构建成功?

Node.js 为什么即使npm发布失败,Travis CI仍报告构建成功?,node.js,travis-ci,npm-publish,Node.js,Travis Ci,Npm Publish,我注意到在构建时,我在标记repo时忘记了增加补丁版本。但是,即使由于版本已经存在,npm发布失败,生成仍报告为通过 下面是日志的结尾: 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

我注意到在构建时,我在标记repo时忘记了增加补丁版本。但是,即使由于版本已经存在,npm发布失败,生成仍报告为通过

下面是日志的结尾:

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.

脚本必须已退出,退出状态为0。 这是特拉维斯唯一关心的事情

如果您运行的脚本执行以下操作:

npm publish
那么它应该做到:

npm publish || exit 1
或者类似的东西,以确保在
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状态,表示成功


这完全取决于Travis正在运行的脚本的实际外观。

简单的回答是Travis CI不会从
npm publish
命令检查退出状态


这是当前部署中的一个普遍问题。请参见

我遇到了另一个问题,因为我们的一些打包和缩小脚本位于成功后的
部分,甚至连这些命令都没有失败,直到后来我发现这是出于设计

“如果生成生命周期前四个阶段中的任何命令返回非零退出代码,则生成将中断: 如果在_install
、install或_script之前
返回非零退出代码,则生成将出错并立即停止。
如果
script
返回非零退出代码,则生成失败,但在标记为失败之前继续运行。 成功后
失败后
脚本后
和后续阶段的退出代码不会影响生成结果。但是,如果其中一个阶段超时,则生成被标记为失败。”


因此,我将这些命令移到了
安装
,非零退出代码确实开始使构建失败。

我更新了问题,说明了如何生成
.travis.yml
内容。@rsp,从2018年开始感谢!这对我来说非常有用。在我的设置
(create react app+custom.travis.yml)
中,我一直在运行
npm测试----flags
并通过
|workalls
将输出传输到
工作服中,该工作服始终返回退出代码
0
./script2 && echo OK || echo ERROR