jenkins pipeline script java.lang.NoSuchMethodError - jenkins

pipeline {
agent none
stages {
stage ('INSTALL_IMAGE') {
steps {
script {
def command = "env.job_file --testbed-file env.testbed_file --image_file env.image_file --mail_to env.mail_to"
build job: 'PYATS_JOB_EXECUTOR', parameters:
[
string(name: 'branch_name', value: env.branch_name),
string(name: 'pyats_job_args', value: ${command}),
]
}
}
}
}
}
Getting this error: java.lang.NoSuchMethodError: No such DSL method '$' found among steps
job_file testbed_file image_file mail_to branch_name are all string parameters defined in the jenkins pipeline project.

You are receiving this error because of the following line: value: ${command}.
The ${} syntax is used for the groovy String Interpolation, and as the name implies can be used only inside double quoted (single line or multi line) strings.
The following should work:
string(name: 'pyats_job_args', value: "${command}"),
However, because your value is already a parameter you do not need the string interpolation at all, you can just use your command parameter directly:
string(name: 'pyats_job_args', value: command),
This is a much more simple and readable approach.

Related

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 do you pass string variables to build job parameters in jenkinsfile

for example:
build job: '../downstream_job', parameters: "$variables"
how do you pass the variables ?
This is the format:
build job: 'job_name', parameters: [string(name: 'yourStringParameter', value: "$variable_name")]
You can use the pipeline syntax to generate this code.
I created a simple jenkins job "Echo Params Environment and branch" which echos two parameters it takes: Environment and branch
Then I created this pipeline which calls the job and also has the same two parameters . There are a few extra lines as I was playing with variables but you can see that you can either explicitly define the parameters list (job1) or reference list2 to use as the parameters (job2) - don't use "$list2" - that behaves as a string rather than a list if you do that - so just reference the groovy list variable list2 and it should work fine.
stage('STEP # 1 : Echo parameters') {
String env_name = "${params.Environment}"
String branch_name = "${params.branch}"
println "params are branch $branch_name deploy on $env_name"
def list2 = [string(name: 'Environment', value: "$env_name"),
string(name: 'branch', value: "$branch_name")]
println "List2 is $list2"
// This works with explicit parameter list defined
def job1 = build job:'Echo Params Environment and branch',
parameters: [string(name: 'Environment', value: "$env_name"),
string(name: 'branch', value: "$branch_name")]
def result1 = job1.rawBuild.log
println "result1 = ${result1}"
// This also works - note no $ and no " around list2
def job2 = build job:'Echo Params Environment and branch', parameters: list2
def result2 = job2.rawBuild.log
println "result2 = ${result2}"
}

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

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)

Pass multiple values to a string parameter in jenkins

Have a Jenkins job with a string parameter(P1), how do i pass multiple values to this parameter(P1=a,b,c..), I have to further pass the all values of P1 to my jenkins build step(a batch script) how can this be done?
stage ('Invoke_pipeline') {
steps {
build job: 'test-docker-image',
parameters: [
string(name: 'ProjectName', value: "atm"),
string(name: 'Product', value:"renojournalman,reno-keymanagement,reno-management,renoalertman,reno-atm-update,reno-eventmonitor,reno-valmediamon"),
]
}

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