Dynamic 如何在jenkins中动态触发下游构建?

Dynamic 如何在jenkins中动态触发下游构建?,dynamic,triggers,jenkins,build-triggers,Dynamic,Triggers,Jenkins,Build Triggers,我们希望在jenkins的不同下游构建中动态触发集成测试。我们有一个参数化的集成测试项目,它将测试名称作为参数。我们根据git repo动态确定测试名称 我们有一个父项目,它使用jenkins cli为源代码中的每个测试启动集成项目的构建。父项目和集成项目通过匹配指纹进行关联 这种方法的问题是聚合测试结果不起作用。我认为问题在于“下游”集成测试是通过jenkins cli启动的,因此jenkins没有意识到它们是下游的 我看过很多jenkins插件,试图让它工作。Join和参数化触发器插件没有帮

我们希望在jenkins的不同下游构建中动态触发集成测试。我们有一个参数化的集成测试项目,它将测试名称作为参数。我们根据git repo动态确定测试名称

我们有一个父项目,它使用jenkins cli为源代码中的每个测试启动集成项目的构建。父项目和集成项目通过匹配指纹进行关联

这种方法的问题是聚合测试结果不起作用。我认为问题在于“下游”集成测试是通过jenkins cli启动的,因此jenkins没有意识到它们是下游的

我看过很多jenkins插件,试图让它工作。Join和参数化触发器插件没有帮助,因为它们希望生成一个静态的项目列表。参数化触发器可用的参数工厂也无法工作,因为没有工厂可以创建任意参数列表。日志触发器插件无法工作


Groovy Postbuild插件看起来应该可以工作,但我不知道如何从中触发构建。

既然您已经在动态启动下游作业,那么您可以等到它们完成后再复制测试结果文件(我会将它们归档到下游作业中,然后下载“构建”工件)到父工作区。您可能需要手动聚合文件,这取决于测试插件是否可以处理多个测试结果页面。在父作业的后期构建步骤中,配置适当的测试插件。

使用Groovy后期构建插件,可能类似的东西会起作用(还没有尝试过)

