It is, but there are some complications as params
is an immutable map.
We use a shared library function we wrote when we want to change our params during job execution.
This will probably require admin for script approvals.
The first function is for setting a new string param, or updating an existing one with a new value.
The second and third jobs are just interfaces for adding a new option to a choice param for either your current job, or a different job.
The fourth is the main grunt for this choice adding logic. (not called directly)
The organizationFolder is based on us using the Github branch source plugin.
/**
* Change param value during build
*
* @param paramName new or existing param name
* @param paramValue param value
* @return nothing
*/
def setParam(String paramName, String paramValue) {
List<ParameterValue> newParams = new ArrayList<>();
newParams.add(new StringParameterValue(paramName, paramValue))
try {
$build().addOrReplaceAction($build().getAction(ParametersAction.class).createUpdated(newParams))
} catch (err) {
$build().addOrReplaceAction(new ParametersAction(newParams))
}
}
/**
* Add a new option to choice parameter for the current job
*
* @param paramName parameter name
* @param optionValue option value
* @return nothing
*/
def addChoice(String paramName, String optionValue) {
addChoice($build().getParent(), paramName, optionValue)
}
/**
* Add a new option to choice parameter to the given job
*
* @param paramName parameter name
* @param optionValue option value
* @return nothing
*/
def addChoice(String jobName, String paramName, String optionValue) {
List jobNames = jobName.tokenize("/")
Job job = ((OrganizationFolder)Jenkins.getInstance().getItem(jobNames[0])).getItem(jobNames[1]).getItem(jobNames[2])
addChoice(job, paramName, optionValue)
}
/**
* Add a new option to choice parameter to the given job
* Will be added as the first (default) choice
* @param job job object
* @param paramName parameter name
* @param optionValue option value
* @return
*/
def addChoice(Job job, String paramName, String optionValue) {
ParametersDefinitionProperty paramsJobProperty = job.getProperty(ParametersDefinitionProperty.class);
ChoiceParameterDefinition oldChoiceParam = (ChoiceParameterDefinition)paramsJobProperty.getParameterDefinition(paramName);
List<ParameterDefinition> oldJobParams = paramsJobProperty.getParameterDefinitions();
List<ParameterDefinition> newJobParams = new ArrayList<>();
for (ParameterDefinition p: oldJobParams) {
if (!p.getName().equals(paramName)) {
newJobParams.add(0,p);
}
}
List<String> choices = new ArrayList(oldChoiceParam.getChoices());
choices.add(0,optionValue);
ChoiceParameterDefinition newChoiceParam = new ChoiceParameterDefinition(paramName, choices, oldChoiceParam.getDefaultParameterValue().getValue(), oldChoiceParam.getDescription());
newJobParams.add(newChoiceParam);
ParametersDefinitionProperty newParamsJobProperty = new ParametersDefinitionProperty(newJobParams);
job.removeProperty(paramsJobProperty);
job.addProperty(newParamsJobProperty);
}