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



我在构建时注意到https://travis-ci.org/neverendingqs/openssl-self-signed-certificate/builds/187723295我在标记回购时忘记增加补丁版本。但是,生成报告为passing,尽管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.

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

为什么Travis CI在发布失败时没有报告构建失败?

编辑:

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

或者类似的东西,以确保具有该命令的脚本在npm publish命令失败时以非零状态退出。

您没有包含任何代码示例,但我怀疑这里可能会发生这种情况。

事实上,这更为复杂。假设您有一个脚本script1失败:

#!/bin/sh
exit 1

还有另一个脚本script2运行它:

#!/bin/sh
./script1

那么运行./script2也会导致错误-运行这个:

./script2 && echo OK || echo ERROR

将打印ERROR。但当你稍后有另一个命令时:

#!/bin/sh
./script1
echo

则本次运行CCD_ 11不会返回错误。运行:

./script2 && echo OK || echo ERROR

将打印正常。

因此,如果npm publish是脚本中的最后一个命令,那么它应该会导致整个脚本向系统返回错误状态,但如果不是,那么系统将获得状态0,这意味着成功。

这一切都取决于特拉维斯正在运行的剧本到底是什么样子。

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

我遇到了另一个问题,因为我们的一些打包和缩小脚本位于after_success部分,即使是连接命令也没有使构建失败,直到我后来发现这是设计的。

https://docs.travis-ci.com/user/customizing-the-build/#Breaking-构建

"如果构建生命周期前四个阶段中的任何命令返回非零退出代码,则构建将中断:如果before_install、install或before_script返回非零退出代码,则生成将出错并立即停止。如果script返回非零退出代码,则生成失败,但在标记为失败之前继续运行。after_successafter_failureafter_script及后续阶段的退出代码不影响构建结果但是,如果其中一个阶段超时,则构建将标记为失败。">

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

最新更新