我有一个名为multibranch-test的github repo,有两个子目录Project1,Project2 .
PS C:\Repos\multibranch-test> tree . Folder PATH listing for volume Windows Volume serial number is 2085-6D3D C:\REPOS\MULTIBRANCH-TEST ├───Project1 └───Project2
每个子目录都有一个Jenkins文件和该项目的代码 .
在Jenkins中,我有两个multibranch管道作业 - 一个用于Project1,另一个用于Project2 . 在Project1的配置中,如果在Project2的子目录中推送了提交,我不希望推送通知或轮询来构建Project1 .
所以在Project1中我配置了附加行为:
-
Advanced clone behaviours :检查浅克隆
-
Sparse checkout path 设置为Project1#
-
Polling ignores commits in certain paths
-
Included Regions: Project1 / *
-
Excluded Regions: *
-
Build Configuration :脚本路径:Project1 / Jenkinsfile
发生的事情是,如果我在子目录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'
}
}
3 回答
这对我们来说是一个很大的麻烦,但我们能够通过一些解决方法来解决它 .
我们有一个由GitHub提交钩子触发的主Jenkins作业 . 它计算出自上次提交以来发生了哪些变化,然后触发其他特定于服务的Jenkins作业 .
我们还有一些我们正在使用的其他约定(比如服务,目录和Jenkins作业的命名约定),这里没有指定,但希望这会帮助某人 .
以下是解决方案中每个组件的细分:
C:\REPOS\MULTIBRANCH-TEST\Project1\Jenkinsfile
(你的构建逻辑在这里)C:\REPOS\MULTIBRANCH-TEST\Project2\Jenkinsfile
(你的构建逻辑在这里)C:\REPOS\MULTIBRANCH-TEST\change-sets.sh
C:\REPOS\MULTIBRANCH-TEST\Jenkinsfile
默认的Jenkins行为是,如果项目的repo获得提交,则会重建项目,因此repo中的提交会为两个Jenkins项目生成事件并触发两个构建 . 看看詹金斯的文档:https://jenkins.io/doc/book/pipeline/
从詹金斯的角度来看,很难判断改变是否进入了项目1或2 - 立即可见的是“新观看回购” .
简单的解决方案是将repo拆分为每个项目的两个单独的repos . 由于它们应该单独构建,因此不应该成为问题 .
您可以为整个仓库创建一个作业,查看提交带给您的更改,然后触发项目1或2或两者的相应Jenkins文件