active-choices-plugin

active-choices-plugin

Jenkins项目的动态交互式参数选择插件

Active Choices Plugin是一个Jenkins插件,用于创建动态交互式的作业参数。插件支持参数动态更新,可渲染为多种UI控件。它使用Groovy脚本生成参数选项,支持Jenkins API和环境变量。插件提供三种参数类型,实现参数级联更新和动态HTML渲染等功能,增强了Jenkins作业配置的灵活性和用户体验。

Active ChoicesJenkins插件参数化构建动态参数Groovy脚本Github开源项目

Active Choices 插件

Jenkins 插件 GitHub 发布 Jenkins 插件安装量 Jenkins JIRA 问题

概述

Active Choices 插件用于参数化的自由风格 Jenkins 作业中,用于创建脚本化、动态和交互式的作业参数。Active Choices 参数可以动态更新,并可以呈现为下拉框、复选框、单选按钮或丰富的 HTML UI 小部件

Active Choices 参数使用 Groovy 或(可选的)Scriptler Groovy 脚本进行编写。这些自定义脚本支持使用 Jenkins Java API、系统环境变量、全局节点属性,以及可能的外部 Java 和 Javascript 库。

插件安装后,将提供三种新的参数类型:

  1. Active Choices 参数
  2. Active Choices 响应式参数
  3. Active Choices 响应式引用参数

注意: 响应式引用参数允许将参数显示为格式化的 HTML。在配置使用此功能的作业时,请考虑参数的呈现方式以及是否可能存在安全问题。

注意: 该插件的开发方式严重依赖 Jenkins UI 的 HTML/DOM。我们使用 JavaScript 导航 DOM 以创建参数之间的关系和响应性。请关注 JENKINS-63284 以获取不依赖 UI 的版本更新。当该问题关闭时,该插件应该可以与流水线、DSL、定时器、cron、REST API 触发的作业等正常工作。

Active Choices 参数允许用户为作业参数选择值。参数值可以:

  • 动态生成(使用 Groovy 或 Scriptler 脚本)
  • 基于其他 UI 参数动态更新
  • 多值(可以有多个值)
  • 使用各种 UI 控件呈现,包括动态 HTML(请注意上述关于安全风险的说明)

我们将通过简要描述 Active Choices 基于 UI 控件的行为和呈现特征来介绍它们。然后,我们将提供配置指南。

Active Choices 参数

行为

  • Active Choices 参数使用 Groovy 脚本或 Scriptler 目录中的脚本动态生成构建参数的值选项列表。

呈现

  • Active Choices 参数可以呈现为标准选择列表、复选框和单选按钮。
  • 可以选择显示文本框过滤器以帮助过滤值选项。

Active Choices 响应式和响应式引用参数

这两种参数都具有额外的有用行为,而响应式引用还有一些独特的呈现选项。

行为

与上述 Active Choices 参数类似:

  • Active Choices 响应式和响应式引用参数使用 Groovy 脚本或 Scriptler 脚本动态生成构建参数的值选项

此外:

  • 当其他作业 UI 控件的值发生变化时,Active Choices 响应式和响应式引用参数可以动态更新(级联更新)

呈现选项

Active Choices 响应式

  • Active Choices 响应式参数可以呈现为标准选择列表、复选框和单选按钮。
  • 可以选择显示文本框过滤器以帮助过滤值选项。

Active Choices 响应式引用

Active Choices 响应式引用参数用于增强 Jenkins 作业表单 UI 的引用信息。

考虑到这种用例,响应式引用 UI 控件可以呈现为:

  • HTML 列表(有序或无序)
  • HTML 输入文本框
  • 动态生成的 HTML(图像、iframe 等);

动态生成的 HTML 选项可以处理 Groovy 脚本返回的任何格式良好的 HTML。它可以呈现各种 HTML 元素,包括图片、内联框架、超链接、富文本等。

此外,响应式引用参数可以从 UI 中隐藏,从而提供动态生成隐藏构建参数的选项。这些选项将在响应式引用配置部分进一步讨论。

呈现示例

