今天介绍一个插件 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

定义第一个参数 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 通过界面 配置好需要的值如何生成 代码片段。