groovy.lang.MissingMethodException:没有方法签名:httpRequest() 适用于参数类型:(java.util.LinkedHashMap)

groovy.lang.MissingMethodException: No signature of method: httpRequest() is applicable for argument types: (java.util.LinkedHashMap)

我有以下一段代码曾经在管道中工作得很好。我必须将它移动到 Jenkins 的共享库中,因此为它创建了一个 class 并进行了必要的调整。

    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'
                ]
            ]
        )

当我调用 callAPI (args) 方法时,出现以下错误:

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, ...]]

我错过了什么?

谢谢

httpRequest 是一个 DSL 命令,它不能 直接 在 class 的上下文中可用,就像你不能使用 shbatnode。 有关详细信息,请参阅 https://www.jenkins.io/doc/book/pipeline/shared-libraries/#accessing-steps

不过,您可以从 Jenkinsfile 中提取代码并将其放入“var”(或全局变量)中。 如果您坚持将代码放在共享库 class 中,请参考上面的 link,这会将您的代码转换为(注意“script”参数和 script.httpRequest 语法):

 def void callAPI (script, args) {
    def apiRequestBody = [
        "prop1": args.param1,
        "prop2": args.param2
    ]
    // Build the request
    response = script.httpRequest (authentication: "${CREDENTIALS_STORED_IN_JENKINS}",
    // ...
 }