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

时间:2017-07-06 08:20:16

标签: jenkins groovy shared-libraries jenkins-pipeline

我正在创建自己的Jenkins共享库,以便在管道之间重用一些代码。我知道如何创建步骤(确实非常容易)但是当我想要访问我的" utils类时,我遇到了问题"在jenkins文件中(或Jenkins在日志中说的WorkflowScript)。 我打电话给" Util class"位于文件夹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

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

谢谢!

1 个答案:

答案 0 :(得分:8)

看起来你在Jenkins文件中错误地使用了vars脚本,但我会尝试解决一些混淆:)

  1. vars目录中定义的Groovy脚本的文件名为" custom"进入你的Jenkins文件。假设您的脚本名称保持library.groovy,您的Jenkins文件应该如下所示

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

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

    node ("mynode") {
         library "Hello World!"
    }
    
  2. 此外,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等),以及通过{导入的任何Groovy / Java类{1}}(与您的import课程一样)。

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

    src

    不起作用,因为private def spit(msg, color){ ansiColor('xterm') { echo color + msg + '\033[0m' } } 是詹金斯的一步。要在类中使用echo,可以将echo变量传递给构造函数,并将其存储在类中的另一个变量中。然后,您可以调用所有Jenkins步骤,例如steps

    steps.echo "Hello World"
  3. 这应该让它发挥作用。

    您应该考虑重新命名# 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.groovy内的vars(例如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步骤已经存在,并且在Jenkins文件中调用它将取消您的构建)

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

    上的Jenkins文档

    您可以在https://jenkins.io/doc/pipeline/steps/workflow-basic-steps/

    找到所有基本Jenkins步骤的完整列表

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