当前位置: 首页 > 知识库问答 >
问题:

Jenkins共享库实例化util类并在workflowscript中使用

宁飞宇
2023-03-14

我正在创建自己的Jenkins共享库,以便在管道之间重用一些代码。我知道如何创建步骤(确实很容易),但是当我想在jenkinsfile中访问我的“utils类”(或者如Jenkins在日志中所说的工作流脚本)时,我有一个问题。我叫"Util类"位于文件夹src/我的/域/...,有很多方法,例如,我想创建一个日志类,这样:

# src/my/domain/group

package my.domain.group

class Console implements Serializable {

    def log(msg) {
        spit(msg, '\033[34m')
    }

    def error(msg) {
        spit(msg, '\033[31m')
    }

    def warning(msg){
        spit(msg, '\033[33m')
    }

    def success(msg){
        spit(msg, '\033[32m')
    }

    private def spit(msg, color){
        ansiColor('xterm') {
            echo color + msg + '\033[0m'
        }
    }

}

然后我尝试在/vars/library中的一个文件中实例化。groovy so可以通过一些代码从Jenkins文件访问,例如:

node("mynode"){
   console.log("Hello World!")
} 

这个想法是为了避免在所有脚本中实例化控制台并自动执行,我已经尝试了一些事情,比如

# vars/library.groovy

import my.domain.group.Console
import groovy.transform.Field

@Field String console = new Console() 

或者

# vars/library.groovy

import my.domain.group.Console

def load(){
    this.console = new Console() 
    // And also
    console = new Console()
}

但是当试图从jenkins文件访问时,我总是会得到一个错误:groovy。lang.MissingPropertyException:没有此类属性:类的控制台:WorkflowScript

我知道这意味着实例不在正确的范围内,所以脚本不能直接看到,但是我怎么做呢?

谢谢

共有1个答案

苏伟志
2023-03-14

看起来您在Jenkins文件中错误地使用了vars脚本,但我将尝试解决一些困惑:)

>

  • vars目录中定义的Groovy脚本在您的Jenkins文件中以文件名作为“自定义”步骤调用。假设您的脚本名保留在库中。groovy,您的Jenkins文件应该如下所示

    node ("mynode") {
         library("Hello World!")
    } 
    

    或者(因为括号是可选的)

    node ("mynode") {
         library "Hello World!"
    }
    

    此外,vars脚本应该只包含一个名为call的函数和必要的导入。由于您希望将日志消息作为字符串传递,因此call函数还需要一个参数。所以你的library.groovy脚本在vars中可以看起来像这样

    # vars/library.groovy
    
    import my.domain.group.Console
    
    def call(msg){
        Console console = new Console(steps) 
        console.log(msg)
    }
    

    call函数中,您可以像在Jenkins文件中一样使用所有基本Jenkins步骤(shbat,等等),以及通过import导入的任何Groovy/Java类(如控制台类)。

    您可能已经注意到,我还添加了一个步骤变量(不需要手动声明或实例化)到您的控制台类的构造函数中。这是必要的,因为您不能直接在src目录中定义的任何类中使用任何Jenkins步骤。结果,方法

    private def spit(msg, color){           
        ansiColor('xterm') {
            echo color + msg + '\033[0m'
        }
    }
    

    不起作用,因为echo是詹金斯步骤。为了在类中使用echo,可以将步骤变量传递给构造函数,并将其存储在类中的另一个变量中。然后可以调用所有Jenkins步骤,如步骤。回显“Hello World”

    # src/my/domain/group
    
    package my.domain.group
    
    class Console implements Serializable {
    
         def steps
    
         Console(steps) {
             this.steps = steps
         }
    
         def log(msg) {
             spit(msg, '\033[34m')
         }
    
         def error(msg) {
             spit(msg, '\033[31m')
         }
    
         def warning(msg){
             spit(msg, '\033[33m')
         }
    
         def success(msg){
             spit(msg, '\033[32m')
         }
    
         private def spit(msg, color){
             ansiColor('xterm') {
                 steps.echo color + msg + '\033[0m'
             }
         }
    }
    

    这应该会让它起作用。

    您应该考虑重命名库。groovyinsidevarsthough(例如myLog.groovy)。那么你的Jenkins文件可能是这样的

    node ("mynode") {
        myLog "Hello World!"
    }
    

    为了使用控制台类的其他方法,您可以在变量中创建其他脚本。使用它们可能看起来像这样

    node ("mynode") {
        myLog "Hello World!"
        myWarning "Hello World!"
        myError "Hello World!"
        mySuccess "Hello World!"
    }
    

    (im使用my前缀以避免与已存在的Jenkins步骤发生名称冲突。例如,错误步骤已经存在,在Jenkinsfile中调用它将取消您的构建

    有关共享库的更多信息,请查看Jenkins留档https://jenkins.io/doc/book/pipeline/shared-libraries/

    您可以在https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/找到所有基本Jenkins步骤的完整列表

    让Jenkins和管道工作可能是一个巨大的麻烦,但最终它是值得的。我希望这段文字能对你有所帮助。祝你好运和快乐:)

  •  类似资料:
    • 目前,我正在我的项目中创建一个Jenkins共享库,在实例化一个对象时遇到了一个问题。 我的应用程序的树结构 -day#1 --/詹金斯档案 --/src/File1。groovy --/测试/文件1规范。groovy --/vars/file1。groovy 从我的Jenkins文件中,我可以调用file1。函数,inturn将创建写入文件中的类对象/src/File1。groovy和它工作得很

    • 我有一个Jenkins文件,我正在尝试从共享库实例化groovy类。我得到“无法解决类测试” 我有一个src/com/org/foo。共享库中的groovy文件: 我正试图在我的Jenkins文件中实例化它 如果我将文件作为一个类引用(我没有对其构造函数的访问权限),那么它就会起作用。即: 这很好,让我使用foo函数。但是,我失去了赋予类常量并用参数构造它的能力。 知道如何定义和使用共享库中的类吗

    • 我将我的Jenkins Pipeline存储为Jenkins共享库中的Groovy脚本。我想为不同的工作使用不同的版本。我的共享库脚本称为如下: 我已将sharedLib repo中的不同版本标记为。万一我想用v1。0,我用注释引用了它,如下所示。 在我的工作中,我通过调用groovy脚本访问了共享库,并使用了上面的注释,如图所示: 我运行这项工作时出错了。以下是我看到的错误。 当我使用。我哪里出

    • 我正在寻找一些关于Jenkins共享库类设计的指导。使用全局变量作为共享库可以很好地工作,但每次我在src/中定义一个类并希望导入它时,都会遇到无法解析该类的错误。 这是我的共享库结构: 类测试员。棒极了 下面是我想在管道作业中初始化的类的代码。 你好。棒极了 管道作业 在第2行中,我得到错误:无法解析类de.schlumpf.测试器。全局变量sayHello就像一个魅力...有人知道我在这里做错

    • 问题内容: 我在Jenkins管道的共享库中有一个方法。想法是使用该库并将文件上传到远程主机。该库将导入到单例库中。 实例化的类如下所示: 即使我在日志中看到该行。我看不到命令正在执行。我缺少某种无法调用的功能吗? 编辑 当我直接在库中使用时,它可以工作。 但是,尝试使用时不起作用。 我得到的异常是: 问题答案: 如此处所述,您需要捕获stdout / stderr才能 _看到_任何内容。 至少:

    • 我通过jenkins管道(共享库)运行此代码。 它在本地工作,但在Jenkins管道中,我得到以下错误: 请帮帮我