groovy Jenkins helper类未打印到控制台

vatpfxk5  于 2023-10-15  发布在  Jenkins
关注(0)|答案(1)|浏览(140)

我有一个Jenkins共享库
src/org/helpers下,我有一个groovy文件ErrorHolder.groovy

package org.helpers

class ErrorHolder {
    private String message = ""

    def echo_error(String msg) {
        println "[\033[91;1mError\033[0m] ${msg}"
    }

    def emit_error(String msg) {
        echo_error(msg)
        message = msg
        error(msg)
    }

    def getMessage() {
        return message
    }
}

在管道中,类被初始化并调用函数emit_error

import org.helpers.*

void call () {
    currentBuild.result = 'SUCCESS'
    ErrorHolder errorHolder = new ErrorHolder()

    pipeline {
        agent any
        options { ansiColor('xterm') }

        stages {
            stage ('Clean Workspace') {
                steps {
                    script {
                        println "Debug: $errorHolder"
                        errorHolder.emit_error("Test Error")
                    }
                }
            }
        }
    }
}

然而,在这方面,
我确实看到了第一个调试打印,println "Debug: $errorHolder"
我在控制台中的函数echo_error的print语句输出中没有看到,
我得到一个错误:hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: org.helpers.ErrorHolder.error() is applicable for argument types
我有两个问题:
1.如何从类中调用错误内置函数?
1.如何使print语句工作?

ki0zmccv

ki0zmccv1#

在Jenkins Pipeline上下文中可用的函数不会自动在您正在构建的自定义类中可用。这包括像shbaterrorecho这样的函数,以及来自不同插件或Jenkins核心库的管道中的所有其他函数。
要在类中使用这些函数,您需要将包含这些函数的相关脚本上下文传递给类构造函数,然后调用抛出上下文的函数。举例来说:

package org.helpers

class ErrorHolder {
    /**
    * Jenkins Pipeline Script context.
    */
    final Script script

    private String message = ""

    public ErrorHolder (Script script) {
        this.script = script // initiate script context in constructor
    }

    def echo_error(String msg) {
        // Access println function  threw the script context
        script.println "[\033[91;1mError\033[0m] ${msg}"
    }

    def emit_error(String msg) {
        echo_error(msg)
        message = msg
        // Access error function threw the script context
        script.error(msg)
    }

    def getMessage() {
        return message
    }
}

你现在可以调用任何管道可用的函数抛出脚本变量。
现在,当你在管道中初始化你的类时,传递上下文如下:

ErrorHolder errorHolder = new ErrorHolder(this)

如果你想让它更容易使用,你可以使用库脚本作为连接器。为此,您可以在共享库vars文件夹中创建一个名为ErrorHolder.groovy的适配器文件:

import org.helpers.*

def call() {
   return new ErrorHolder(this)
}

那么在你的管道中你就不需要import语句了,用法如下:

def errorHolder = ErrorHolder()

相关问题