在上面的示例中,当"Gender"参数发生变化时,"Professions"参数的值选项会更新。

此外,呈现为图片的响应式引用参数"Gender_Balance"也会在"Gender"参数更新时动态更新。

行为和呈现总结

下表总结了三种 Active Choices 参数类型的行为和呈现特征。

Active Choices 参数类型配置

该插件包含以下参数类型:

  • Active Choices 参数
  • Active Choices 响应式参数
  • Active Choices 响应式引用参数

现在我们将描述它们的配置详情。

Active Choices 参数:配置选项(示例 01)

Active Choices 参数通过在参数配置中设置以下选项进行配置

"名称"和"描述"

这些是所有 Jenkins 参数通用的典型参数名称和描述

"脚本"

"脚本"是将动态生成参数值选项的 Groovy 代码或 Scriptlet 脚本

  • 通过选择两个单选按钮选项之一,您可以直接输入 Groovy 脚本或使用 Scriptler 脚本
  • 脚本必须返回 java.util.List数组java.util.Map,如下例所示:
return ['选项 1', '选项 2', '选项 3']

"回退脚本"

"回退脚本"配置选项提供了备用参数值选项,以防主脚本失败(抛出异常或未返回 java.util.List数组java.util.Map)。

"选择类型"

**"选择类型"**选项提供了四种不同的选项值呈现方式:

  1. 允许单选的列表框
  2. 允许多选的列表框
  3. 复选框列表(允许多选)
  4. 单选按钮列表(允许单选)

"启用过滤器"

**"启用过滤器"**选项将在 UI 控件中提供一个文本框过滤器,可以在其中输入文本过滤器。只有包含该文本的值选项才会列出。

此过滤器不区分大小写。

Active Choices 参数呈现(示例 01)

"示例 01" Active Choices 参数配置生成以下构建表单 UI 控件。用户可以从可过滤的下拉列表中选择单个"州"选项。

设置"默认"选择

可以在初始化 Active Choices UI 控件时默认选择一些选项。

您可以通过在脚本返回的元素中添加后缀 :selected定义默认值选择。在下面的示例中,我们将使"Parana"州成为参数 UI 控件呈现时的默认选择。

设置"禁用"选择

您还可以通过添加后缀 :disabled定义禁用选择。在下面的示例中,我们将使各种元素被禁用且不可变。

如您所见,:selected:disabled 可以同时指定。

我们感谢 Dynamic Parameter 插件 的开发者提供了一些初始概念和代码,Active Choices 就是在此基础上实现的。然而,Active Choices 插件与原始 Dynamic Parameter 插件之间存在几个重要的差异和改进:

  1. Active Choices 参数可以呈现为多选控件(组合框或复选框),允许用户为参数选择多个值
  2. 参数选项值列表可以过滤。如果选中"启用过滤器"选项,将显示一个额外的输入框,允许用户过滤选项。
  3. 如果值生成器脚本引发异常,您可以定义"回退"行为。
  4. 您可以在动态生成的值列表中定义默认值选择

Active Choices 响应式参数:配置选项(示例 02)

Active Choices 响应式参数的配置选项与上面 Active Choices 参数所示的选项类似。然而,响应式参数提供了额外的"引用参数"配置选项。

  • 此选项包含一个作业参数列表,当这些参数中的任何一个发生变化时,会触发响应式参数的自动刷新

"引用参数"

"引用参数"文本字段包含当前作业中以逗号分隔的参数名称列表,当这些参数的值发生变化时,将触发响应式参数的刷新。在重新执行脚本以生成 Active Choices 控件的新选项值集之前,这些参数的值会传递到脚本绑定上下文中。

Active Choices 响应式参数呈现(示例 02)

让我们来看一个使用Active Choices参数渲染的Jenkins构建表单,它满足以下要求。 该表单:

  • 允许用户选择几个巴西州中的一个
  • 提供一个额外的控件,动态显示所选州所属的一组城市
  • 允许用户选择显示的城市中的一个或多个

这个job的UI有两个参数:

1) 州:一个Active Choices参数

