如果主服务器发生更改,Jenkins会触发作业,尽管另有配置

时间:2020-07-13 20:54:51

标签: jenkins jenkins-pipeline jenkins-plugins jenkins-job-dsl

我们有一个完全通过CasC配置的Jenkins实例。推出此版本后,我们注意到github-branch-sourceworkflow-multibranch的行为存在一些问题。

我们正在尝试扫描组织,以使用Jenkinsfile标识所有存储库,但不触发构建作业,尤其是对于仅更改了目标(主)的分支的情况。通过以下配置,我们已经取得了一定程度的成功:

  1. 已禁用“儿童扫描触发器”
  2. basic-branch-build-strategies设置“仅更改目标分支时忽略重建合并分支”
  3. 设置“跳过在第一个分支索引上的初始构建”

有了这些,我们就可以在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重新启动不会触发新的存储库扫描?甚至更好的是,在存储库级别上,只有目标分支发生更改时,有什么方法可以强制忽略重建合并分支吗?

2 个答案:

答案 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。

我同时具有以下三种策略:

  1. jenkins.branch.buildstrategies.basic.ChangeRequestBuildStrategyImpl
  2. jenkins.branch.buildstrategies.basic.NamedBranchBuildStrategyImpl
  3. 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>