19

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

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

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

我查看了许多 jenkins 插件以尝试使其正常工作。Join 和 Parameterized Trigger 插件无济于事,因为它们希望构建一个静态的项目列表。可用于参数化触发器的参数工厂也不起作用,因为没有工厂可以创建任意参数列表。日志触发器插件不起作用。

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

4

6 回答 6

16
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) 

这最终对我有用。

于 2014-06-17T11:38:48.807 回答
7

注意:管道插件应该使这个问题没有实际意义,但我还没有机会更新我们的基础设施。

启动不带参数的下游作业:

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)

要使用参数启动下游作业,您必须添加一个ParametersAction. 假设Job1有参数AC默认分别为“B”和“D”。IE:

A == "B"
C == "D"

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

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_HOME/plugins/parameterized-trigger/WEB-INF/classes到 Groovy Postbuild 插件的Additional groovy classpath.

于 2012-12-07T22:52:51.387 回答
4

执行这个 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")]))
}

如果您不需要将属性从一个构建传递到另一个构建,只需取出 ParametersAction。

您计划的构建将与您的初始构建具有相同的“原因”。这是传递“更改”的好方法。如果您不需要这个,请不要在函数调用中使用 new Cause.UpstreamCause(build)

于 2016-11-28T22:09:12.337 回答
1

由于您已经动态地启动下游作业,您如何等到它们完成并将测试结果文件(我会将它们存档在下游作业中,然后只需下载“构建”工件)到父工作区。您可能需要手动聚合文件,具体取决于测试插件是否可以与多个测试结果页面一起使用。在父作业的后期构建步骤中配置适当的测试插件。

于 2012-01-17T19:00:58.910 回答
1

使用 Groovy Postbuild Plugin,也许这样的东西会起作用(还没有尝试过)

def job = hudson.getItem(jobname)
hudson.queue.schedule(job)

我实际上很惊讶,如果您对两个作业都进行指纹识别(例如,使用父作业的 BUILD_TAG 变量),则不会获取聚合结果。据我了解,Jenkins 只是查看 md5sums 来关联作业(聚合下游测试结果并通过 cli 触发不应影响聚合结果。不知何故,还有一些额外的事情可以维持我不知道的上游/下游关系.. .

于 2012-02-29T20:55:45.843 回答
1

这对我有用“执行系统常规脚本”

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)
于 2015-06-24T09:25:50.087 回答