gpt4 book ai didi

Jenkins 共享库实例化 util 类并在工作流脚本中使用

转载 作者:行者123 更新时间:2023-12-04 22:18:50 26 4
gpt4 key购买 nike

我正在创建自己的 Jenkins 共享库以在管道之间重用一些代码。我知道如何创建步骤(确实很容易)但是当我想在 jenkinsfile(或 Jenkins 在日志中说的 WorkflowScript)中访问我的“utils 类”时遇到了问题。
我将“Util 类”称为位于文件夹 src/my/domain/... 中的 groovy 类,它有很多方法,例如,我想创建一个像这样的日志类:

# 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 中的文件中实例化,以便可以使用一些代码从 Jenkinsfile 访问,例如:
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

我知道这意味着该实例不在正确的范围内,因此脚本无法直接看到,但我该怎么做?

谢谢!

最佳答案

看起来您正在使用您的 vars Jenkinsfile 中的脚本不正确,但我会尝试解决一些混淆:)

  • vars 中定义的 Groovy 脚本目录在您的 Jenkinsfile 中通过它们的文件名被称为“自定义”步骤。假设您的脚本名称保持不变 library.groovy ,您的 Jenkinsfile 应如下所示
    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您可以像在 Jenkinsfile 中一样使用所有基本的 Jenkins 步骤( shbat 等),以及通过 import 导入的任何 Groovy/Java 类。 (就像你的 Console 类(class))。

    您可能已经注意到,我还添加了一个 steps变量(不必手动声明或实例化)到 Console 的构造函数类(class)。这是必要的,因为您不能在 src 中定义的任何类中直接使用任何 Jenkins 步骤。目录。结果,该方法
    private def spit(msg, color){           
    ansiColor('xterm') {
    echo color + msg + '\033[0m'
    }
    }

    不会工作,因为 echo是 Jenkins 的一步。为了使用echo在你的类(class)里,你可以通过 steps构造函数的变量并将其存储在类中的另一个变量中。然后你可以调用所有 Jenkins 步骤,如 steps.echo "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'
    }
    }
    }

  • 那应该使它起作用。

    您应该考虑重命名您的 library.groovyvars虽然(例如 myLog.groovy )。那么你的 Jenkinsfile 可能看起来像这样
    node ("mynode") {
    myLog "Hello World!"
    }

    为了使用您的 Console的其他方法类,您可以在 vars 中创建其他脚本.使用它们看起来像这样
    node ("mynode") {
    myLog "Hello World!"
    myWarning "Hello World!"
    myError "Hello World!"
    mySuccess "Hello World!"
    }

    (我使用 my 前缀来避免与已经存在的 Jenkins 步骤发生名称冲突。例如, error 步骤已经存在并且在您的 Jenkinsfile 中调用它会取消您的构建)

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

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

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

    关于Jenkins 共享库实例化 util 类并在工作流脚本中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44943438/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com