当前位置: 首页 > 知识库问答 >
问题:

如何区分Jenkins管道中的构建触发器

李谦
2023-03-14

我希望在我的Jenkinsfile中添加一个条件阶段,该阶段根据构建的触发方式运行。目前,我们设置为构建由以下方式触发:

  1. 对 git 存储库的更改,这些更改是在分支索引中选取的
  2. 用户使用 UI 中的“立即生成”按钮手动触发生成。

是否有任何方法可以根据这些操作中的哪些操作触发了构建来运行不同的管道步骤?

共有3个答案

单于正业
2023-03-14

在没有currentBuild.rawBuild访问的JenkinsPipeline中,可以通过以下方式检索构建原因:

// started by commit
currentBuild.getBuildCauses('jenkins.branch.BranchEventCause')
// started by timer
currentBuild.getBuildCauses('hudson.triggers.TimerTrigger$TimerTriggerCause')
// started by user
currentBuild.getBuildCauses('hudson.model.Cause$UserIdCause')

您可以使用以下方式获取布尔值:

isTriggeredByTimer = !currentBuild.getBuildCauses('hudson.triggers.TimerTrigger$TimerTriggerCause').isEmpty()

或者,当< code>getBuildCauses()返回一个数组时,数组的大小将与Groovy truthy语义一起正确工作:

if (currentBuild.getBuildCauses('hudson.triggers.TimerTrigger$TimerTriggerCause')) {
蔚学真
2023-03-14

获取工作流运行原因的能力已在2.22版(2018年11月2日)中发布到支持管道的API插件中。JENKINS-41272中请求了该功能。

该版本向< code>currentBuild全局变量添加了两个方法:

< code>getBuildCauses

  • 返回当前生成的生成原因的JSON数组

实验性-可能会更改< code > getBuildCauses(String cause class)

  • 获取一个表示完全限定的原因类的字符串,并返回由该类型过滤的当前构建原因的JSON数组,如果没有指定类型的原因适用于当前构建,则返回一个空JSON数组

以及我提交的一个例子:

echo "${currentBuild.buildCauses}" // same as currentBuild.getBuildCauses()
echo "${currentBuild.getBuildCauses('hudson.model.Cause$UserCause')}"
echo "${currentBuild.getBuildCauses('hudson.triggers.TimerTrigger$TimerTriggerCause')}"

和输出:

[Pipeline] echo
[[_class:hudson.model.Cause$UserIdCause, shortDescription:Started by user anonymous, userId:null, userName:anonymous], [_class:org.jenkinsci.plugins.workflow.cps.replay.ReplayCause, shortDescription:Replayed #12]]
[Pipeline] echo
[]
[Pipeline] echo
[]
[Pipeline] End of Pipeline
Finished: SUCCESS

currentBuild似乎存在问题。GetBuildCause(type)当<code>类型currentBuild.GetBuildCause('org.jenkinsci.plugins.workflow.cps.replay.ReplayCause')失败,出现java.lang.ClassNotFoundException。JENKINS-54673中报告了管道的2.22版本:支持API(工作流支持)插件。据报道,它已在<code>2.24</code>版本中修复。

庄博厚
2023-03-14

以下代码应该用于确定用户是否已启动管道或计时器/其他触发器:

def isStartedByUser = currentBuild.rawBuild.getCause(hudson.model.Cause$UserIdCause) != null
 类似资料:
  • 我有一个Jenkins管道作业(不是多分支管道),管道内的逻辑之一是,当gitlab scm上有一个合并请求时,我想基于触发此生成的合并请求的源分支构建一些东西。 我的问题是,在Jenkinsfile中,我如何动态地获取这个源分支,签出代码,并创建一个工作区,以便在这个分支上运行构建?

  • 问题内容: 我希望根据我的构建触发方式向我的Jenkinsfile添加一个条件阶段。目前,我们的设置是通过以下方式触发的: 分支索引中获取的git repo更改 用户使用用户界面中的“立即构建”按钮手动触发构建。 有什么方法可以运行不同的流水线步骤,具体取决于其中哪些操作触发了构建? 问题答案: 以下代码可以确定用户是否已启动管道或计时器/其他触发器:

  • 问题内容: 标题大多是这样说的。如何从远程git存储库触发Jenkins多分支管道项目构建? “ Trigger远程构建”构建触发器选项似乎不起作用,因为没有保存您设置的令牌。 问题答案: 目前(Jenkins 2.22),“触发触发器远程构建”构建触发选项在多分支管道作业配置中可见,但不起作用(如果您检查并指定了令牌,则无论如何保存后都会重置)。根据这个,这是故意的触发器不能确定,但一个错误,它

  • 我们看到在Jenkins多分支管道项目上触发了重复构建。构建通常使用来自Bitbucket的推送通知触发,并使用以下插件:https://marketplace.atlassian.com/plugins/com.nerdwin15.stash-stash-webhook-jenkins/server/overview 然而,出于某种原因,我们现在看到了“双重”构建。如果查看触发的两个生成,一个由

  • 我有一个不包含Jenkinsfile的存储库——我没有办法影响存储库本身。这意味着我既不能在存储库中添加也不能更改任何文件(在本例中,它是Qt-repo)。 我想做的是创建多个jenkinsfile,每个文件都为不同的目标配置和构建Qt库,或者运行不同的附加脚本<所有这些Jenkins文件将收集在不同的存储库中。 现在,我的问题是如何创建一个管道作业,一旦Qt存储库中发生更改,就会触发该作业,但使

  • 在freestyle作业中,在stage Build trigger上有一个名为“GitHub hook trigger for GITScm polling”的选项。 屏幕截图如下: 与gitlab配置中的webhook一起使用”http://myjenkins/gitlab/notify_commit“它工作正常,这意味着在将某些内容推送到存储库时将自动触发生成。但为什么在多分支管道中只有一个