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

时间:2016-12-30 16:36:37

标签: node.js travis-ci npm-publish

我注意到在构建https://travis-ci.org/neverendingqs/openssl-self-signed-certificate/builds/187723295时,我忘记在标记回购时增加补丁版本。但是,即使npm发布因版本已存在而失败,构建报告为passing

这是日志的尾端:

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在发布失败时没有报告构建失败?

编辑:

我使用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

3 个答案:

答案 0 :(得分:2)

您的脚本必须退出且退出状态为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

然后这次运行./script2这次不会返回错误。运行:

./script2 && echo OK || echo ERROR

将打印好。

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

这完全取决于Travis运行的脚本实际上是什么样的。

答案 1 :(得分:1)

简短的回答是,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

答案 2 :(得分:0)

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

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

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

所以我将这些命令移动到install,并且非零退出代码确实开始使构建失败。