持续交付之解决Jenkins自动发布中交互式参数应用

举报
zuozewei 发表于 2021/09/27 22:12:53 2021/09/27
【摘要】 我们在使用 Jenkins 做自动发布平台的时候遇到一个需求,即根据不同的版本分支,选择不同的主机环境,同时还需传入相应的程序版本号。最终实现 Nexus OSS 仓库下载对应版本的程序包,自动化实现整个程序的发布。

背景

我们在使用 Jenkins 做自动发布平台的时候遇到一个需求,即根据不同的版本分支,选择不同的主机环境,同时还需传入相应的程序版本号。最终实现 Nexus OSS 仓库下载对应版本的程序包,自动化实现整个程序的发布。

Active Choices Plugin

经过查找,发现 Jenkins 的 Active Choices Plugin 是支持实现这个功能的。

简介

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”。

具体设置

安装插件

在这里插入图片描述

参数级联更新

勾选参数化构建,选择 Active Choices Parameter

设置代码分支参数:
在这里插入图片描述

  • Name:设置参数 “Brach”
  • Script:设置值脚本
  • Description:设置参数描述信息
  • ChoiceType:设置按钮形式

设置主机参数:
在这里插入图片描述

  • Name:设置参数 “Hosts”
  • Script:设置值脚本
  • Description:设置参数描述信息
  • ChoiceType:设置按钮形式
  • Referenced parameters:关联参数,此处设置为上面的 “Branch”

Groovy Script:

dev = ["Dev_ALL","Dev_AutoTest","Dev_FunctionTest","Dev_Develop"]
release = ["Release_ALL","Release_AutoTest","Release_FunctionTest","Release_Develop"]

if(Branch.equals("dev")){
    return dev
}else if (Branch.equals("release")){
    return release
}else {
    return ["Unknown Hosts"]
}

设置版本参数:

在这里插入图片描述

  • Name:设置参数 “Package_Name”
  • Script:设置 Groovy Script 从文件中获取变量值
  • Description:设置参数描述信息
  • ChoiceType:设置按钮形式
  • Referenced parameters:关联参数,此处设置为上面的 “Branch”

Groovy Script:

if(Branch.equals("dev")){
    lineList = new File("D:\\Jenkins-workspace\\Jenkins\\workspace\\V3C-WEBAPP-Dev\\package_history.txt").readLines()
    lineList.sort{it}
    Collections.reverse(lineList)
    lineList.each {
        return it;
    }
}else if (Branch.equals("release")){
    lineList = new File("D:\\Jenkins-workspace\\Jenkins\\workspace\\V3C-WEBAPP-Release\\package_history.txt").readLines()
    lineList.sort{it}
    Collections.reverse(lineList)
    lineList.each {
        return it;
    }
}else {
    return ["Unknown Hosts"]
}

package_history.txt 内容参考:
在这里插入图片描述
在集成编译的时候,通过 Python 脚本把对应程序包名写入 package_history.txt

# coding=utf-8

# 获取Jenkins变量
WORKSPACE = os.getenv("WORKSPACE")

def packagehistory(zipname):
    Path = WORKSPACE+"\\package_history.txt"
    f = open(Path,'a',encoding='utf-8')
    f.write(zipname)
    f.write("\n")
    f.close()

实现效果

在这里插入图片描述

那么后续怎么接受参数呢?可以参考图中 shell 脚本设置:
在这里插入图片描述

#!/usr/bin/env bash
echo '版本类型:'$Branch
echo '环境类型:'$Hosts
echo '文件名称:'$Package_Name

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。