第一个参数是来自"示例01"的"州"Active Choices参数。它允许用户选择几个巴西州中的一个。我们完全可以使用Jenkins的Choice参数,但我们使用Active Choice参数(如示例01所示)。这个参数的Groovy脚本如下:

return [ '圣保罗', '里约热内卢', '巴拉那', '阿克里' ]

2) 城市:一个Active Choices Reactive参数

第二个参数是"城市"Active Choices Reactive参数,它动态显示所选州所属的一组城市,并允许用户选择多个值。"城市"参数的配置如上面的"示例02"所示。

注意:

  • "城市"Reactive参数引用了之前定义的州参数('引用参数'=州);
  • "选择类型"设置为"复选框"。这将允许用户通过选择多个复选框来选择一个或多个"城市"。
  • 将使用自定义的"Groovy脚本"来生成"城市"值选项,如下所示(脚本返回的最后一个列表值)
if (States == "圣保罗") { return ["巴雷托斯", "圣保罗", "伊图"] } else if (States == "里约热内卢") { return ["里约热内卢", "曼加拉蒂巴"] } else if (States == "巴拉那") { return ["库里蒂巴", "蓬塔格罗萨"] } else if (States == "阿克里") { return ["里奥布朗库", "阿克雷兰迪亚"] } else { return ["未知州"] }

每当用户更改州参数的选项时,"城市"参数都会动态更新。注意,引用的"州"参数在脚本绑定中,可以直接使用。

你可以使用Reactive参数类型来做一些事情,比如根据给定的组ID显示Maven构件列表。

Active Choices Reactive Reference参数:配置选项

Reactive Reference参数的配置选项与上面显示的Active Choices Reactive参数的选项类似。

然而,Reactive Reference参数提供了一组独特的渲染选项(参见"选择类型")。

  • 输入文本框
  • 编号列表
  • 项目符号列表
  • 格式化HTML
  • 格式化隐藏HTML

鉴于渲染选项的多样性,Active Choices Groovy脚本必须为每个选项返回以下类型的变量:

选择类型Groovy返回说明
输入文本框字符串返回的字符串显示在一个简单的文本框中
编号列表列表返回的列表显示为编号列表
项目符号列表列表返回的列表显示为项目符号列表
格式化HTML字符串返回的字符串必须是格式良好的HTML才能正确显示。你可以在这里包含任何HTML标签,例如:一些<table>,或者指向另一个网站的<form>
格式化隐藏HTML字符串参数不会在UI中显示

Reactive Reference参数的一个典型应用是动态显示参考信息,这些信息可以指导用户为另一个作业参数选择适当的值。

根据设计,Reactive Reference参数的值不会传递到构建环境,但有一个重要的例外。当选择类型设置为格式化HTML或格式化隐藏HTML,且HTML是一个'input'元素时,值可以传递到构建。有关其他说明,请参阅"高级用法"部分。

示例配置:Active Choices Reactive Reference参数

下面我们展示了3个具有不同选择类型的Reactive References示例,以及它们在Jenkins作业UI中的相应渲染。

考虑一个例子,用户需要选择一种与可用葡萄酒搭配的餐点。如果在用户考虑特定葡萄酒时能提供一些有用的参考信息,食物的选择会更容易。我们称这个参考信息为"葡萄酒规则",我们可以使用Reactive Reference参数轻松实现它。

当用户从"葡萄酒菜单"中做出新的选择时,"葡萄酒规则"会自动更新(注意引用参数=葡萄酒菜单)。因此,当我们选择"葡萄酒菜单"时,我们还会得到一个"葡萄酒规则",可以指导"食物菜单"的选择。

Reactive Reference配置(示例03)

"葡萄酒规则"参数的完整配置如下所示。

Reactive Reference Groovy脚本(示例03)

为每个选项生成"葡萄酒规则"格式化HTML的Groovy脚本如下所示。

