我们有一组groovy脚本,用户可以在jenkinsfile中调用这些脚本来设置一些常见的作业属性。但是,在进行此更新时,我们还无法找到如何保存它们的现有参数。
我们的groovy代码片段:
def newParamsList = []
def newbool = booleanParam(defaultValue: false, description: "deploy", name: "deploy_flag")
newParamsList.add(newbool)
def newParams = parameters(newParamsList)
properties([ //job property declaration
jobProperties,
disableConcurrentBuilds(),
newParams,
addSchedule,
])
但是,这会覆盖参数定义,因此如果用户在调用groovy之前在jenkins文件中指定了不同的参数定义,那么它就会被删除。
我可以使用currentBuild.rawBuild.getAction(ParametersAction),访问现有参数,但如果理解正确,则需要ParameterDefinition而不是ParameterValue来设置属性。我尝试了currentBuild.rawBuild.getAction(ParametersDefinitionProperty.class),认为我可以像ParametersAction一样使用它,但是它返回null。
是否有可能从Jenkinsfile中调用groovy中的参数定义?还是有不同的方式让我们在不删除jenkinsfile中当前定义的现有参数的情况下为作业添加一个额外的参数?
发布于 2018-02-24 03:13:51
所以我们做这件事的方式,就是把这一切当作一个简单的列表,然后把他们联系在一起。所以jenkinsfile首先从共享库获得一个列表,然后将它们自己的列表添加到列表中,然后设置params (而不是共享库)
Repos jenkinsfile这样做:
#!groovy
@Library('shared') _
// Call shared libaray for common params
def paramList = jobParams.listParams ([
"var1": "value",
"var2": "value2"
])
// Define repo specific params
def addtionalParams = [
booleanParam(defaultValue: false, name: 'SOMETHING', description: 'description?'),
booleanParam(defaultValue: false, name: 'SOMETHING_ELSE', description: 'description?'),
]
// Set Jenkins job properties, combining both
properties([
buildDiscarder(logRotator(numToKeepStr: '20')),
parameters(paramList + addtionalParams)
])
// Do repo stuff
我们的共享库如下所示:
List listParams(def body = [:]) {
//return list of parameters
config = BuildConfig.resolve(body)
// Always common params
def paramsList = [
choice(name: 'ENV', choices: ['dev', 'tst'].join('\n'), description: 'Environment'),
string(name: 'ENV_NO', defaultValue: "1", description: 'Environment number'),
]
// Sometimes common params, switch based on jenkinsfile input
def addtionalParams = []
switch (config.var1) {
case 'something':
case 'something2':
addtionalParams = [
choice(name: 'AWS_REGION', choices: ['us-west-2'].join('\n'), description: 'AWS Region to build/deploy'),
]
break
case 'something3':
addtionalParams = [
string(name: 'DEBUG', defaultValue: '*', description: 'Namespaces for debug logging'),
]
break
}
return paramsList + addtionalParams
}
发布于 2019-01-24 01:26:27
我们执行了下面的groovy代码来检索参数定义并向现有参数中添加新参数(我们不知道用户将把什么作为参数)。如果你有更简单的事情,我想:
boolean isSupported = true
// nParamsis the List of new parameters to add //
Map initParamsMap = this.initializeParamsMap(nParams)
currentBuild.rawBuild.getParent().getProperties().each { k, v ->
if (v instanceof hudson.model.ParametersDefinitionProperty) {
// get each parameter definition
v.parameterDefinitions.each { ParameterDefinition paramDef ->
String param_symbol_name = null
// get the symbol name from the nested DescriptorImpl class
paramDef.class.getDeclaredClasses().each {
if(it.name.contains('DescriptorImpl')){
param_symbol_name = it.getAnnotation(Symbol).value().first()
}
}
// ... processing... //
if( !initParamsMap.containsKey(paramDef.name) ) {
//Valid parameter types are booleanParam, choice, file, text, password, run, or string.
if (param_symbol_name == 'choice') {
String defaultParamVal = paramDef.defaultParameterValue == null ? null : paramDef.defaultParameterValue.value
tempParams.add(
"$param_symbol_name"(name: paramDef.name,
defaultValue: defaultParamVal,
description: paramDef.description,
choices: paramDef.choices)
)
} else if (param_symbol_name == 'run') {
logError {"buildParametersArray does not support yet already existing RunParameterDefinition " +
"in current job parameters list, so the job parameters will not be modified"}
isSupported = false
} else {
tempParams.add(
"$param_symbol_name"(name: paramDef.name,
defaultValue: paramDef.defaultParameterValue.value,
description: paramDef.description)
)
}
}
}
}
}
if( isSupported) {
properties([parameters(tempParams)])
}
发布于 2020-01-14 19:36:29
我想你也可以这样做:
// Get existing ParameterDefinitions
existing = currentBuild.rawBuild.parent.properties
.findAll { it.value instanceof hudson.model.ParametersDefinitionProperty }
.collectMany { it.value.parameterDefinitions }
// Create new params and merge them with existing ones
jobParams = [
booleanParam(name: 'boolean_param', defaultValue: false)
/* other params */
] + existing
// Create properties
properties([
parameters(jobParams)
])
注意事项:但是您应该在非沙箱环境中运行它,或者与@NonCPS一起使用。
https://stackoverflow.com/questions/48952478
复制相似问题