Jenkins共享图书馆全球/单身人士班

时间:2018-02-17 15:26:08

标签: jenkins groovy shared-libraries

我正在寻找关于Jenkins共享库设计的一些指导,包括使用类,初始化它,然后能够在我的任何vars文件中使用该实例。

结构

src
  - foo
   - class
     - Configuration.groovy
vars
  - cicd.groovy
  - doMore.groovy

以下是我想要初始化一次的类,但随后可以在任何地方使用,无需将其传递到每个vars函数中,或者每次都重新初始化。

package foo.class

public class Configuration {

    public String Foo

    public String Bar    

}

瓦尔

在我的 cicd.groovy vars文件中,我有类似这样的内容:

#!groovy
import foo.class.Configuration

def call () {

    return initCicd()
}

def initCicd() {
    configuration = new Configuration()
    configuration.Foo = 'FOO'
    return configuration
}

但是,在 doMore.groovy 等其他vars文件中,我想使用相同的配置实例。

#!groovy
import foo.class.Configuration

def call () {

    println configuration.Foo
}

是否有一个在Jenkins共享库中有效的Singleton模式,或者是一种跨vars文件或步骤引用实例的方法?如果可能,请分享一个例子。

谢谢!

1 个答案:

答案 0 :(得分:1)

您只需为您的Configuration课程使用Groovy的@Singleton注释,并在您想要访问配置设置的任何位置使用Configuration.instance。请考虑以下示例:

.
├── src
│   └── foo
│       └── Configuration.groovy
└── vars
    ├── cicd.groovy
    └── doMore.groovy

的src /富/ Configuration.groovy

package foo

@Singleton
class Configuration {
    public String foo = 'foo_123'
    public String bar = 'bar_456'
}

乏/ cicd.groovy

#!groovy

import foo.Configuration

def call() {
    return initCicd()
}

def initCicd() {
    println Configuration.instance.foo
    return Configuration.instance
}

乏/ doMore.groovy

#!groovy

import foo.Configuration

def call() {
    println Configuration.instance.bar
}

在管道脚本中,我只需调用:

cicd()
doMore()

我在控制台日志中得到类似内容:

Loading library default_jenkins_libs@master
Attempting to resolve master from remote references...
 > git --version # timeout=10
 > git ls-remote -h -t file:///var/jenkins_home/libraries # timeout=10
Found match: refs/heads/master revision 4fa988ccde542d77d19febd72f532ef996971a5d
 > git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
 > git config remote.origin.url file:///var/jenkins_home/libraries # timeout=10
Fetching without tags
Fetching upstream changes from file:///var/jenkins_home/libraries
 > git --version # timeout=10
 > git fetch --no-tags --progress file:///var/jenkins_home/libraries +refs/heads/*:refs/remotes/origin/*
Checking out Revision 4fa988ccde542d77d19febd72f532ef996971a5d (master)
 > git config core.sparsecheckout # timeout=10
 > git checkout -f 4fa988ccde542d77d19febd72f532ef996971a5d
Commit message: "update"
 > git rev-list --no-walk 39890b4ca39bf32ebde8c7ad143b110bf16cf6b3 # timeout=10
[Pipeline] echo
foo_123
[Pipeline] echo
bar_456
[Pipeline] End of Pipeline
Finished: SUCCESS

使用单例的一个缺点是它们可以在任何地方进行修改,并且此更改将填充到所有呼叫者。