我正在测试 Jenkins,看看它是否适合我们的构建和测试框架。我发现 Jenkins 及其可用的插件满足了我们的大部分需求。除了我似乎无法找到有关如何完成特定类型任务的帮助。
我们正在为嵌入式设备创建应用程序。我们有数百个测试需要在这些设备上运行。如果我们在构建后在一台设备上运行所有测试,则需要几个小时才能获得结果。但是,如果我们在 100 个设备上并行运行测试,那么我们可以在更短的时间内获得结果。
所有的测试都有非常相似的起点。使用设备的 IP 地址和用户名/密码调用测试脚本以运行测试。该脚本将在设备上进行必要的测试并报告每个测试项目的通过/失败。
我认为这样做的漫长/痛苦的方法是在 Jenkins 中编写 100 个作业,每个作业将直接是一个不同的测试脚本(具有上述参数)并使用可用插件并行运行这些脚本。但是,从长远来看,维持所有这些工作将非常困难。
因此,更好的方法是创建一个 Job(我们称之为 child_tester),它可以接受以下参数:测试脚本名称、设备的 IP 地址、用户名/密码等。然后使用另一个作业(我们称之为it Mother_tester) 使用不同的 IP 地址调用 child_tester 作业 100 次并并行运行它们。我需要某种方式来累积每次运行 child_tester 作业的所有测试结果,并将它们报告给 Mother_tester。
我的问题是在 Jenkins 中是否有插件或任何方法可以实现这一点?我查看了名为“Build Flow”、“Parallel Test Executor”和“Parameterized Trigger”的插件信息。但是,它们似乎不符合我的需求。
最佳答案
我知道您已经查看了 Build Flow 插件,但我不确定您为什么不考虑它。也许你可以指出我的建议中的漏洞。
假设您的系统中有足够多的执行程序来并行运行作业,我认为 Build Flow plugin和 Build Flow Test Aggregator plugin可以做你想做的。
更新 :使用简单的构建流程定义:
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
}
作业历史记录显示,所有四个作业都在几秒钟内被调度。但是作业构建步骤包含人为延迟( sleep ),这会阻止任何单个构建快速完成。
更新 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 的列表是一个使用唯一参数调用构建的闭包列表。我必须确保在闭包函数之外定义作业参数,以确保单独安排作业。
我抄袭了另一个 answer 的语法和 this thread在 Jenkins 邮件列表中。
关于jenkins - 如何与 Jenkins 并行运行相同的工作多次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28705222/