詹金斯的工作能否因成功结果而中止?

时间:2017-03-25 13:28:30

标签: jenkins jenkins-pipeline

在使用多分支作业和Jenkins文件的声明性管道中,作业可以中止,使用success退出代码而不是failure退出代码吗?

在下面的阶段,我基本上检查启动作业的提交是否包含" ci skip",如果是,我想要中止该作业。

使用error会中止作业,但也会将其标记为红色(红色行)。我希望这份工作标有绿色的一行。

stage ("Checkout SCM") {
   steps {
      script {
         checkout scm
         result = sh (script: "git log -1 | grep '.*\\[ci skip\\].*'", returnStatus: true) 
         if (result == 0) {
            error ("'ci skip' spotted in git commit. Aborting.")
         }
      }
   }
}

修改

而不是上述内容,我现在尝试简单地跳过所有阶段,以防git提交包含" ci skip"。我的理解是,如果expression中的结果为false,则应跳过此阶段......

pipeline {
    environment {
        shouldBuild = "true"
    }
    ...
    ...
    stage ("Checkout SCM") {
        steps {
            script {
                checkout scm
                result = sh (script: "git log -1 | grep '.*\\[ci skip\\].*'", returnStatus: true) 
                if (result == 0) {
                    echo ("'ci skip' spotted in git commit. Aborting.")
                    shouldBuild = "false"
                }
            }
        }
    }

    stage ("Unit tests") {
        when {
            expression {
                return shouldBuild
            }
        }
        steps {
            ...
        }
    }
    ...
    ...
}

4 个答案:

答案 0 :(得分:4)

好的,所以让它工作的方法不是使用environment指令,而是使用parameters指令。

也就是说,在parameters

的顶部添加pipeline
parameters {
      booleanParam(defaultValue: true, description: 'Execute pipeline?', name: 'shouldBuild')
   }

检查git commit时,如果它包含“ci skip”,我会更改shouldBuild的值:

env.shouldBuild = "false"

然后在expression

expression {
    return env.shouldBuild != "false" 
}

就是这样。如果git提交包含“ci skip”,则跳过阶段,作业以SUCCESS结束。

答案 1 :(得分:2)

如果您要发送错误,则无法将状态更改为SUCCESS,因为a build result can only get worse

无论如何,我使用shared library将构建结果标记为NOT_BUILT来实现ci-skip功能。我认为这是一个更好的解决方案,因为您不需要在每个阶段添加when表达式。

此外,管道代码看起来更干净:

pipeline {
  stages {
    stage('prepare') { steps { ciSkip action: 'check' } }
    // other stages here ...
  }
  post { always { ciSkip action: 'postProcess' } }
}

有关库的代码,请参阅this answer

答案 2 :(得分:1)

您还可以使用when指令在一个阶段进行skip-ci检查。例如:

stages {
    stage("Check Preconditions") {
        when {
            expression {
                result = sh (script: "git log -1 | grep '.*\\[ci skip\\].*'", returnStatus: true) # Check if commit message contains skip ci label
                result == 0 # Evaluate the result
            }
        }
        steps {
            script {
                echo 'Got skip=ci, aborting build' # Just an info message
                currentBuild.result = 'ABORTED' # Mark the current build as aborted
                error('Skip-CI') # Here you actually stop the build
            }
        }
    }
    stage("Test") {
        ...
    }

我们的想法是,如果您遇到skip-ci条件,when块下的代码将被执行,构建将被中止。

这里有几点说明:

  • 管道仍然会以红色标记,但在Build History中 会看到灰色(中止)构建
  • 如果您使用的是Groovy沙箱,则需要通过In-process script approval批准签名staticMethod org.codehaus.groovy.runtime.DefaultGroovyMethods getAt java.lang.Object java.lang.String才能获得currentBuild.result = 'ABORTED'工作

P.S 如果您需要将构建标记为已中止,则此方法很有效。基本上,Jenkins会在[ci skip]条件下中止构建,因此这种状态看起来更合适。我假设,这也适用于currentBuild.result = 'SUCCESS'。否则,您可以尝试使用catchError指令

答案 3 :(得分:0)

执行此操作的声明性方法如下:

    stage ("Unit tests") {
        when {
            not {
                changelog '.*\\[ci skip\\].*'
            }
        }
        steps {
            ...
        }
    }