背景
我们在使用 Jenkins 做自动发布平台的时候遇到一个需求,即根据不同的版本分支,选择不同的主机环境,同时还需传入相应的程序版本号。最终实现 NexusOSS
仓库下载对应版本的程序包,自动化实现整个程序的发布。
Active Choices Plugin
经过查找,发现 Jenkins 的 ActiveChoicesPlugin
是支持实现这个功能的。
简介
Active Choices 插件提供了其他 Jenkins 参数类型,可以将其呈现为作业表单中的用户界面(UI)控件。它支持使用系统环境变量,全局节点属性,并且在 Groovy 上下文中支持自由作业的 Jenkins 项目。
安装插件后,将提供三种新的参数类型:
- 主动选择参数
- 主动选择反应参数
- Active Choices反应参考参数
Active Choices 参数允许用户选择作业参数的值。参数值可以是:
- 动态生成的(使用Groovy或Scriptler脚本)
- 根据其他UI参数动态更新
- 多值(可以有多个值)
- 使用各种UI控件(包括动态HTML)呈现
主动选择参数
Active Choices 参数使用 Groovy 脚本或 Scriptler 目录中的脚本为生成参数动态生成值选项列表。
示意图:
- Active Choices 参数可以呈现为标准选择列表,复选框和单选按钮。
- 可以选择显示一个文本框过滤器,以帮助过滤值选项。
主动选择反应式和反应式参考参数
参数使用 Groovy 脚本或 Scriptler 脚本动态生成构建参数的值选项,其他作业UI控件的值更改时,可以动态更新(主动选择)“反应式”和“反应式参考”参数(级联更新)
示意图:
- “Gender”参数更改时,"Professions”参数的值选项得到更新。
- 此外,当更新“Gender”参数时,也会动态更新显示为图片的反应性参考参数“ Gender_Balance”。
具体设置
安装插件
参数级联更新
勾选参数化构建,选择 ActiveChoicesParameter
设置代码分支参数:
- Name:设置参数 "Brach"
- Script:设置值脚本
- Description:设置参数描述信息
- ChoiceType:设置按钮形式
设置主机参数:
- Name:设置参数 "Hosts"
- Script:设置值脚本
- Description:设置参数描述信息
- ChoiceType:设置按钮形式
- Referenced parameters:关联参数,此处设置为上面的 “Branch”
Groovy Script:
1. dev = ["Dev_ALL","Dev_AutoTest","Dev_FunctionTest","Dev_Develop"]
2. release = ["Release_ALL","Release_AutoTest","Release_FunctionTest","Release_Develop"]
3.
4. if(Branch.equals("dev")){
5. return dev
6. }else if (Branch.equals("release")){
7. return release
8. }else {
9. return ["Unknown Hosts"]
10. }
设置版本参数:
- Name:设置参数 "Package_Name"
- Script:设置
GroovyScript
从文件中获取变量值 - Description:设置参数描述信息
- ChoiceType:设置按钮形式
- Referenced parameters:关联参数,此处设置为上面的 “Branch”
Groovy Script:
1. if(Branch.equals("dev")){
2. lineList = new File("D:\\Jenkins-workspace\\Jenkins\\workspace\\V3C-WEBAPP-Dev\\package_history.txt").readLines()
3. lineList.sort{it}
4. Collections.reverse(lineList)
5. lineList.each {
6. return it;
7. }
8. }else if (Branch.equals("release")){
9. lineList = new File("D:\\Jenkins-workspace\\Jenkins\\workspace\\V3C-WEBAPP-Release\\package_history.txt").readLines()
10. lineList.sort{it}
11. Collections.reverse(lineList)
12. lineList.each {
13. return it;
14. }
15. }else {
16. return ["Unknown Hosts"]
17. }
package_history.txt 内容参考:
在集成编译的时候,通过 Python 脚本把对应程序包名写入
package_history.txt:
1. # coding=utf-8
2.
3. # 获取Jenkins变量
4. WORKSPACE = os.getenv("WORKSPACE")
5.
6. def packagehistory(zipname):
7. Path = WORKSPACE+"\\package_history.txt"
8. f = open(Path,'a',encoding='utf-8')
9. f.write(zipname)
10. f.write("\n")
11. f.close()
实现效果
那么后续怎么接受参数呢?可以参考图中 shell 脚本设置:
1. #!/usr/bin/env bash
2. echo '版本类型:'$Branch
3. echo '环境类型:'$Hosts
4. echo '文件名称:'$Package_Name
5.
6. ansible-playbook /home/ansible/playbooks/v3c-deploy.yaml --extra-vars "package_name=$Package_Name branch=$Branch target=$Hosts"
小结
本文简要带着大家快速学习 Jenkins 中一个动态级联传参的小技巧,希望对大家有所帮助。
参考资源:
[1]:https://wiki.jenkins.io/display/JENKINS/Active+Choices+Plugin