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