jenkins-pipeline - 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 插件,我们通过委托使用来处理这些问题,但是据我所知,它们在管道中不可用。
解决方案
我在共享库中使用了一个类似的类。我认为您缺少的是“管道”对象。您的课程应如下所示:
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")
推荐阅读
- vb6 - 以编程方式将列注释添加到 Microsoft Access-97 数据库
- c# - 参考 Azure Functions 中的 Cosmos DB nuget 包
- c# - WPF 效果防止纹理重新加载
- javascript - 动态添加元素上的每个循环的单击事件 javascript / jquery
- android - 获取用户电子邮件 firebase 身份验证
- ssl - 内部代理是否需要 HTTPS?
- oracle-apex - 在 Oracle APEX 中插入静态数据以及数据加载向导实用程序
- jquery - jQuery插件无法识别的表达式:[object Object]
- php - AngularJs - PHP POST 问题
- python - 检查是否可以嵌入来自 youtube 的视频