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")
我在管道中定义了一个快速记录器,以使用 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")