![](/img/trans.png)
[英]Jenkins Multibranch Pipeline with Jenkinsfile not in repository
[英]Jenkins Multibranch Pipeline Lacks Support for PathRestriction triggers
目標
針對Java更改更頻繁地構建我們的repo,而對於docker基礎映像更改則更少。
情況
我們有兩個multibranch管道作業: build-java
和build-base-docker
。 我們希望build-base-docker僅在推送包含/docker
下的更改時才觸發主分支和功能分支。
途徑
關注cloudbees 如何自定義Pipleine Multibranch的Checkout? doc我們實施了以下更改。
但是,當我們不希望它執行時,對src/main/java/foo.java
會觸發該分支的build-base-docker
src/main/java/foo.java
作業。
這真的只是JENKINS-36195錯誤還是我做錯了導致意外觸發?
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']]
])
}
...
}
如果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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.