当管道运行一系列节点命令时,如何在管道中触发故障?
我尝试了以下内容:
const failBuild = function(message) {
console.error('Deploy failed: ', message)
throw new Error('Deploy failed')
}
我看到"部署失败"消息,但管道仍然说"成功"。
答案 0 :(得分:2)
当命令以非零退出代码退出时,Bb管道失败。因此,如果您希望管道失败,则必须确保代码不是0。
在你的情况下(注意以后读这篇文章的人:请参阅注释),你得到0作为退出状态,因为throw
在一个promise中执行,但随后在promise的catch()
函数中被捕获 - 既不会停止执行也不会对退出代码产生任何影响。
解决方案:明确throw
catch()
函数中的错误。
答案 1 :(得分:0)
对于其他可能为此感到挣扎的人...
如上所述,您需要返回非零,我发现最简单的方法是将负整数传递给PHP的exit()
函数。
https://php.net/manual/en/function.exit.php
if($condition == true)
{
// Whatever we were doing, it worked YAY!!
exit();
}
else
{
// Something went wrong so fail the step in the pipeline
exit(-1);
}
答案 2 :(得分:0)
可接受的答案指出:
解决方案:在catch()函数中明确抛出错误。
因此,如果我理解正确,则建议您将脚本编写为:
async function main() { throw "err"; }
main().catch(e => { throw e; });
但是,这不起作用:退出代码仍为0,并且控制台显示讨厌的警告:
> node "main.js"
(node:32996) UnhandledPromiseRejectionWarning: err
(node:32996) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 2)
(node:32996) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
> $?
0
将错误冒泡到节点进程的正确方法是:
process.on('unhandledRejection', up => { throw up });
async function main() { throw "err"; }
main();
这样,您将得到以下结果:
> node "main.js"
test2.js:1
process.on('unhandledRejection', up => { throw up });
^
err
> $?
1
哪个更好(除了堆栈跟踪不是很清楚)。