Jenkins Multibranch Pipeline缺乏对PathRestriction触发器的支持

时间:2018-05-21 21:12:34

标签: git jenkins jenkins-pipeline

目标

针对java更改更频繁地构建我们的repo,而对于docker基础映像更改则更少。

场合

我们有两个多分支管道作业:build-javabuild-base-docker。我们希望build-base-docker触发master&仅当推送包含/docker下的更改时才会显示要素分支。

方法

关注cloudbees How to Customize Checkout for Pipleine Multibranch? doc,我们实施了以下更改。

但是,如果我们不希望它发生,src/main/java/foo.java的更改会触发该分支的build-base-docker作业。

这真的只是JENKINS-36195 bug还是我做错了导致意外触发?

node('java-build') {

stage ('git checkout') {
    checkout([
            $class: 'GitSCM',
            branches: scm.branches,
            extensions: scm.extensions + [
                [$class: 'PathRestriction', excludedRegions: '.*', includedRegions: 'docker/.*']
            ],
            userRemoteConfigs: [[credentialsId: 'our-git-repo-deploy-key', url: 'git@github.com:we/our-repo.git']]

    ])
}
...
}

1 个答案:

答案 0 :(得分:2)

如果Jenkins无法很好地处理多分支管道的路径限制,那么我们可以从管道代码(或从共享库中)来减少重复。

如果我们有多个结帐,这可能会产生一些问题,因为所有报告都会报告。但是,如果它们不使用相同的布局,则误报的风险很低。例如,jenkins-shared-library通常会看到/ vars目录下的变化而不是docker。

node() {
    if ( ! doChangesRequireBuild('^docker/.*')) {
        currentBuild.result = 'ABORTED'
        return 'Changes not made to docker/... base image files. Aborting build'
    }
}

/**
 * Provide List of changed file paths since last successful build
 */
def getChangedFiles() {
    def found = []

    for (def changeSet in currentBuild.getChangeSets()) {
        for (def change in changeSet.logs) {
            for (def path in change.paths) {
                found.add(path.path)
            }
        }
    }
    return found
}

/**
 * do changes since last successful build mandate a build?
 * @param pathRegex path restriction regex pattern
 * @return true if any file paths match the regex
 */
boolean doChangesRequireBuild(def pathRegex) {

    for (def path in getChangedFiles()) {
        if ( path ==~ pathRegex) {
            return true
        }
    }
    return false
}