16

如何将 Jenkins 管道项目的范围限制为仅在使用更改特定子目录中的文件时才构建Jenkinsfile

我有一个包含两个目录的 Git 存储库。每个目录都包含一个单独的子项目,我想由 Jenkins 使用Jenkinsfile. 该项目具有以下文件结构:

parent
 |
 +- subA
 |   |
 |   + Jenkinsfile
 |   + more files related to sub project A
 |
 +- subB
     |
     + Jenkinsfile
     + more files related to sub project B

Jenkinsfilefor具有以下subA配置:

checkout scm: [
    $class: 'GitSCM',
    branches: [[name: '*/master']],
    userRemoteConfigs: [[url: 'https://[path]/parent.git']],
    extensions: [[
        $class: 'PathRestriction', includedRegions: 'subA/.*'
    ]]
]

Jenkinsfilefor类似,唯一的subB区别是它指定subBincludedRegions

在 Jenkins 服务器中,我创建了两个管道项目并Jenkinsfile分别指向它们。如果文件夹中的文件发生更改,subA则会触发 Jenkins 管道项目 A,如果文件夹中的文件发生更改,subB则会触发 Jenkins 管道项目 B,这正是我所期望的。

问题是如果文件被更改,Jenkins 管道项目 A 也会被触发,subB反之亦然。

詹金斯版本:2.3


注意:将设置Additional Behaviours-> Polling ignores commits in certain paths->配置Included RegionssubA/.*subB/.*分别在旧 Jenkins(版本 1.649)GUI 中会导致预期的行为。


更新:

添加excludedRegions到 Jenkinsfiles,例如

checkout scm: [
    $class: 'GitSCM',
    branches: [[name: '*/master']],
    userRemoteConfigs: [[url: 'https://[path]/parent.git']],
    extensions: [[
        $class: 'PathRestriction', excludedRegions: '', includedRegions: 'subA/.*'
    ]]
]

不会改变行为。尽管文件仅在一个子目录中更改,但仍会重建两个子项目。

4

2 回答 2

3

正如这个问题所暗示的,这还不被支持。

于 2018-03-13T09:05:02.660 回答
1

有一个未解决的问题阻止正常运行:https ://issues.jenkins-ci.org/browse/JENKINS-36195

它有一个解决方法,即禁用远程轮询([$class: 'DisableRemotePoll']):

checkout([$class: 'GitSCM',
  branches: [[name: "*/master"]],
  extensions: [
    [$class: 'PathRestriction', excludedRegions: '', includedRegions: '<fill me in with regex \n delimited, leave excludedRegions as empty>'],
    [$class: 'DisableRemotePoll']
  ],
  submoduleCfg: [],
  userRemoteConfigs: [[url: "<my git url>", credentialsId: "$GIT_KEY"]]])
于 2019-02-06T19:35:00.477 回答