如何使 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不是很清楚)。