如何在Jenkins Freestyle项目中最优定义Active Choice参数共用常量?
Jenkins Active Choice参数共用常量的最佳定义方式
我有一个包含多个Active Choice参数的Jenkins Freestyle项目,其Groovy脚本使用部分共用常量(这些常量也会在后续构建步骤中使用)。示例代码如下:
def constant1 = 'bla' def constant2 = 'blub' def constant3 = 'umpf' def val1 = doSomething("$constant1", "$constant2") return ["$val1", "$constant3"]
目前这些常量值被硬编码并在Groovy脚本中重复使用,请问定义此类常量的最佳方式是什么?
备注
- 曾考虑将Groovy代码移至Scriptler“库”中,但尚未尝试且无相关经验;
- 将存在多个大体相同的项目,仅部分常量值不同;
- 同一Jenkins实例上还有其他用户和项目,理想状态下这些对象不应“看到”我的常量;
- 理想情况下,常量的配置可在Jenkins GUI中完成。
已尝试方案
- “向构建过程注入环境变量”和“属性内容”功能;
- “为运行准备环境”和“属性内容”功能。
从GUI展示角度来看这两种方式很理想,但似乎不适用于动态参数阶段。
见过读取属性文件的解决方案,但更希望在Jenkins内部配置这些值。系统环境变量并非可行选项。
推荐解决方案
1. 项目专属配置文件(GUI友好+隔离性强)
安装Config File Provider插件,为每个项目创建专属的Groovy配置文件,在Jenkins GUI中编辑常量值,且仅当前项目可访问:
- 在Jenkins系统管理中启用插件后,进入项目配置页,添加「Managed file」类型的配置文件,内容为:
return [ constant1: 'bla', constant2: 'blub', constant3: 'umpf' ] - 在Active Choice参数的Groovy脚本中加载该配置文件:
def configFile = configFileProvider.getConfigFile('你的配置文件ID').file def constants = new GroovyShell().evaluate(configFile.text) def val1 = doSomething(constants.constant1, constants.constant2) return [val1, constants.constant3] - 后续构建步骤中若需复用常量,同样通过加载该配置文件或直接读取配置文件内容即可。
2. 隐藏参数+Active Choice联动(最简单方案)
将常量设置为项目专属的隐藏参数,GUI配置值,同时支持构建步骤复用:
- 在项目的「参数化构建过程」中添加3个字符串参数:
CONSTANT1、CONSTANT2、CONSTANT3,勾选「Hidden」选项,在GUI中设置默认值; - 在Active Choice参数的Groovy脚本中读取这些参数:
def constant1 = build.buildVariableResolver.resolve('CONSTANT1') def constant2 = build.buildVariableResolver.resolve('CONSTANT2') def constant3 = build.buildVariableResolver.resolve('CONSTANT3') def val1 = doSomething(constant1, constant2) return [val1, constant3] - 构建步骤中直接通过
${CONSTANT1}等环境变量引用常量即可。
3. Scriptler公共库+项目参数传递(复用性强)
如果需要复用Groovy逻辑,同时保留项目专属常量的隔离性:
- 在Scriptler中创建公共脚本
common_constants.groovy,接收项目参数作为常量:def getConstants(projectParams) { return [ constant1: projectParams.constant1 ?: '默认值1', constant2: projectParams.constant2 ?: '默认值2', constant3: projectParams.constant3 ?: '默认值3' ] } - 在项目中添加普通字符串参数(如
PROJECT_CONSTANT1),在GUI中配置专属值; - 在Active Choice参数的Groovy脚本中调用Scriptler脚本并传入参数:
def commonScript = scriptlerScript('common_constants.groovy') def constants = commonScript.getConstants([ constant1: build.buildVariableResolver.resolve('PROJECT_CONSTANT1'), constant2: build.buildVariableResolver.resolve('PROJECT_CONSTANT2'), constant3: build.buildVariableResolver.resolve('PROJECT_CONSTANT3') ]) def val1 = doSomething(constants.constant1, constants.constant2) return [val1, constants.constant3]
内容的提问来源于stack exchange,提问作者tge12345
相关产品推荐
相关产品推荐