实际上,我感到惊讶的是,如果对两个作业都进行指纹识别(例如,使用父作业的BUILD_TAG变量),则不会获取聚合结果。据我所知,詹金斯只是简单地将MD5金额与工作联系起来(通过cli触发不应影响聚合结果。不知何故,在维护上游/下游关系方面还存在一些我不知道的额外因素…

注意:应该让这个问题变得毫无意义,但我还没有机会更新我们的基础设施。

要启动不带参数的下游作业,请执行以下操作:

job = manager.hudson.getItem(name)
cause = new hudson.model.Cause.UpstreamCause(manager.build)
causeAction = new hudson.model.CauseAction(cause)
manager.hudson.queue.schedule(job, 0, causeAction)
要使用
参数启动下游作业,必须添加一个
参数操作
。假设
Job1
的参数
a
C
分别默认为“B”和“D”。即:

A == "B"
C == "D"
假设
Job2
具有相同的A和B参数,但也采用默认为“F”的参数
E
。以下
Job1
中的构建后脚本将复制其
A
C
参数,并将参数
E
设置为
A
C
的值的串联:

params = []
val = ''
manager.build.properties.actions.each {
    if (it instanceof hudson.model.ParametersAction) {
        it.parameters.each {
            value = it.createVariableResolver(manager.build).resolve(it.name)
            params += it
            val += value
        }
    }
}

params += new hudson.model.StringParameterValue('E', val)
paramsAction = new hudson.model.ParametersAction(params)

jobName = 'Job2'
job = manager.hudson.getItem(jobName)
cause = new hudson.model.Cause.UpstreamCause(manager.build)
causeAction = new hudson.model.CauseAction(cause)
def waitingItem = manager.hudson.queue.schedule(job, 0, causeAction, paramsAction)
def childFuture = waitingItem.getFuture()
def childBuild = childFuture.get()

hudson.plugins.parameterizedtrigger.BuildInfoExporterAction.addBuildInfoExporterAction(
    manager.build, childProjectName, childBuild.number, childBuild.result
)
您必须将
$JENKINS\u HOME/plugins/parameterized trigger/WEB-INF/classes
添加到Groovy Postbuild插件的
附加Groovy类路径中

def job = hudson.model.Hudson.instance.getJob("job")
def params = new StringParameterValue('PARAMTEST', "somestring")  
def paramsAction = new ParametersAction(params) 
def cause = new hudson.model.Cause.UpstreamCause(currentBuild)
def causeAction = new hudson.model.CauseAction(cause) 
hudson.model.Hudson.instance.queue.schedule(job, 0, causeAction, paramsAction) 
这就是最终对我有效的方法。

使用“执行系统groovy”对我有效 “剧本”


执行这个Groovy脚本

import hudson.model.*
import jenkins.model.*

def build = Thread.currentThread().executable

def jobPattern = "PUTHEREYOURJOBNAME"     
def matchedJobs = Jenkins.instance.items.findAll { job ->
    job.name =~ /$jobPattern/
}
matchedJobs.each { job ->
    println "Scheduling job name is: ${job.name}"
    job.scheduleBuild(1, new Cause.UpstreamCause(build), new ParametersAction([ new StringParameterValue("PROPERTY1", "PROPERTY1VALUE"),new StringParameterValue("PROPERTY2", "PROPERTY2VALUE")]))
}
如果您不需要将属性从一个构建传递到另一个构建,只需去掉参数操作


您计划的生成将具有与初始生成相同的“原因”。这是传递“更改”的好方法。如果不需要,请不要使用新的原因。上游使用(生成)在函数调用中

这不是我所希望的,但听起来它会起作用。我将暂时不讨论这个问题,希望有一个更简单的解决方案。9个月后,我终于有机会尝试一下。你的代码不起作用,但它让我开始了。脚本必须说
manager.hudson
,而不是
hudson
。加入插件然后给出一个错误,说需要一个
CauseAction
,所以我使用了
manager.hudson.queue.schedule(job,0 CauseAction)
。谢谢你给了我所需的火花。什么是
currentBuild
?没关系。我看到了“构建-当前构建(参见hudson.model.AbstractBuild)”另一方面,当我问问题或写答案时,我认为不存在这种情况。当我这样做时,我希望看到该构建显示为当前构建的下游构建。它正确地显示了启动构建为已启动构建的上游构建,但不是以其他方式-有任何方式实现吗?@willkil我有完全相同的问题,so我创建并回答了以下问题:@ChristianGoetze你知道吗?如何将下游版本与上游版本链接起来?常规的“触发其他项目”构建步骤的方式也适用于我。谢谢。除了从每个方法调用中删除hudson.model。
import hudson.model.*

def currentBuild = Thread.currentThread().executable

def job = hudson.model.Hudson.instance.getJob("jobname")
def params = new StringParameterValue('paramname', "somestring")  
def paramsAction = new ParametersAction(params) 
def cause = new hudson.model.Cause.UpstreamCause(currentBuild)
def causeAction = new hudson.model.CauseAction(cause) 
hudson.model.Hudson.instance.queue.schedule(job, 0, causeAction, paramsAction)
import hudson.model.*
import jenkins.model.*

def build = Thread.currentThread().executable

def jobPattern = "PUTHEREYOURJOBNAME"     
def matchedJobs = Jenkins.instance.items.findAll { job ->
    job.name =~ /$jobPattern/
}
matchedJobs.each { job ->
    println "Scheduling job name is: ${job.name}"
    job.scheduleBuild(1, new Cause.UpstreamCause(build), new ParametersAction([ new StringParameterValue("PROPERTY1", "PROPERTY1VALUE"),new StringParameterValue("PROPERTY2", "PROPERTY2VALUE")]))
}