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

Jenkins 如何禁用分支索引中的触发器,但仍允许在多分支作业中触发SCM,jenkins,jenkins-pipeline,multibranch-pipeline,Jenkins,Jenkins Pipeline,Multibranch Pipeline,使用Jenkins多分支管道作业时如果在作业中选择Suppress Automatic SCM trigger,它将在索引分支后停止作业的构建(功能强大) 然而,由于某些原因,这也会破坏从SCM事件触发构建的能力 有没有办法阻止在分支发现(分支索引)后触发生成,但仍然通过SCM事件正常生成?这不是此功能- 抑制SCM触发器应抑制由SCM触发器触发的所有生成 检测到SCM中的更改,而不管如何检测更改 据我所知,这是因为设置“抑制自动SCM触发器”时未读取管道定义 因此,Jenkins不会知道您在管

使用Jenkins多分支管道作业时如果在作业中选择
Suppress Automatic SCM trigger
,它将在索引分支后停止作业的构建(功能强大)

然而,由于某些原因,这也会破坏从SCM事件触发构建的能力


有没有办法阻止在分支发现(分支索引)后触发生成,但仍然通过SCM事件正常生成?

这不是此功能-

抑制SCM触发器应抑制由SCM触发器触发的所有生成 检测到SCM中的更改,而不管如何检测更改


据我所知,这是因为设置“抑制自动SCM触发器”时未读取管道定义

因此,Jenkins不会知道您在管道中声明的所有触发器(SCM、上游…),除非您第一次运行作业

因此,如果您不希望分支索引触发生成,请设置选项“抑制自动SCM触发器”
如果您希望Jenkins知道您的管道,以便他能够对您的触发器做出反应,则不应设置“抑制自动SCM触发器”

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

  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中嵌入的Pipeline Syntax>全局变量引用(例如:
/job//Pipeline Syntax/globals
)包含有关currentBuild全局变量的信息,这导致一些Javadoc:

类型为的currentBuild变量可用于引用当前运行的生成。它具有以下可读属性:

原始版本:

a hudson.model.Run with,仅适用于受信任的库或沙盒外经管理员批准的脚本;该值将不可序列化,因此您只能在标记为@NonCPS的方法中访问它


另请参见:

我知道这篇文章很老了,但可能有人仍然存在这个问题,首先您需要安装插件基本分支构建策略:

如果您正在使用jenkins dsl:

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

Jenkins积压工作中存在对此类功能的功能请求:。我今天创建了一个pull请求,所以将来它有可能成为插件的一部分。同时,您可能需要使用自定义版本()

如何使用插件自动配置它:

multibranchPipelineJob {
    // ...

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

    // ...
}

我们可以相应地修改分支api插件

这里是src/main/java/jenkins/branch/OverrideIndexTriggersJobProperty.java 在这个文件中,它决定触发构建的任务

在这里,我修改了该函数,使功能分支不会被触发,但仍将被添加到列表中

默认情况下,它会计算复选框
抑制SCM自动触发

 @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;
        }
@扩展名
公共静态类调度程序扩展了Queue.QueueDecisionHandler{
私有静态最终记录器Logger=Logger.getLogger(Dispatcher.class.getName());
@SuppressWarnings(“rawtypes”)//不可复制
@凌驾
公共布尔shouldSchedule(Queue.Task p,列出操作){
LOGGER.log(Level.INFO,“[TARUN_DEBUG]任务名称:”+p.getName());
if(p.getName().startsWith(“功能”)| | p.getName().startsWith(“错误修复”)){
返回false;
}
否则如果(p.getName().startsWith(“释放”)| | p.getName().equals(“主控”)| | p.getName().startsWith(“开发”)| | p.getName().startsWith(“PR-”)的一部分){
}
否则{
LOGGER.log(Level.INFO,“[TARUN_DEBUG]未触发”+p.getName());
返回false;
}
for(操作:操作){
if(原因动作的动作实例){
对于(原因c:((原因动作)action.getCauses()){
if(c分支存在原因的实例){
if(作业的p实例){
作业j=(作业)p;
OverrideIndexTriggersJobProperty overrideProp=j.getProperty(OverrideIndexTriggersJobProperty.class);
if(overrideProp!=null){
返回overrideProp.getEnableTriggers();
}否则{
返回true;
}
}
}
}
}
}
返回true;
}

我想禁用该选项,但我不希望通过分支索引触发生成。除了
抑制自动SCM触发器
,还有其他方法不触发分支索引上的生成吗?似乎这是正确的方法。对于这些方法调用,如
rawBuild.getCaus,您有任何Jenkins文档链接吗es()
?查看Jenkins文档时没有看到这些控制机制。我看到博客和票证提到了它,但没有文档。谢谢。