How to pass choice parameter to call a job inside jenkins pipeline - jenkins

How can I pass choice parameters for the downstream job when called inside a stage in the jenkins pipeline?
I tried the below solutions but none worked:
stage('build job') {
steps{
script{
build job: 'test',
parameters: [
choice(choices: "option1\noption2\noption3\n", description: '', name: 'choiceParam')
]
}
}
}
fails with java.lang.UnsupportedOperationException: no known implementation of class hudson.model.ParameterValue is using symbol ‘choice’
Tried these as well:
parameters:
[
[$class: 'ChoiceParameterValue', name: 'choiceParam', value: "1\n\2\n3\n"],
]
fails with java.lang.UnsupportedOperationException: no known implementation of class hudson.model.ParameterValue is named ChoiceParameterValue
I actually want to pass the choice parameter as a build parameter like "$choiceParam" for value so that I can just update the jenkins job configuration instead of always updating the values in the pipeline script
Can someone please help me with this
Thanks

When you are building a job via the Build step, you are kicking it off so you need to have "selected" a value.
In this instance you would pass in the desired 'String' choice. Not a list of choices. i.e. "1"
We create our list of params and then pass that in. So: our current job has these input params:
choice(name: 'ENV', choices: product, description: 'Env'),
choice(name: 'ENV_NO', choices: envParams(product), description: 'Env No'),
We pass these downstream by setting them:
List<ParameterValue> newParams = [
new StringParameterValue('ENV', params.ENV),
new StringParameterValue('ENV_NO', params.ENV_NO),
]
build(job: "job", parameters: newParams, propagate: false)

Related

How to add a build selector as a parameter?

