我有一个叫做multibranch-test的github存储库,带有两个子目录Project1,Project2。PS C:\Repos\multibranch-test> tree .Folder PATH listing for volume WindowsVolume serial number is 2085-6D3DC:\REPOS\MULTIBRANCH-TEST├───Project1└───Project2
每个子目录都有一个Jenkinsfile和该项目的代码。
在 Jenkins ,我有两个多分支管道工作-一个用于Project1,一个用于Project2。在Project1的配置中,如果在Project2的子目录中推送了提交,则我不希望通过推送通知或轮询来构建Project1。
因此,在Project1中,我配置了其他行为:
发生的事情是,如果我将提交推送到子目录Project2中的master,则将同时生成Project1和Project2作业。我只想构建Project2。有人可以指出我做错了什么吗?
两个项目的Jenkinsfiles相似,如下所示:
#!groovy
node {
stage ('checkout') {
checkout scm
}
stage ('build') {
dir ('Project1') {
bat 'powershell -Command gci'
bat 'powershell -Command gci env:'
bat 'powershell -File .\\Project1.ps1'
}
}
最佳答案
这对我们来说是一个很大的麻烦,但是我们能够通过一些变通办法解决它。
我们有一个由GitHub提交钩子(Hook)触发的Jenkins主工作。它找出自上一次提交以来发生了什么变化,然后触发其他特定于服务的Jenkins作业。
我们还使用了一些其他约定(例如,服务,目录和Jenkins作业的命名约定),但希望能对您有所帮助。
以下是解决方案中每个组件的分割:
C:\REPOS\MULTIBRANCH-TEST\Project1\Jenkinsfile
(您的构建逻辑在这里)C:\REPOS\MULTIBRANCH-TEST\Project2\Jenkinsfile
(您的构建逻辑在这里)C:\REPOS\MULTIBRANCH-TEST\change-sets.sh
#!/usr/bin/env bash
changeSets=(`git diff-tree --name-status HEAD`)
for(( i=0; i<${#changeSets[@]}; i++))
do
if [ ${changeSets[$i]} == "M" ]
then
echo ${changeSets[$i+1]}
fi
done
C:\REPOS\MULTIBRANCH-TEST\Jenkinsfile
#!/usr/bin/env groovy
pipeline {
agent any
stages {
stage('Define Services to Build') {
steps {
script {
def SERVICES_TO_BUILD = sh script:"./change-sets.sh", returnStdout: true
SERVICES_TO_BUILD.split("\n").each {
echo "Triggering build for ${it}"
try {
build job: "${it}", propagate: false, wait: false
} catch (ex) {
echo "Failed to trigger build for ${it}: ${ex.message}"
}
}
}
}
}
}
}