Jenkins:忽略管道构建步骤中的失败
使用jenkins build flow插件,这是可能的:Jenkins:忽略管道构建步骤中的失败,jenkins,jenkins-pipeline,Jenkins,Jenkins Pipeline,使用jenkins build flow插件,这是可能的: ignore(FAILURE){ build( "system-check-flow" ) } 如何使用声明性管道语法实现这一点?在新管道中,可以使用try-catch实现这一点 node{ try{ build job: 'system-check-flow' } catch (err){ echo "system-check-flow failed" } try
ignore(FAILURE){
build( "system-check-flow" )
}
如何使用声明性管道语法实现这一点?在新管道中,可以使用try-catch实现这一点
node{
try{
build job: 'system-check-flow'
}
catch (err){
echo "system-check-flow failed"
}
try{
build job: 'job2'
}
catch (err){
echo "job2 failed"
}
}
在这里,它将构建“系统检查流”作业。如果失败,它将捕获错误,忽略,然后继续构建“job2”要忽略声明性管道中失败的步骤,基本上有两个选项:
script
step和try catch
block(类似于R_K之前的主张,但采用声明式)catchError
echo
步骤(以及以下任何其他步骤)
但这两个选项之间有一个重要的区别。在第一种情况下,如果try
部分引发异常,则不会更改总体生成状态(因此echo currentBuild.result
=>SUCCESS
)。在第二种情况下,整个构建将失败(因此echo currentBuild.result
=>失败
)
这一点很重要,因为在第一种情况下(通过设置
currentBuild.result='FAILURE'
),您始终可以使整个生成失败,但是无法在第二种情况下修复生成(currentBuild.result='SUCCESS'
).在最新版本中,可以将propogate=false
选项传递到构建步骤
链接:
示例:
构建作业:“jobName”,传播:false
对于我的departive管道,我找到了另一个解决方案:
stage('Deploy test')
{
steps
{
bat returnStatus: true, script: 'sc stop Tomcat9'
// The return value of the step will be the status code!
// evaluate return status yourself, or ignore it
}
}
sh命令在Unix平台上执行脚本也同样适用
该示例忽略了返回状态,因为tomcat可能已经停止,因为之前的管道运行失败。我一直在寻找答案,我发现了一个解决方法!我把try/catch块放在整个舞台上:
try {
stage('some-stage') {
//do something
}
} catch (Exception e) {
echo "Stage failed, but we continue"
}
try {
stage("some-other-stage") { // do something }
} catch (Exception e) {
echo "Stage failed, but we still continue"
}
因此,您将得到如下结果:
这仍然不理想,但它给出了必要的结果 除了简单地使阶段通过外,现在还可以使阶段失败,但继续管道并通过构建:
pipeline {
agent any
stages {
stage('1') {
steps {
sh 'exit 0'
}
}
stage('2') {
steps {
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
sh "exit 1"
}
}
}
stage('3') {
steps {
sh 'exit 0'
}
}
}
}
在上面的示例中,所有阶段都将执行,管道将成功,但阶段2将显示为失败:
正如您可能已经猜到的,您可以自由选择buildResult
和stageResult
,以防它不稳定或其他任何情况。您甚至可以使构建失败并继续执行管道
只需确保您的Jenkins是最新的,因为此功能仅在之后可用。在此之前,catchError
仍然可用,但没有参数:
steps {
catchError {
sh "exit 1"
}
}
有关完整的讨论,请参阅。尝试以下示例:
stage('StageName1')
{
steps
{
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE')
{
SomeCodeThatCanBeErrored
}
}
}
stage('StageName2')
{
steps
{
ContinueOtherCode
}
}
如果是像拆卸一样的步骤,可以将步骤脚本放在“post”步骤中 代码如下:
post {
always {
script {
try{
echo 'put your alway need run scripts here....if it's a teardown like step'
}catch (err) {
echo 'here failed'
}
script{
emailext (
xxxx
)
}
}
虽然这看起来可以工作,但它不是使用声明性管道语法构建的。@Sven这不是问题-您可以将
try{}..catch(){}
包装到脚本{}
块中,使其在声明性syntaxcatchError中工作,现在不推荐使用。宁愿尝试catchcatch(err){echo err}
,引发错误java.lang.ClassCastException:org.jenkinsci.plugins.workflow.steps.EchoStep.message需要类java.lang.String,但收到类hudson.AbortException
。首选echo err.getMessage()
@lenkovi您在哪里读到的catchError不推荐?在jenkins文档中找不到任何此类语句。在侧节点上,您可以将catchError
也用作stage选项。如果您有多个子阶段希望捕获父阶段中的错误,则此功能非常有用。例如stage('Test'){options{catchError(消息:“Test failed”,stageResult:'UNSTABLE',buildResult:'UNSTABLE')}stages{…}
@Jroger谢谢,我刚刚建议解决这个问题!我的用例是许多独立的构建,由于硬件限制,它们无法并行运行,但即使第一个构建失败,它们仍然必须全部运行@Stacey我喜欢你的解决方案,你可以捕获阶段内的所有错误,并通过将所有坏的阶段添加到一个长列表中来忽略它们,然后在任何构建失败时“重新抛出”,就在最后。因为在这里,坏的阶段仍然超出了失败的“范围”。主要是因为它消除了重新抛出代码中的逻辑错误和捕获中的任何意外错误。这对我不起作用。我在«try»上遇到以下错误:«WorkflowScript:预期为一个阶段»。您知道这是什么版本吗?好吧,这不是关于构建步骤,而是关于是否将faile从“jobName”传播到运行它的构建。
stage('StageName1')
{
steps
{
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE')
{
SomeCodeThatCanBeErrored
}
}
}
stage('StageName2')
{
steps
{
ContinueOtherCode
}
}
post {
always {
script {
try{
echo 'put your alway need run scripts here....if it's a teardown like step'
}catch (err) {
echo 'here failed'
}
script{
emailext (
xxxx
)
}
}