I have two jobs:
Build job
Deployment job
I copy the artifacts (jars) generated in the first job to the second job and deploy them to an environment.
properties([
parameters(
[
string(
name: 'buildnumber',
description: 'Buildnumber to deploy'
),
choice(
name: 'env',
choices: ['qa', 'stage', 'prod'],
description: 'Environment where the app should be deployed'
)
]
)
])
node{
stage('Copy artifacts'){
copyArtifacts(projectName: 'my-demo-build-job/master', selector: specific(params.buildnumber))
}
stage('Deploy'){
sh 'Deploying to the specified environment '
}
}
With this I have to manually check the latest/successful builds and put that as a parameter. Is there a way so that we can get a dropdown with all the successful build sorted by build number as a selector from the other job?
You can use the Extended Choice Parameter Plugin for achieving what you want with the help of a groovy script.
You will need to define an extended choice parameter of type Single Select, as a Source for Value choose Groovy Script, and as a groovy script use something like the following:
def job = jenkins.model.Jenkins.instance.getItemByFullName('my-demo-build-job/master')
return job.builds.findResults{
it.result == hudson.model.Result.SUCCESS ? it.getNumber().toInteger() : null
}
This script will go over all the build of the configured job and filter out only the successful builds - which will be returned as the select-list options for the parameter.
The configuration in the pipeline will look like:
properties([
parameters([
extendedChoice(name: 'buildnumber', type: 'PT_SINGLE_SELECT', description: 'Buildnumber to deploy', visibleItemCount: 10, groovyScript:
'''def job = jenkins.model.Jenkins.instance.getItemByFullName('my-demo-build-job/master')
return job.builds.findResults { it.result == hudson.model.Result.SUCCESS ? it.getNumber().toInteger() : null }''',
choice(name: 'env', choices: ['qa', 'stage', 'prod'], description: 'Environment where the app should be deployed'),
])
])

Passing parameters down a Jenkins pipeline

I cannot get Jenkins to pass a string Parameter down the pipeline.
When I run the pipeline, I input the string value for $ServiceName and the job continues but it doesn't pass this param to the first job in the pipe (NEWSERVICE - Add New). In the jenkins file in the 'build' stage I've tried params.ServiceName, $params.ServiceName, env.ServiceName, $env.ServiceName, $env:ServiceName. No luck.
I need to pass the param to a Powershell build process in the NEWSERVICE job (which currently just echos the Param with $env:ServiceName - but it's always empty) Any help would be vastly appreciated.
pipeline {
agent any
parameters{
string(name: 'ServiceName',
defaultValue: '',
description: '',)
}
stages {
stage('Add new Service'){
steps {
build(job: "NEWSERVICE - Add New", parameters: [string(name: 'ServiceName', value: params.ServiceName)])
}
}
}
}
In Pipeline you need to pass string parameters like this:
parameters: [
[$class: 'StringParameterValue', name: 'ServiceName', value: ServiceName]
],
Refer this to understand different type of variable passing while calling a job from Jenkinsfile.
https://jenkins.io/doc/pipeline/steps/pipeline-build-step/
If you are looking to use a Jenkins env var in a powershell script - which i do all the time! - the env var has to be set up as such in Jenkins first. In other words,
env.myVar in a Jenkins context will be visible as $env:myVar in a PowerShell context. But you need to set it as an env var, local Jenkins variables won't be visible to a child script (unless passed in as a parameter). I have a detailed writeup here: https://stackoverflow.com/a/62538778/556078

How to make environment variable set by job dsl avaiable in downstream jobs?

The job seeder creates a pipeline job and sets environment variable using job dsl as shown below, this pipeline job triggers another job(say job2) which in turn triggers another job(say job3). I want the environment variable set in seed job to be accessed in the triggered jobs.
pipelineJob("job1"){
description("job1..")
concurrentBuild(false)
environmentVariables(
globalEnv + [TEMP_ENV1 : 'true',
TEMP_ENV2 : 'true'
]
)
definition {
cps {
script(
"""
job1script()
"""
)
}
}
}
I want to access TEMP_ENV1 and TEMP_ENV2 in job3, but both are null in this job. i have a check in script which job3 executes it and it fails, e.g.
if (env.TEMP_ENV1) { }
You should invoke the job using the build step (https://jenkins.io/doc/pipeline/steps/pipeline-build-step/) and pass these along as parameters:
build(
job: "myjob2",
parameters: [
string(name: 'TEMP_ENV1', defaultValue: TEMP_ENV1, description: 'Temp env var 1')
],
propagate: false
)

triggering another jenkins job from jenkinsfile in pipeline

I am trying to invoke a separate jenkins job whose direct job url is https://jenkins.example.com/job/jobName/. This job runs with one parameter name "branch", whose value is "Master".
Below is how I am giving in my Jenkinsfile, but when I run it, gives me error
ERROR: No item named https://jenkins.example.com/job/jobName found
if ("${params.buildParam}" == 'test' || !params.buildParam ){
stage('Test') {
def job = build job: 'https://jenkins.example.com/job/jobName/', parameters: [[$class: 'StringParameterValue', name: 'branch', value: 'Master']]
}
}
The build step takes a job name as parameter, not a URL. So try
build job: '/jobName'
to refer using the absolute path. Depending on where your pipeline job is, you might use something like the following as well:
build job: '../../jobName/'
btw. you can avoid string interpolation here:
if (params.buildParam == 'test' ...)

jenkins pipeline def new string parameter

I have a parameterized job with pipeline.
for example: Predefined String Parameter: IP
I'm trying to define a new String in the pipeline in order to use it as a new parameter when I'm calling to another "build job"
I have tried the following method:
import hudson.model.*
node('master'){
if(ipaddr =='192.168.1.1'){
def parameter = new StringParameterValue("subnet", '255.255.255.0') //not working
echo parameter //not working
}
stage ('Stage A'){
build job: 'jobA', parameters:
[
[$class: 'StringParameterValue', name: 'ip', value: ip],
[$class: 'StringParameterValue', name: 'subnet', value: subnet] //not working
]
}
}
this way it's not working and I get the error:
Scripts not permitted to use new hudson.model.StringParameterValue
after changing the line:
def parameter = new StringParameterValue("subnet", '255.255.255.0')
to:
subnet = '255.255.255.0'
I got the error:
groovy.lang.MissingPropertyException: No such property: subnetmask for
class: groovy.lang.Binding.
I can't call to a new job with the predefined parameter ip and the new parameter subnet
without the subnet it's working
any idea of how can I define new String parameter in the pipeline?
jenkins version: 2.19.4
You can have it working if you just avoid instantiating StringParameterValue because as David M. Karr mentionned pipelines sandbox is pretty restrictive. Instead, just use your simple variable when calling your job, like this :
def subnet = ""
if(ipaddr == '192.168.1.1') {
subnet = '255.255.255.0'
echo subnet
}
stage ('Stage A'){
build job: 'jobA', parameters:
[
[$class: 'StringParameterValue', name: 'ip', value: ipaddr],
[$class: 'StringParameterValue', name: 'subnet', value: subnet]
]
}
It's pretty simple, StringParameterValue params expect String to be passed, so as long as you pass string values you should be just fine !
By default, the sandbox the pipeline job executes in is very restricted. You have to override the security restrictions when you find them. Go to "Manage Jenkins" and "In-process Script Approval". You should see in the list the last violation that occurred. Select it for approval and rerun your script.

Resources