jenkins 如何禁用分支索引中的触发器,但仍允许多分支作业中的SCM触发

z6psavjg  于 2023-04-29  发布在  Jenkins
关注(0)|答案(8)|浏览(205)

当使用Jenkins多分支管道作业时,如果在作业中选择Suppress Automatic SCM trigger,它将在索引分支后停止构建作业(功能很棒)。
然而,由于某些原因,这也将杀死从SCM事件触发构建的能力!
是否有任何方法可以阻止在分支发现(分支索引)后触发构建,但仍然通过SCM事件正常构建?

sqougxex

sqougxex1#

您可以随时向管道添加逻辑以在分支索引原因时中止。例如:

boolean isBranchIndexingCause() {
    def isBranchIndexing = false
    if (!currentBuild.rawBuild) {
      return true
    }

    currentBuild.rawBuild.getCauses().each { cause ->
      if (cause instanceof jenkins.branch.BranchIndexingCause) {
        isBranchIndexing = true
      }
    }
    return isBranchIndexing
  }

调整逻辑以适应您的用例。
编辑:嵌入在Jenkins UI中的流水线语法〉全局变量参考(例如。例如:<jenkins url>/job/<pipeline job name>/pipeline-syntax/globals)包含currentBuild全局变量的信息,这会导致一些javadoc:
类型为RunWrapper的currentBuild变量可用于引用当前运行的构建。它具有以下可读属性:
...
rawBuild:
hudson. model。使用further APIs运行,仅适用于受信任的库或沙箱外的管理员批准的脚本;该值将不是可序列化的,因此您只能在标记为@NonCPS的方法中访问它
...
标签:jenkins.branch.BranchIndexingCause

a5g8bdjr

a5g8bdjr2#

我知道这篇文章很老了,但也许有人仍然有这个问题,首先你需要安装插件basic-branch-build-strategies:
如果您使用的是Jenkins DSL:

buildStrategies {
  buildAllBranches {
    strategies {
      skipInitialBuildOnFirstBranchIndexing()
    }
  }
}
tyu7yeag

tyu7yeag3#

这不是此功能-https://issues.jenkins-ci.org/browse/JENKINS-41980
抑制SCM触发器应抑制由SCM中检测到的更改触发的所有构建,而不管更改是如何检测到的

pgpifvop

pgpifvop4#

在Jenkins backlog中有这样的功能的特性请求:JENKINS-63673 Allow configuring in NoTriggerBranchProperty which builds should be suppressed。我今天创建了一个pull request,所以将来它很有可能成为Branch API插件的一部分。同时,您可以使用自定义版本(see the build)。
如何使用JobDSL插件自动配置:

multibranchPipelineJob {
    // ...

    branchSources {
        branchSource {
            source {
               // ...
            }
            strategy {
               allBranchesSame {
                    props {
                        suppressAutomaticTriggering  {
                            strategyId(2)
                        }
                    }
                }
            }
        }
    }

    // ...
}
pu3pd22g

pu3pd22g5#

据我所知,这是因为当您设置“抑制自动SCM触发器”时,管道定义没有被读取。
因此,所有触发器(SCM,上游。..),在您第一次运行作业之前,Jenkins不会知道您在管道中声明的。
因此,如果你不希望构建由分支索引触发,请设置选项“抑制自动SCM触发器”如果你希望Jenkins知道你的管道,以便他可以对你的触发器做出React,你不应该设置“抑制自动SCM触发器”

scyqe7ek

scyqe7ek6#

我们可以相应地修改branch-api-plugin。https://github.com/jenkinsci/branch-api-plugin
此处为src/main/java/jenkins/分支/ www.example.com 在这个文件中,它决定触发构建的任务
在这里我修改了函数,使Feature分支不会被触发,但仍然会被添加到列表中。
默认情况下,它会评估复选框Suppress Automatic SCM trigger

@Extension
    public static class Dispatcher extends Queue.QueueDecisionHandler {

        private static final Logger LOGGER = Logger.getLogger(Dispatcher.class.getName());

        @SuppressWarnings("rawtypes") // untypable
        @Override
        public boolean shouldSchedule(Queue.Task p, List<Action> actions) {

                LOGGER.log(Level.INFO, "[TARUN_DEBUG] TASK NAME : "+ p.getName());
            if(p.getName().startsWith("feature")||p.getName().startsWith("bugfix")){
                return false;
            }
            else if(p.getName().startsWith("release")||p.getName().equals("master")||p.getName().startsWith("develop")||p.getName().startsWith("part of")||p.getName().startsWith("PR-")){
                
            }
            else{
                LOGGER.log(Level.INFO, "[TARUN_DEBUG] NOT TRIGGERED "+p.getName());
                return false;
            }

            for (Action action : actions) {
                if (action instanceof CauseAction) {
                    for (Cause c : ((CauseAction) action).getCauses()) {
                        if (c instanceof BranchIndexingCause) {
                            if (p instanceof Job) {
                                Job<?,?> j = (Job) p;
                                OverrideIndexTriggersJobProperty overrideProp = j.getProperty(OverrideIndexTriggersJobProperty.class);
                                if (overrideProp != null) {
                                    return overrideProp.getEnableTriggers();
                                } else {
                                    return true;
                                }
                            }
                        }
                    }
                }
            }
            return true;
        }
hi3rlvi2

hi3rlvi27#

若要跳过由构建索引触发的构建,可以将以下代码片段放入管道中。不需要额外的库。

when {
    // Run pipeline/stage only if not triggered by branch indexing.
    not {
        triggeredBy 'BranchIndexingCause'
    }
}
bejyjqdl

bejyjqdl8#

使用@agabrys answer和修改后的suppressAutomaticTriggering props。
将strategy设置为'INDEXING',并将triggeredBranchesRegex应用到这将应用到的分支-我只是将其设置为'。*'(所有分支)和github源码中指定的分支

multibranchPipelineJob {
    // ...

    branchSources {
        branchSource {
            source {
               // ...
            }
            strategy {
               allBranchesSame {
                    props {
                        suppressAutomaticTriggering  {
                            strategy('INDEXING')
                            triggeredBranchesRegex('.*')
                        }
                    }
                }
            }
        }
    }

    // ...
}

这里假设您有github pluginBranch API plugin,当然还有job DSL插件
此特定属性的文档可以在Jenkins安装中找到:
https://[YOUR JENKINS DOMAIN]/plugin/job-dsl/api-viewer/index.html#path/multibranchPipelineJob-branchSources-branchSource-strategy-allBranchesSame-props-suppressAutomaticTrigging

相关问题