pun*_*eth 7 jenkins jenkins-pipeline
我正在尝试Jenkins管道和里程碑,并且无法弄清楚为什么Jenkins在新构建跨越里程碑时不取消之前的构建.
示例Jenkinsfile
pipeline {
agent any
parameters {
booleanParam(defaultValue: true, description: '', name: 'userFlag')
}
stages {
stage("foo") {
steps {
milestone(ordinal: 1, label: "BUILD_START_MILESTONE")
sh 'sleep 1000'
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
触发此管道两次不会取消第一个作业
ssh*_*pel 11
试试这个:
/* This method should be added to your Jenkinsfile and called at the very beginning of the build*/
@NonCPS
def cancelPreviousBuilds() {
def jobName = env.JOB_NAME
def buildNumber = env.BUILD_NUMBER.toInteger()
/* Get job name */
def currentJob = Jenkins.instance.getItemByFullName(jobName)
/* Iterating over the builds for specific job */
for (def build : currentJob.builds) {
/* If there is a build that is currently running and it's not current build */
if (build.isBuilding() && build.number.toInteger() != buildNumber) {
/* Than stopping it */
build.doStop()
}
}
}
Run Code Online (Sandbox Code Playgroud)
我不认为此行为是“如果我是跨越此里程碑的较新版本,那么所有超过此里程碑的较旧版本都将被取消”
里程碑步骤的实际行为是,当一个新的管道首先越过它时,它将阻止较旧的管道越过该里程碑。
- 内部版本按顺序传递里程碑(将内部版本号作为分类字段)。
- 如果较新的版本已通过里程碑,则较旧的版本将不会继续(它们将中止)。
- 当某个构建超过某个里程碑时,任何通过先前里程碑但未超过该里程碑的较旧的构建都将中止。
- 一旦构建通过里程碑,它将永远不会被尚未通过里程碑的较新构建中止。
您可以尝试这样的事情:
pipeline {
agent any
stages {
stage('Stop Old Build') {
steps {
milestone label: '', ordinal: Integer.parseInt(env.BUILD_ID) - 1
milestone label: '', ordinal: Integer.parseInt(env.BUILD_ID)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以将其放在任何管道的开头。
假设您只是开始一个新的构建,即#5。第一个里程碑将用于传递#4的第二个里程碑,第二个里程碑(第5个)将终止#4的进程(如果当前正在运行)。
| 归档时间: |
|
| 查看次数: |
4241 次 |
| 最近记录: |