目标
针对java更改更频繁地构建我们的repo,而对于docker基础映像更改则更少。
场合
我们有两个多分支管道作业:build-java
和build-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']]
])
}
...
}
答案 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
}