我正在测试Jenkins,看它是否适合我们的构建和测试框架。我发现Jenkins及其可用的插件符合我们的大部分需求。除了我似乎无法找到如何做一种特定类型的任务的帮助。
我们正在为嵌入式设备创建应用程序。我们有100个需要在这些设备上运行的测试。如果我们在构建之后在一个设备上运行所有测试,那么将需要几个小时才能获得结果。但是,如果我们并行运行100个设备上的测试,那么我们可以在更短的时间内获得结果。
所有测试都有非常相似的起点。使用设备的IP地址调用测试脚本以运行测试和用户名/ pw。该脚本将对设备进行必要的测试,并报告每个测试项目的通过/失败。
我认为这样做的漫长/痛苦的方法是在Jenkins中编写100个作业,每个作业将直接使用不同的测试脚本(使用上述参数)并使用可用的插件并行运行。但是,从长远来看,保持所有这些工作将是非常困难的。
因此,更好的方法是创建一个Job(让它称之为child_tester),它可以带有以下参数:test script name,device of device,user name / pw等。然后使用另一个作业(让我们称之为mother_tester)使用不同的IP地址调用child_tester作业100次并且并行运行它们。我需要一些方法来累积child_tester作业的每个单独运行的所有测试结果,并将它们报告给mother_tester。
我的问题是有一个插件或任何方式在詹金斯完成这个?我查看了名为" Build Flow"," Parallel Test Executor"和" Parameterized Trigger"的插件信息。但是,它们似乎不适合我的需要。
答案 0 :(得分:12)
我知道你已经查看了Build Flow插件,但我不确定你为什么要解雇它。也许你可以指出我提案中的漏洞。
假设您的系统中有足够的执行程序来并行运行作业,我认为Build Flow plugin和Build Flow Test Aggregator plugin可以执行您想要的操作。
Build Flow插件支持running jobs in parallel。我没有看到为什么Build Flow无法安排您的“子”作业与不同参数并行运行的任何原因。
Build Flow Test Aggregator从Build Flow作业的预定构建中获取测试结果,因此您的“子”作业需要发布自己的测试结果。
您需要配置“子”作业,以便通过在作业配置中选中“必要时执行并发构建”来并行运行它。
无论哪组从站提供与嵌入式设备的连接,都需要足够的执行程序来并行运行您的作业。
更新:使用简单的构建流程定义:
parallel (
{ build("dbacher flow child", VALUE: 1) },
{ build("dbacher flow child", VALUE: 2) },
{ build("dbacher flow child", VALUE: 3) },
{ build("dbacher flow child", VALUE: 4) }
)
我得到了输出:
parallel {
Schedule job dbacher flow child
Schedule job dbacher flow child
Schedule job dbacher flow child
Schedule job dbacher flow child
Build dbacher flow child #5 started
Build dbacher flow child #6 started
Build dbacher flow child #7 started
Build dbacher flow child #8 started
dbacher flow child #6 completed
dbacher flow child #7 completed
dbacher flow child #5 completed
dbacher flow child #8 completed
}
作业历史记录显示所有四个作业都在几秒钟内安排完成。但是,作业构建步骤包含一个人工延迟(睡眠),可以防止任何单个构建快速完成。
更新2 :以下是从另一个数据结构动态生成并行任务列表的示例:
// create a closure for the deploy job for each server
def paramValues = (1..4)
def testJobs = []
for (param in paramValues) {
def jobParams = [VALUE: param]
def testJob = {
// call build
build(jobParams, "dbacher flow child")
}
println jobParams
testJobs.add(testJob)
}
parallel(testJobs)
传递给parallel的列表是一个闭包列表,它使用唯一参数调用构建。我必须确保在闭包函数之外定义作业参数,以确保单独调度作业。
我在Jenkins邮件列表上的另一个answer和this thread处理了语法。
答案 1 :(得分:3)
请确保Manage Jenkins中的执行者数量 - >管理节点设置超过MultiJob项目中单个作业的数量。 默认情况下,我猜它是2.因此我们需要增加它。