今天介绍一个插件 active-choices-plugin
级联参数
选择一个参数, 可以让另外一个参数选项 动态变化,
The plug-in includes the following parameter types:
Active Choices Parameter
Active Choices Reactive Parameter
Active Choices Reactive Reference Parameter
我自己魔改的
1, 仿照 extensible-choice-parameter-plugin 插件修改的。提供了几个 ChoiceListProvider 类型的class供选择。
本来是3个类型的 Parameter 的。现在改成一个,其他的都用 provicer 提供
2. 支持流水线:activeChoiceProvider, cascadeChoiceProvider, referenceChoiceProvider
3. 参数名改掉了, Active Choices Parameter 保持。
Active Choices Reactive Parameter 改成 CascadeChoiceProvider。
Active Choices Reactive Reference Parameter 改成 ReferenceChoiceProvider
4. 前2种用的多,利用前面2种类型 实现 级联参数。
5. 源码仓库: https://github.com/mamh-java/active-choices-plugin/commits/uno-choice-2.5.7-for-jenkins-2.249.3
特别说明:
修改后的版本都在 我司生成环境使用多年了。
参考例子
定义第一个参数 PLATFORM 返回 高通新片平台名
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| /** * 配置在 job 中的 PLATFORM 参数处. * 直接返回的是目前的3个平台名称,后续增加新的平台,就在这个return 后面新增就行. * * 使用方式要么把整个脚本文件内容 配置到jenkins工程中,要么保存为一个文件,放到jenkins master * 服务器上面, 必须是jenkins master 服务器上的一个文件路径, 不是slave服务器上的.然后jenkins * 工程中配置这样的: * evaluate(new File("/$JENKINS_HOME/groovy/paramsplatform.groovy")) * * */
def execGitCommand(gitDir, gitcmd){ def command="git -C ${gitDir} ${gitcmd}" def proc = command.execute() proc.waitFor() println "process git ${gitcmd} exit code: ${proc.exitValue()}" println "stdErr: ${proc.err.text}" println "stdOut: ${proc.in.text}" // 这些打印会在 /var/log/jenkins/jenkins.log 日志文件中保存 }
// 首先 更新 编译脚本参考,这个在 页面选择 PLATFORM 这个job的时候就会被调用。 // 更新这个的目的 是 获取 编译脚本中的 配置文件的,因为我们的编译是按照分支命名的一个一个的配置文件。 execGitCommand("$JENKINS_HOME/《你的编译脚本配置目录》", "fetch --all") execGitCommand("$JENKINS_HOME/《你的编译脚本配置目录》", "checkout origin/master")
// 目前的几个平台,后续增加新的平台,就在这个return 后面新增就行 return [平台名列表,这里省略。。。。, "sdm845"]
|
定义联动参数 branch
定义第二个 联动参数 ,就是 PLATFORM 选择那个,这个 第二个 参数会变化的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
| /** * 配置在 job 中的 BRANCH 参数处. * 通过 选择不同的 PLATFORM 值 来过滤 对应的 branch 值. 也就是过滤 config * 目录下面的子目录的. 后续添加了新的平台,新的子目录 根据需要修改这个脚本文件.和 工程配置. * * 使用方式要么把整个脚本文件内容 配置到jenkins工程中,要么保存为一个文件,放到jenkins master * 服务器上面, 必须是jenkins master 服务器上的一个文件路径, 不是slave服务器上的.然后jenkins * 工程中配置这样的: * * evaluate(new File("$JENKINS_HOME/groovy/paramsbranch.groovy")) * */
def getAllBranchList(configDir){ def dir = new File(configDir) def branchList=[] dir.eachDir{directory-> def branch = directory.getName().trim() if(!"common".equals(branch)){ branchList << branch } } branchList = branchList.sort {a,b -> return b[-8..-1].compareTo(a[-8..-1]) } return branchList }
def filterAllBranchList(branchList, filterList){ def brList = [] branchList.each {br-> filterList.each {filter-> if(br.startsWith(filter)){ brList << br } } //end filterList.each {filter-> } //end branchList.each {br-> return brList }
// 获取 配置文件目录 现 所有 分支名, 每个配置目录名 就是一个 分支名。 // 分支名 有的是 平台开头的,有的是 产品开头的,所以要用 filterAllBranchList 过滤出来分支名 // branchList 是 所有配置的 分支,包括全部平台的
def branchList = getAllBranchList("$JENKINS_HOME/《你的编译脚本配置目录》/config")
if (PLATFORM.equals("sdm845")) { return filterAllBranchList(branchList, ["sdm845", "产品名", "产品名"]) 。。。。。。 。。。。。。省略其他的判断 。。。。。。 。。。。。。 。。。。。。 。。。。。。 } else if (PLATFORM.equals("qm8150")) { return filterAllBranchList(branchList, ["qm8550", "产品名"]) } else { return ["nobranchelse"] }
|
流水线脚本中如何使用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
| activeChoice choiceListProvider: activeChoiceProvider( choiceType: 'PT_SINGLE_SELECT', filterLength: 1, filterable: false, script: groovyScript( fallbackScript: [classpath: [], sandbox: false, script: '''//之前的free job中是这么配置的 return ["默认 值"]
''' ], script: [classpath: [], sandbox: false, script: '''//之前的free job中是这么配置的 evaluate(new File("$JENKINS_HOME/groovy/paramsplatform.groovy")) ''' ] ) // end groovyScript() ), description: '平台名称', name: 'PLATFORM', randomName: 'choice-parameter-4163896451437017'
activeChoice choiceListProvider: cascadeChoiceProvider( choiceType: 'PT_SINGLE_SELECT', filterLength: 3, filterable: true, referencedParameters: 'ANDROID_PLATFORM', script: groovyScript( fallbackScript: [classpath: [], sandbox: false, script: '''//之前的free job中是这么配置的 return ["nobranch"] ''' ], script: [classpath: [], sandbox: false, script: '''//之前的free job中是这么配置的 evaluate(new File("$JENKINS_HOME/groovy/paramsbranch.groovy")) ''' ] ) // end groovyScript() ), description: '分支名称', name: 'BRANCH', randomName: 'choice-parameter-4164756292852419'
|
流水线脚本 不会 写 可以 使用 jenkins 上 带的 Declarative Directive Generator 通过界面 配置好需要的值如何生成 代码片段。