如何在Bitbucket管道中运行脚本失败?

时间:2017-09-04 14:35:29

标签: bitbucket bitbucket-pipelines

当管道运行一系列节点命令时,如何在管道中触发故障?

我尝试了以下内容:

const failBuild = function(message) {
  console.error('Deploy failed: ', message)
  throw new Error('Deploy failed')
}

我看到"部署失败"消息,但管道仍然说"成功"。

3 个答案:

答案 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

哪个更好(除了堆栈跟踪不是很清楚)。