switch(WINE_MENU) { case ~/.*香槟.*/: winerec='香槟适合搭配任何咸味食物' return "<b>${winerec}</b>" case ~/.*长相思.*/: winerec='长相思适合搭配酸味调料和酱汁' return "<b>${winerec}</b>" case ~/.*绿维特利纳.*/: winerec='当菜肴中有大量新鲜香草时,选择绿维特利纳' return "<b>${winerec}</b>" case ~/.*灰皮诺.*/: winerec='灰皮诺适合搭配清淡的鱼类菜肴' return "<b>${winerec}</b>" case ~/.*霞多丽.*/: winerec='选择霞多丽搭配油腻的鱼或富含酱汁的鱼' return "<b>${winerec}</b>" case ~/.*半干型雷司令.*/: winerec='半干型雷司令搭配甜辣菜肴' return "<b>${winerec}</b>" case ~/.*阿斯蒂莫斯卡托.*/: winerec='阿斯蒂莫斯卡托适合水果甜点' return "<b>${winerec}</b>" case ~/.*干型桃红.*/: winerec='将干型桃红葡萄酒与丰富的奶酪菜肴搭配' return "<b>${winerec}</b>" case ~/.*黑皮诺.*/: winerec='黑皮诺适合搭配带有泥土风味的菜肴' return "<b>${winerec}</b>" }

高级用法说明

编写Groovy脚本时的注意事项

你的Groovy脚本绑定可以访问两个额外的变量:

  • jenkinsProject -> Jenkins项目对象
  • jenkinsBuild -> Jenkins构建对象

将Reactive Reference值传递给构建

如前所述,通常Reactive Reference参数的值不会传递给构建。但是,在某些情况下,能够传递这些值会很有用。关于这个功能的更详细讨论,你可以在这里阅读。

场景1:传递可由用户编辑的动态创建值

在这种情况下,我们想为用户提供一个可编辑的动态默认值。这可以通过以下Reactive Reference配置实现:

  • 选择类型:格式化HTML
  • Groovy脚本返回带有动态默认值的HTML input元素
  • 高级选项设置为

场景2:传递隐藏的动态创建值(用户不能编辑)

在这种情况下,我们希望构建能够访问从UI中的用户输入/选项选择动态生成的参数。该参数是以编程方式创建的,用户不能编辑。这可以通过以下Reactive Reference配置实现:

  • 选择类型:格式化隐藏HTML
  • Groovy脚本返回带有动态默认值的HTML input元素
  • 高级选项设置为

"格式化隐藏HTML"选择类型在你想计算要在构建中使用的值,但这些值不应该被用户修改时很有用(例如,计算部署URL)。

在这两种情况下,Groovy脚本必须返回格式如下的HTML元素:

return "<input name='value' value='${ReactiveRefParam}' class='setting-input' type='text'>"

ReactiveRefParam是将传递给构建的Reactive Reference值

场景3:使用动态HTML创建输入控件并将其值传递给构建

这是Reactive Reference参数的一个有趣应用。它允许你创建具有改进交互性的自定义UI参数控件。参见示例

高级选项:省略值字段

默认情况下,"Reactive References"会向构建传递一个隐藏的<input name="value" value="">。这意味着你的"Reactive Reference"参数将始终为空,但你可以使用"格式化HTML"参数,并指示插件不包含这个隐藏的值参数。

你可以点击"高级"按钮,在那里你会找到一个省略值字段的选项。这将让你为隐藏参数定义一个值。

将Active Choices与Scriptler脚本一起使用

我们假设需要使用Scriptler生成参数的用户已经熟悉Scriptler插件。如果你需要有关如何使用Scriptler插件的更多信息,请首先参阅其Wiki页面。 与 Groovy 脚本类似,Scriptler 脚本也是用 Groovy 编写的,用于渲染参数。您的 Scriptler 脚本必须返回 java.util.ListArrayjava.util.Map 用于 Active Choices 和 Reactive 参数,或者为 Reactive Reference 参数返回自定义 HTML 元素。请注意,当将 Scriptler 与 Active Choices 结合使用时,其他构建参数的值将在 Scriptler 脚本上下文中可用。您无需在 Scriptler 界面或在作业定义期间定义这些参数。

然而,Scriptler 插件提供的主要优势是创建了一个可在多个作业中使用甚至用于自动化的可重用 Groovy 脚本目录

