如何使 Bitbucket 管道中的脚本 运行 失败?
How do I fail a script running in Bitbucket Pipelines?
当管道运行一系列节点命令时,如何在管道内触发失败?
我试过以下方法:
const failBuild = function(message) {
console.error('Deploy failed: ', message)
throw new Error('Deploy failed')
}
我看到 "Deploy failed" 消息,但管道仍然显示 "Success"。
当命令以非零退出代码退出时,Bb 管道失败。所以,如果你想让管道失败,你必须确保代码不为 0。
在你的情况下(稍后阅读此内容的人注意:见评论),你得到 0 作为退出状态,因为 throw
在承诺中执行,但随后在承诺的 [=11= 中被捕获] 函数——既不停止执行也不对退出代码产生任何影响。
解决方案:明确地 throw
catch()
函数中的一个错误。
对于可能为此苦苦挣扎的任何其他人...
如前所述,您需要 return 一个非零值,我发现最简单的方法是将负整数传递给 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);
}
已接受的答案指出:
Solution: explicitly throw an error in the catch() function.
因此,如果我理解正确,建议您将脚本编写为:
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
哪个好一点(除了stacktrace不是很清楚)。
当管道运行一系列节点命令时,如何在管道内触发失败?
我试过以下方法:
const failBuild = function(message) {
console.error('Deploy failed: ', message)
throw new Error('Deploy failed')
}
我看到 "Deploy failed" 消息,但管道仍然显示 "Success"。
当命令以非零退出代码退出时,Bb 管道失败。所以,如果你想让管道失败,你必须确保代码不为 0。
在你的情况下(稍后阅读此内容的人注意:见评论),你得到 0 作为退出状态,因为 throw
在承诺中执行,但随后在承诺的 [=11= 中被捕获] 函数——既不停止执行也不对退出代码产生任何影响。
解决方案:明确地 throw
catch()
函数中的一个错误。
对于可能为此苦苦挣扎的任何其他人...
如前所述,您需要 return 一个非零值,我发现最简单的方法是将负整数传递给 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);
}
已接受的答案指出:
Solution: explicitly throw an error in the catch() function.
因此,如果我理解正确,建议您将脚本编写为:
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
哪个好一点(除了stacktrace不是很清楚)。