Jenkins: 使用groovy + job-dsl 创建并触发job
作者:不忘初心mao 发布时间:[ 2017/4/20 14:28:59 ] 推荐标签:软件测试 软件测试工具
背景:
我们的 Automation 测试脚本需要在10个不同语言的机器上跑,本地化测试产品。
我们用Jenkins启动测试执行,需要同时向1-10个机器发送文件和脚本运行命令,现有Jenkins的配置采用master/slave 机制如下:
Dispatcher Job:
1。 启用参数化,每个语言机器传递两个参数:
- Choice Parameter: slave Node 名,比如这里的NodeLabel1,表示第一台目标机器
- File Parameter: 要发送给目标机器的文件
2。 在Build Steps中trigger seed job:
Seed Job: 设置具体的运行脚本。
现有设计的问题:
运行很流畅,但是维护不方便
每个Slave Node都添加一个Choice Paramter 和 File Parameter,
Build Step中也要添加10次trigger seed job,
Steps中如有一处脚本改动,需重复改动10次
如果有新添加测试机器,需要在Parameters中手动添加新Node, 在Steps中也要添加。
改进需求:
自动获取所有Node列表,减少不必要的手动增添Node。
在Build Steps中,通过脚本trigger seed job,这样避免重复设置10次trigger step, 提高可重复性(Reusability)。
改进方案:
使用Groovy脚本,安装Jenkins插件:
Active Choices : 一个蛮好的参数化插件,可插入Groovy脚本和文件(集成Scriptlet插件)。
Scriptler :Groovy脚本插件,可以集中管理脚本文件。
Job-DSL : 一个很好的利用DSL设置和运行Job的插件。
具体实施:
准备global scripts,获取全部节点,用的是scriptler插件。
1。 在Jenkins->Scriptler中创建getAllNodeByProject.groovy文件,用来获取所有的Node机器。需要的话也可以加入一些筛选条件,比如在线与否。
scriptler中支持参数传递,这里的project是预先设置的参数,可在job调用该脚本时进行设置。
def list = jenkins.model.Jenkins.instance.slaves.findAll{
if (it.name.contains(project)) it.name
}.collect{it.name}
list.add(0,"None")
return list
2。 在Jenkins->Scriptler中创建getRuntimeNodes.groovy文件,用来获取dispatcher job在运行时指定的Node机器。
import hudson.model.*
def list =""
def runable=false
def build = Thread.currentThread()?.executable
// get the selected node parameter value at runtime
def nodes = build?.actions.find { it instanceof ParametersAction }?.parameters.collect{
(it instanceof StringParameterValue)?it.value:""
} as List
println "node is $nodes"
nodes.unique().removeAll(["None"])
nodes.remove(" ")
nodes.remove("")
if (nodes!=[]) {
list=nodes.join(",").toString()
}
println "list is: $list"
if (list!=" " && list!="") runable=true
println "runable is $runable"
build.addAction( new ParametersAction([new StringParameterValue("runtimeNodes",list)]))
build.addAction( new ParametersAction([new BooleanParameterValue("runable",runable)]))
运行结果是,在dispatcher job runtime会新建两个参数:
String参数 runtimeNodes: 存放运行时获取用户指定的Node 机器列表,用于后续在这些node 机器上分别trigger seed job
布尔型参数 runable:如果没有指定任何Node,则将runable设为false, 即不会trigger seed job
创建main,dispatcher和seed jobs
手动创建一个名为main的 job, 用来动态生成dispatcher and seed jobs.
在main中用job-dsl创建dispatcher job
在main job中,插入一个Process Job DSLs 构建步骤, 下面的代码会在运行时创建一个名为dispatcher的job:
为每个language node (“Client_CHS","Client_JPN") 设置了active choice node 参数和File参数。
创建一个conditional step, 如果符合条件,则trigger seed job,并将用户运行时指定的所有node以NodeListFactory参数方式传给seed job。
import hudson.model.*
// get all available nodes if its name contains "client" - specific for our project use;
def nodes = hudson.model.Hudson.instance.slaves.findAll{
if (it.name.contains("Client")) it.name
}.collect{it.name}
nodes.add(0,"None")
//def nodes = ["Client_JPN","Client_CHS"]
defineJob(nodes-["None"],"dispatcher") // setup the dispatcher job
// method to define a dispatcher job
def defineJob(nodes,jobName) {
return job(jobName) {
def list =[]
nodes.each {
def node =it
parameters {
activeChoiceParam(node) {
description('Allows user choose from choices')
filterable()
choiceType('SINGLE_SELECT')
scriptlerScript('getAllNodesByProject.groovy') {
parameter('project', 'Client')
}
}
fileParam(node+'_File', 'Select test case file to upload')
}
}
steps {
//systemGroovyScriptFile('${JENKINS_HOME}\scriptler\scripts\getRuntimeNodes.groovy') {
systemGroovyCommand(readFileFromWorkspace("${JENKINS_HOME}\scriptler\scripts\getRuntimeNodes.groovy")){
}
conditionalSteps {
condition {
booleanCondition("${runable}")
}
steps{ downstreamParameterized {
trigger('seed') {
/* parameters{
println node
nodeLabelBuildParameter {
name(node)
nodeLabel(node)
}*/
parameterFactories {
nodeListBuildParameterFactory {
// The name of the parameter to set.
name("test")
// A comma separated list of nodes to execute the job on.
nodeListString("${runtimeNodes}")
}
//booleanParam("f",true) /
}
}
}
}
}
}
}
}
现在运行 main job,成功后你会看到 dispatcher job 和 seed job 生成了
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11