首页 > 解决方案 > Jenkins Pipeline 共享库中的 AnsiColor 插件 - 使用问题

问题描述

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

它就像一个魅力。

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

那我叫它

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

它打印:

在此处输入图像描述

现在的问题是我想在我们的共享库的一个类中移动这个方法(我们已经有一些其他的共享库可以正常工作)

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

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 插件,我们通过委托使用来处理这些问题,但是据我所知,它们在管道中不可用。

标签: jenkins-pipelineshared-librariesjenkins-pluginsjenkins-groovyansi-colors

解决方案


我在共享库中使用了一个类似的类。我认为您缺少的是“管道”对象。您的课程应如下所示:

class MyLogger implements Serializable {

    static void logger(Script pipelineScript, String str, String level){
        if (level == "ALERT"){
           pipelineScript.ansiColor('xterm'){
              pipelineScript.echo '\033[32m' + str // Green
           }
        }
        else if (level == "BOLD"){
            pipelineScript.ansiColor('xterm'){
            pipelineScript.echo '\033[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")

推荐阅读