Jenkins管道里程碑没有取消之前正在进行的构建

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)


war*_*hod 8

我不认为此行为是“如果我是跨越此里程碑的较新版本,那么所有超过此里程碑的较旧版本都将被取消”

里程碑步骤的实际行为是,当一个新的管道首先越过它时,它将阻止较旧的管道越过该里程碑。

  • 是的——关键是已经跨越里程碑的旧版本不受影响。里程碑强制构建按顺序进行,但一旦完成,就不会触及它们。 (2认同)

D.W*_*D.W 7

根据文档,我对里程碑插件有一个简单的解决方法:

  • 内部版本按顺序传递里程碑(将内部版本号作为分类字段)。
  • 如果较新的版本已通过里程碑,则较旧的版本将不会继续(它们将中止)。
  • 当某个构建超过某个里程碑时,任何通过先前里程碑但未超过该里程碑的较旧的构建都将中止。
  • 一旦构建通过里程碑,它将永远不会被尚未通过里程碑的较新构建中止。

您可以尝试这样的事情:

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的进程(如果当前正在运行)。