4

我在构建https://travis-ci.org/neverendingqs/openssl-self-signed-certificate/builds/187723295时注意到我在标记 repo 时忘记增加补丁版本。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.

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

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

编辑:

我使用 Travis CI CLI 通过运行来设置 NPM 发布travis setup 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
4

3 回答 3

2

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

于 2016-12-31T07:16:44.663 回答
2

您的脚本必须以退出状态 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 表示成功。

这完全取决于 Travis 正在运行的脚本的实际外观。

于 2016-12-30T16:52:29.730 回答
2

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

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

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

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

于 2018-03-06T20:34:36.483 回答