I have the following piece of code that used to work great in a pipeline. I have to move it into a shared library in Jenkins, so created a class for it and made the necessary adjustments.
def toJson (input) {
return groovy.json.JsonOutput.toJson(input)
}
def void callAPI (args) {
def apiRequestBody = [
"prop1": args.param1,
"prop2": args.param2
]
// Build the request - notice that authentication should happen seamlessly by using Jenkins Credentials
response = httpRequest (authentication: "${CREDENTIALS_STORED_IN_JENKINS}",
consoleLogResponseBody: true,
httpMode: 'POST',
requestBody: toJson(apiRequestBody),
url: "${API_URL}",
customHeaders: [
[
name: 'Content-Type',
value: 'application/json; charset=utf-8'
],
[
name: 'Accept-Charset',
value: 'utf-8'
]
]
)
When I call the callAPI (args)
method, I get the following error:
Exception groovy.lang.MissingMethodException: No signature of method: MY_PACKAGE_PATH.MY_CLASS.httpRequest() is applicable for argument types: (java.util.LinkedHashMap) values: [[authentication:MYAPI_UID_PW, consoleLogResponseBody:true, ...]]
What am I missing?
Thanks
httpRequest
is a DSL command that's not directly available within the context of a class, much like ou can't use sh
, bat
, or node
.
See https://www.jenkins.io/doc/book/pipeline/shared-libraries/#accessing-steps for more info about this.
You can lift code from within a Jenkinsfile and place it in a "var" (or Global Variable) instead, though.
If you insist on placing the code in a shared library class, refer to the link above, which would transform your code into (notice the "script" parameter and the script.httpRequest
syntax):
def void callAPI (script, args) {
def apiRequestBody = [
"prop1": args.param1,
"prop2": args.param2
]
// Build the request
response = script.httpRequest (authentication: "${CREDENTIALS_STORED_IN_JENKINS}",
// ...
}