当使用Jenkins多分支管道作业时,如果在作业中选择Suppress Automatic SCM trigger,它将在索引分支后停止构建作业(功能很棒)。然而,由于某些原因,这也将杀死从SCM事件触发构建的能力!是否有任何方法可以阻止在分支发现(分支索引)后触发构建,但仍然通过SCM事件正常构建?
Suppress Automatic SCM trigger
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
<jenkins url>/job/<pipeline job name>/pipeline-syntax/globals
a5g8bdjr2#
我知道这篇文章很老了,但也许有人仍然有这个问题,首先你需要安装插件basic-branch-build-strategies:如果您使用的是Jenkins DSL:
buildStrategies { buildAllBranches { strategies { skipInitialBuildOnFirstBranchIndexing() } } }
tyu7yeag3#
这不是此功能-https://issues.jenkins-ci.org/browse/JENKINS-41980抑制SCM触发器应抑制由SCM中检测到的更改触发的所有构建,而不管更改是如何检测到的
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) } } } } } } // ... }
pu3pd22g5#
据我所知,这是因为当您设置“抑制自动SCM触发器”时,管道定义没有被读取。因此,所有触发器(SCM,上游。..),在您第一次运行作业之前,Jenkins不会知道您在管道中声明的。因此,如果你不希望构建由分支索引触发,请设置选项“抑制自动SCM触发器”如果你希望Jenkins知道你的管道,以便他可以对你的触发器做出React,你不应该设置“抑制自动SCM触发器”
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; }
hi3rlvi27#
若要跳过由构建索引触发的构建,可以将以下代码片段放入管道中。不需要额外的库。
when { // Run pipeline/stage only if not triggered by branch indexing. not { triggeredBy 'BranchIndexingCause' } }
bejyjqdl8#
使用@agabrys answer和修改后的suppressAutomaticTriggering props。将strategy设置为'INDEXING',并将triggeredBranchesRegex应用到这将应用到的分支-我只是将其设置为'。*'(所有分支)和github源码中指定的分支
multibranchPipelineJob { // ... branchSources { branchSource { source { // ... } strategy { allBranchesSame { props { suppressAutomaticTriggering { strategy('INDEXING') triggeredBranchesRegex('.*') } } } } } } // ... }
这里假设您有github plugin和Branch API plugin,当然还有job DSL插件此特定属性的文档可以在Jenkins安装中找到:https://[YOUR JENKINS DOMAIN]/plugin/job-dsl/api-viewer/index.html#path/multibranchPipelineJob-branchSources-branchSource-strategy-allBranchesSame-props-suppressAutomaticTrigging
8条答案
按热度按时间sqougxex1#
您可以随时向管道添加逻辑以在分支索引原因时中止。例如:
调整逻辑以适应您的用例。
编辑:嵌入在Jenkins UI中的流水线语法〉全局变量参考(例如。例如:
<jenkins url>/job/<pipeline job name>/pipeline-syntax/globals
)包含currentBuild全局变量的信息,这会导致一些javadoc:类型为RunWrapper的currentBuild变量可用于引用当前运行的构建。它具有以下可读属性:
...
rawBuild:
hudson. model。使用further APIs运行,仅适用于受信任的库或沙箱外的管理员批准的脚本;该值将不是可序列化的,因此您只能在标记为@NonCPS的方法中访问它
...
标签:jenkins.branch.BranchIndexingCause
a5g8bdjr2#
我知道这篇文章很老了,但也许有人仍然有这个问题,首先你需要安装插件basic-branch-build-strategies:
如果您使用的是Jenkins DSL:
tyu7yeag3#
这不是此功能-https://issues.jenkins-ci.org/browse/JENKINS-41980
抑制SCM触发器应抑制由SCM中检测到的更改触发的所有构建,而不管更改是如何检测到的
pgpifvop4#
在Jenkins backlog中有这样的功能的特性请求:JENKINS-63673 Allow configuring in NoTriggerBranchProperty which builds should be suppressed。我今天创建了一个pull request,所以将来它很有可能成为Branch API插件的一部分。同时,您可以使用自定义版本(see the build)。
如何使用JobDSL插件自动配置:
pu3pd22g5#
据我所知,这是因为当您设置“抑制自动SCM触发器”时,管道定义没有被读取。
因此,所有触发器(SCM,上游。..),在您第一次运行作业之前,Jenkins不会知道您在管道中声明的。
因此,如果你不希望构建由分支索引触发,请设置选项“抑制自动SCM触发器”如果你希望Jenkins知道你的管道,以便他可以对你的触发器做出React,你不应该设置“抑制自动SCM触发器”
scyqe7ek6#
我们可以相应地修改branch-api-plugin。https://github.com/jenkinsci/branch-api-plugin
此处为src/main/java/jenkins/分支/ www.example.com 在这个文件中,它决定触发构建的任务
在这里我修改了函数,使Feature分支不会被触发,但仍然会被添加到列表中。
默认情况下,它会评估复选框
Suppress Automatic SCM trigger
hi3rlvi27#
若要跳过由构建索引触发的构建,可以将以下代码片段放入管道中。不需要额外的库。
bejyjqdl8#
使用@agabrys answer和修改后的suppressAutomaticTriggering props。
将strategy设置为'INDEXING',并将triggeredBranchesRegex应用到这将应用到的分支-我只是将其设置为'。*'(所有分支)和github源码中指定的分支
这里假设您有github plugin和Branch API plugin,当然还有job DSL插件
此特定属性的文档可以在Jenkins安装中找到:
https://[YOUR JENKINS DOMAIN]/plugin/job-dsl/api-viewer/index.html#path/multibranchPipelineJob-branchSources-branchSource-strategy-allBranchesSame-props-suppressAutomaticTrigging