我们希望在jenkins中的不同下游构建中动态触发集成测试。我们有一个参数化集成测试项目,它将测试名称作为参数。我们从git repo动态确定我们的测试名称。
我们有一个父项目,它使用jenkins-cli为源代码中的每个测试启动集成项目的构建。父项目和集成项目通过匹配指纹相关联。
这种方法的问题是聚合测试结果不起作用。我认为问题是“下游”集成测试是通过jenkins-cli开始的,所以jenkins并没有意识到它们是下游的。
我看了很多jenkins插件试图让这个工作。 Join和Parameterized Trigger插件没有帮助,因为他们希望构建一个静态的项目列表。可用于参数化触发器的参数工厂也不起作用,因为没有工厂可以创建任意参数列表。日志触发器插件无效。
Groovy Postbuild插件看起来应该可以工作,但我无法弄清楚如何从中触发构建。
答案 0 :(得分:12)
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)
这最终对我有用。
答案 1 :(得分:5)
注意:Pipeline Plugin应该会使这个问题失败,但我没有机会更新我们的基础设施。
要启动下游作业不带参数:
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
的参数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_HOME/plugins/parameterized-trigger/WEB-INF/classes
添加到Groovy Postbuild插件的Additional groovy classpath
。
答案 2 :(得分:1)
由于您已经动态启动了下游作业,因此等待它们完成并复制测试结果文件(我将它们存档在下游作业上,然后只是下载“构建”工件)到父工作区。您可能需要手动聚合文件,具体取决于Test插件是否可以与多个测试结果页面一起使用。在父作业的后期构建步骤中,配置相应的测试插件。
答案 3 :(得分:1)
使用Groovy Postbuild插件,也许这样的东西会起作用(没试过)
def job = hudson.getItem(jobname)
hudson.queue.schedule(job)
我真的很惊讶,如果您指纹两个作业(例如使用父作业的BUILD_TAG变量),则不会拾取聚合结果。根据我的理解,Jenkins只是查看md5sums来关联作业(Aggregate downstream test results并且通过cli触发不应该影响聚合结果。不知何故,还有一些额外的东西来维持我不知道的上游/下游关系。 ..
答案 4 :(得分:1)
这对我使用“Execute system groovy” 脚本“
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)
答案 5 :(得分:1)
执行此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取出即可。
您安排的构建将与初始构建具有相同的“原因”。这是传递“改变”的好方法。如果你不需要这个,就不要在函数调用中使用新的Cause.UpstreamCause(build)