为了使您的 Scriptler 脚本可以在多个项目中重用,您应该对它们进行参数化,并使用构建参数分配脚本参数。

示例

Scriptler 中的 Environments.groovy

return ["Select:selected", "DEV", "TEST", "STAGE", "PROD"]

Scriptler 中的 HostsInEnv.groovy

// 静态内容示例。这些列表也可以动态生成作为替代方案。 List devList = ["Select:selected", "dev1", "dev2"] List testList = ["Select:selected", "test1", "test2", "test3"] List stageList = ["Select:selected", "stage1"] List prodList = ["Select:selected", "prod1", "prod2", "prod3", "prod4"] List default_item = ["None"] if (Environment == 'DEV') { return devList } else if (Environment == 'TEST') { return testList } else if (Environment == 'STAGE') { return stageList } else if (Environment == 'PROD') { return prodList } else { return default_item }

Jenkinsfile 中的流水线

properties([ parameters([ [ $class: 'ChoiceParameter', choiceType: 'PT_SINGLE_SELECT', name: 'Environment', script: [ $class: 'ScriptlerScript', scriptlerScriptId:'Environments.groovy' ] ], [ $class: 'CascadeChoiceParameter', choiceType: 'PT_SINGLE_SELECT', name: 'Host', referencedParameters: 'Environment', script: [ $class: 'ScriptlerScript', scriptlerScriptId:'HostsInEnv.groovy', parameters: [ [name:'Environment', value: '$Environment'] ] ] ] ]) ]) pipeline { agent any stages { stage('Build') { steps { echo "${params.Environment}" echo "${params.Host}" } } } }

过滤支持正则表达式

请注意,尽管 Active Choices 参数可用的"过滤器"文本框通过简单输入一些文本提供了简单的不区分大小写的过滤功能,但它也支持使用正则表达式进行更复杂的过滤。

以下示例展示了使用正则表达式过滤复杂选项列表的情况。

安全性

v2.0 之前的 Active Choices 版本可能不安全。在使用较旧版本之前,请查看以下警告:

从 Active Choices v2.0 开始,Active Choices Reactive Reference 参数的沙箱 Groovy 脚本将不再发出被认为不安全的 HTML,例如 <script> 标签。这可能导致"使用参数构建"表单上的行为发生变化,如缺少元素。要解决此问题,需要将发出 HTML 的 Groovy 脚本配置为在脚本安全沙箱之外运行,可能需要在"进程内脚本批准"中单独获得管理员批准。

Active Choices 将加载两个额外的 Javascript 文件,JQuery 和 unochoice.js

支持的语言

  1. 英语
  2. 葡萄牙语(巴西)进行中
  3. 如果您想包含您的语言,请向我们发送带有 messages.properties 文件的拉取请求或与我们联系!

已知限制

  1. 参数应该仅由人类处理,目前不适用于插件、API 或脚本触发的作业。更多信息请参见此问题
  2. 在提交问题之前,请查看故障排除页面

发布说明

请参阅 CHANGES.md 文件。

赞助商

如需商业支持,请通过 @tupilabs 与我们联系。

要了解插件的来源,请查看 BioUno 项目

如果您希望赞助插件的开发或 JIRA 中的公开问题,请与我们联系。

其他资源

  • "使用 HTML、Groovy 和 Bash 在 Jenkins 流水线中实现动态和响应式参数化",作者:Esteban Echavarria Collazos - 链接

BioUno 网站上查看文章、教程和出版物列表

编辑推荐精选

TRAE编程

TRAE编程

AI辅助编程,代码自动修复

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
蛙蛙写作

蛙蛙写作

AI小说写作助手,一站式润色、改写、扩写

蛙蛙写作—国内先进的AI写作平台,涵盖小说、学术、社交媒体等多场景。提供续写、改写、润色等功能,助力创作者高效优化写作流程。界面简洁,功能全面,适合各类写作者提升内容品质和工作效率。

AI辅助写作AI工具蛙蛙写作AI写作工具学术助手办公助手营销助手AI助手
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

下拉加载更多