我注意到在构建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
答案 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/issues/143
答案 2 :(得分: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
,并且非零退出代码确实开始使构建失败。