为什么Travis CI会报告构build成功,即使npm发布失败?

我注意到生成https://travis-ci.org/neverendingqs/openssl-self-signed-certificate/builds/187723295 ,我忘了增加补丁版本时,标记回购。 但是,即使由于版本已经存在导致npm发布失败,构build报告也会通过。

这里是日志的尾部:

 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. 

如果这很重要,我将packages.jsontest脚本设置为exit 0 ,但是在发布阶段之前发生,所以不应该是问题(?)。

为什么Travis CI在发布失败时报告构build失败?

编辑:

我使用Travis CI CLI通过运行基于https://docs.travis-ci.com/user/deployment/npm/的 travis setup 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 

简单的答案是,Travis CI不检查npm publish命令的退出状态。

https://github.com/travis-ci/dpl/blob/a255a0d8efe897f8ea5a194a8a2ef73556e27817/lib/dpl/provider/npm.rb#L35

目前这是部署的一个普遍问题。 见https://github.com/travis-ci/dpl/issues/143

您的脚本必须退出,退出状态为0.这是Travis唯一关心的事情。

如果你正在运行一个脚本,

 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表示成功的状态。

这一切都取决于特拉维斯运行的脚本实际上是怎样的。