我正在寻找关于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文件或步骤引用实例的方法?如果可能,请分享一个例子。
谢谢!
答案 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
使用单例的一个缺点是它们可以在任何地方进行修改,并且此更改将填充到所有呼叫者。