Jenkins 管道共享库中的 AnsiColor 插件 - 使用问题

AnsiColor plugin within Jenkins Pipeline Shared Library - Usage Issue

我在管道中定义了一个快速记录器,以使用 AnsiColor 插件测试彩色日志。

它就像一个魅力。

def logger(String str, String level)
{
   if (level == "ALERT")
   {
        ansiColor('xterm')
        {
            echo '3[32m' + str // Green
        }
   }
   else if (level == "BOLD")
   {
        ansiColor('xterm')
        {
           echo '3[1;31m' + str // Green
        }
   }
}

那我叫它

logger("CHECK THIS ALERT","ALERT")

并打印:

现在的问题是我想在我们的共享库中的 class 中移动这个方法(我们已经有一些其他共享库没有问题)

但是当我将方法移动到共享库 class 下时,出现以下问题:

hudson.remoting.ProxyException: groovy.lang.MissingMethodException: No signature of method: com.pipeline.Logger.ansiColor() is applicable for argument types: (java.lang.String, org.jenkinsci.plugins.workflow.cps.CpsClosure2) values: [xterm, org.jenkinsci.plugins.workflow.cps.CpsClosure2@a2e9a55]
at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:58)
at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.call(PogoMetaClassSite.java:54)
at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
at com.cloudbees.groovy.cps.sandbox.DefaultInvoker.methodCall(DefaultInvoker.java:20)

我认为这是一个可见性问题,因此共享库不具有 ansiColor() 方法的可见性,但我不确定如何导入它,我们使用 DSL 插件处理这些问题委托用法,但据我所知,它们在管道中不可用。

我有一个类似的 class 在我的共享库中使用。我认为您缺少的是 "pipeline" 对象。您的 class 应如下所示:

class MyLogger implements Serializable {

    static void logger(Script pipelineScript, String str, String level){
        if (level == "ALERT"){
           pipelineScript.ansiColor('xterm'){
              pipelineScript.echo '3[32m' + str // Green
           }
        }
        else if (level == "BOLD"){
            pipelineScript.ansiColor('xterm'){
            pipelineScript.echo '3[1;31m' + str // Green
            }
        }
   }
}

然后从你的 Jenkinsfile 中调用它:

Mylogger.logger(this, "CHECK THIS ALERT","ALERT")

我的实现是这样的:

class MyLogger implements Serializable {

    static void printError(Script script, String message) {
        script.echo "\u001B[1;31m [ERROR] ${message} \u001B[0m"
    }


    static void printInfo(Script script, String message) {
        script.echo "\u001B[1;34m [INFO] ${message} \u001B[0m"
    }

    static void printWarn(Script script, String message) {
        script.echo "\u001B[1;33m [INFO] ${message} \u001B[0m"
    }

}

然后 Jenkinsfile 的用法是:

ConsoleLogger.printInfo(this,"This is an info")
ConsoleLogger.printWarn(this,"This is a warning")
ConsoleLogger.printError(this,"This is an error")