Jenkins: 使用groovy + job-dsl 创建并触发job

Paloma ·
更新时间:2024-11-13
· 626 次阅读

  背景:   我们的 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 生成了



dsl groovy jenkins

需要 登录 后方可回复, 如果你还没有账号请 注册新账号