继续Jenkins管道过去失败的阶段

时间:2016-11-15 01:28:58

标签: jenkins jenkins-pipeline

我有一系列快速检查的阶段。即使有失败,我也想要完成它们。例如:

stage('one') {
    node {
        sh 'exit 0'
    }
}
stage('two') {
    node {
        sh 'exit 1'   // failure
    }
}
stage('three') {
    node {
        sh 'exit 0'
    }
}

阶段two失败,因此默认情况下,阶段three不会执行。

通常这是parallel的工作,但我想在舞台视图中显示它们。在下面的模拟中:

  • 构建#4显示正常情况。作业two失败,因此three无法运行。
  • I Photoshopped Build#6显示我想看到的内容。作业two失败并显示,但three仍然运行。真正的Jenkins可能会显示整个Build#6略带红色,这当然没问题。

Mock up of desired Stage View result

8 个答案:

答案 0 :(得分:7)

我有同样的担忧,我能够解决这个问题。

第二阶段将以红色显示并标记为失败,同时其余阶段将继续运行。 您可以设置一个标志,并在阶段结束时检查该标志,您可以通知整个构建的状态。

node {

    def build_ok = true

    stage('one') {
        sh 'exit 0'
    }

    try{
        stage('two') {
            sh 'exit 1'   // failure
        }
    } catch(e) {
        build_ok = false
        echo e.toString()  
    }

    stage('three') {
        sh 'exit 0'
    }

    ....

    if(build_ok) {
        currentBuild.result = "SUCCESS"
    } else {
        currentBuild.result = "FAILURE"
    }
}

答案 1 :(得分:5)

这应该有效。但是,即使只有一个框失败,所有框都是红色的,但是您可以看到标有错误的框,这样您就可以轻松区分失败的作业。

def indexes = ['one', 'two', 'three']

node() {
    for (index in indexes) {
        catchError {
            stage(index) {
                println index
                sh '''echo "123"'''
            }
        }
    }
}

答案 2 :(得分:4)

使用

  

传播:假

如果上一阶段失败,则移至下一阶段。

示例:

stage('<stage-name>'){
    node('<node-name>'){
        build job: '<job-name>', propagate: false
    }
}

stage('<stage-name>'){
    node('<node-name>'){
        build job: '<job-name>'
    }
}

答案 3 :(得分:2)

这取决于您使用的是declarative pipeline syntax还是scripted pipeline syntax

声明性管道语法

pipeline {
    agent any
    stages {
        stage('one') {
            steps {
                sh 'exit 0'
            }
        }
        stage('two') {
            steps {
                sh 'exit 1'   // failure
            }
        }
    }
    post {
        always {
            sh 'exit 0'
        }
    }
}

Post-condition blocks包含stepssteps部分相同。

脚本化管道语法

node {

    def build_ok = true

    stage('one') {
        sh 'exit 0'
    }

    try{
        stage('two') {
            sh 'exit 1'   // failure
        }
    } catch(e) {
        build_ok = false
        echo e.toString()  
    }

    stage('three') {
        sh 'exit 0'
    }

    if(build_ok) {
        currentBuild.result = "SUCCESS"
    } else {
        currentBuild.result = "FAILURE"
    }
}

答案 4 :(得分:2)

现在可以。以下是声明性管道的示例,但是catchError也适用于脚本化管道。

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将显示为失败:

Pipeline Example

您可能已经猜到了,可以随意选择buildResultstageResult,以防不稳定或其他原因。您甚至可以使构建失败并继续执行管道。

只需确保您的Jenkins是最新的,因为这是一个相当新的功能。

答案 5 :(得分:1)

我通过后期操作解决了这个问题: https://jenkins.io/doc/pipeline/tour/post/

 const scrollTrigger = useScrollTrigger(() => {{ target: contentRef.current }});

答案 6 :(得分:0)

解决方案::为了始终继续执行詹金斯管道中失败的步骤:

选项1 。在try / catch或bash脚本<someOpertation> || true

中包装功能

尝试/捕获:

script {
  try {
      sh 'do your stuff'
  } catch (Exception e) {
      sh 'Handle the exception!'
  }
}

bash始终为真:

script {
  sh 'cp ~/someFile.txt ~/dev || true'
}

选项2。并行运行jenkins管道,并在您的步骤中设置failFast false配置属性。

    pipeline {
    agent any
    stages {
        stage('Parallel Stage') {
            when {
                branch 'master'
            }
            failFast false
            parallel {
                stage('Branch A') {
                    agent {
                        label "for-branch-a"
                    }
                    steps {
                        echo "On Branch A"
                    }
                }
                stage('Branch B') {
                    agent {
                        label "for-branch-b"
                    }
                    steps {
                        echo "On Branch B"
                    }
                }
            }
        }
    }
}

答案 7 :(得分:0)

尝试以下示例:

stage('StageName1')
{
    steps
    {
        catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE')
        {
            SomeCodeThatCanBeErrored
        }
    }
}
stage('StageName2')
{
    steps
    {
        ContinueOtherCode
    }
}