在使用多分支作业和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 {
...
}
}
...
...
}
答案 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
块下的代码将被执行,构建将被中止。
这里有几点说明:
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 {
...
}
}