我注意到在构建 https://travis-ci.org/neverendingqs/openssl-self-signed-certificate/builds/187723295 时我忘记在标记 repo 时增加补丁版本。但是,即使 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 退出。
这是特拉维斯唯一关心的事情。
如果您运行的脚本执行以下操作:
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 正在运行的脚本的实际外观。
关于node.js - 为什么即使 npm 发布失败,Travis CI 仍报告构建成功?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41399546/