Плагин AnsiColor в общей библиотеке конвейера Jenkins - проблема использования - PullRequest
0 голосов
/ 07 января 2020

Я определил в своем конвейере быстрый регистратор для проверки цветных журналов с помощью плагина 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")

и он печатает:

enter image description here

Теперь проблема в том, что я хочу переместить этот метод в класс в наших общих библиотеках (мы уже у меня есть другие общие библиотеки, работающие без проблем)

Но когда я перемещаю метод под класс разделяемой библиотеки, возникает следующая проблема:

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 мы решаем эти проблемы с помощью использования делегата, но, насколько я знаю, они не могут быть использованы внутри трубопроводы.

1 Ответ

1 голос
/ 12 января 2020

У меня есть похожий класс, который я использую в моих общих библиотеках. Я думаю, что вам не хватает объекта "конвейер". Ваш класс должен выглядеть следующим образом:

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")
...