我们有一个完全通过CasC配置的Jenkins实例。推出此版本后,我们注意到github-branch-source
和workflow-multibranch
的行为存在一些问题。
我们正在尝试扫描组织,以使用Jenkinsfile标识所有存储库,但不触发构建作业,尤其是对于仅更改了目标(主)的分支的情况。通过以下配置,我们已经取得了一定程度的成功:
basic-branch-build-strategies
设置“仅更改目标分支时忽略重建合并分支” 有了这些,我们就可以在OrgScan期间使用Jenkinsfile识别新的存储库,但不会不必要地触发任何PR构建。
除非Jenkins重新启动,否则上述配置可以正常工作。在重新启动存储库扫描触发器的情况下,尽管我们具有“仅在目标分支发生更改时忽略重建合并分支”,但计划仅在主分支发生更改的情况下构建PR,如下所示,
Checking pull request #5417
‘Jenkinsfile’ found
Met criteria
Changes detected: PR-5417 (7202a80c95188db87f98ccf62157fdd76d41a206+81e38fbefa404bcbad7968ad07cd522acf68be8b (3017360542722f016bb24c584bf55b3fa88f4921) → 7202a80c95188db87f98ccf62157fdd76d41a206+65343d82d5966e02b2889a4b2c9582e8d3e46362 (02e307214a15d7f192236994695578d6b8dacb08))
Scheduled build for branch: PR-5417
这是一个巨大的问题,尤其是在某个时间点,我们可能同时为该组织上的单个存储库打开了50多个PR,更不用说其他存储库了。这不仅浪费了很多资源,还因为我们的詹金斯(Jenkins)在处理如此高的数量之前无法使用。
是否有任何方法可以确保Jenkins重新启动不会触发新的存储库扫描?甚至更好的是,在存储库级别上,只有目标分支发生更改时,有什么方法可以强制忽略重建合并分支吗??
答案 0 :(得分:1)
好吧,我猜我通过branch-api
插件源代码找到了答案。
问题似乎在这里https://github.com/jenkinsci/branch-api-plugin/blob/master/src/main/java/jenkins/branch/MultiBranchProject.java#L2246-L2257(截至2020年7月15日,v2.5.6)。如果任何构建策略返回true
,它将对任何分支/ PR始终返回true。
我同时具有以下三种策略:
jenkins.branch.buildstrategies.basic.ChangeRequestBuildStrategyImpl
jenkins.branch.buildstrategies.basic.NamedBranchBuildStrategyImpl
jenkins.branch.buildstrategies.basic.SkipInitialBuildOnFirstBranchIndexing
如果SkipInitialBuildOnFirstBranchIndexing
不是该存储库的第一个分支索引,则true
将始终返回ChangeRequestBuildStrategyImpl
,从而使branch-api
上的配置无效。
我不确定这是否是SkipInitialBuildOnFirstBranchIndexing
插件的预期行为,并在其Jira https://issues.jenkins-ci.org/browse/JENKINS-63088上创建了一个错误。尽管无法解决该问题,但我删除了json-typings.d.ts
并假设最新的Jenkins实例将在运行第一次扫描时构建所有PR和Branches产生巨大开销。
我希望这种解释可以对遇到同样问题的人有所帮助。
答案 1 :(得分:0)
在您至少一次构建它之前,目前无法解决此问题。
由于SkipInitialBuildOnFirstBranchIndexing
在注册新作业后抑制了初始构建触发器,因此build.xml
尚未可用于存储更改请求信息。在没有此信息的情况下,当詹金斯收到后续的钩子时,它无法执行比较以确定是否应触发构建。因此,它查找配置以查找为此已经存在的作业(即,它不符合初始构建的条件)并且启用了更改请求。因此,它继续进行并触发了构建。
第一次构建后,文件在$JENKINS_HOME/jobs/<my-repo>/branches/PR-1/builds/1/build.xml
可用。除其他细节外,它还包含以下与变更请求有关的信息(请注意哈希值):
<revision class="org.jenkinsci.plugins.github_branch_source.PullRequestSCMRevision" plugin="github-branch-source@2.5.8">
<head class="org.jenkinsci.plugins.github_branch_source.PullRequestSCMHead">
<name>PR-1</name>
<merge>true</merge>
<number>1</number>
<target>
<name>master</name>
</target>
<sourceOwner>ORG</sourceOwner>
<sourceRepo>my-repo</sourceRepo>
<sourceBranch>my/feature-branch</sourceBranch>
<origin class="jenkins.scm.api.SCMHeadOrigin$Default" plugin="scm-api@2.6.3"/>
</head>
<target class="jenkins.plugins.git.AbstractGitSCMSource$SCMRevisionImpl" plugin="git@4.0.0">
<head class="org.jenkinsci.plugins.github_branch_source.BranchSCMHead" reference="../../head/target"/>
<hash>9501c1d2dd5b29nso488909ec2b0aac14208b28</hash>
</target>
<baseHash>9501c1d2dd5b29nso488909ec2b0aac14208b28</baseHash>
<pullHash>du65a39j39j24368ab6561d260093e78d69b20549</pullHash>
<mergeHash>9d62w889092ef74c6a7a2d67897e91d70wb73hs8</mergeHash>
</revision>