詹金斯共享图书馆全球/单班

ISZ*_*ISZ 5 groovy shared-libraries jenkins

我正在寻找有关Jenkins共享库设计的一些指导,涉及使用类,对其进行初始化,然后能够在我的任何vars文件中使用该实例。

结构体

src
  - foo
   - class
     - Configuration.groovy
vars
  - cicd.groovy
  - doMore.groovy
Run Code Online (Sandbox Code Playgroud)

以下是一个我想初始化一次,但随后可以在任何地方使用的类,而不必将其传递给每个vars函数或每次都重新初始化。

package foo.class

public class Configuration {

    public String Foo

    public String Bar    

}
Run Code Online (Sandbox Code Playgroud)

Vars

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

#!groovy
import foo.class.Configuration

def call () {

    return initCicd()
}

def initCicd() {
    configuration = new Configuration()
    configuration.Foo = 'FOO'
    return configuration
}
Run Code Online (Sandbox Code Playgroud)

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

#!groovy
import foo.class.Configuration

def call () {

    println configuration.Foo
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

Szy*_*iak 6

您可以简单地将 Groovy 的@Singleton注释用于您的Configuration类,并Configuration.instance在您想要访问配置设置的任何地方使用。考虑以下示例:

.
??? src
?   ??? foo
?       ??? Configuration.groovy
??? vars
    ??? cicd.groovy
    ??? doMore.groovy
Run Code Online (Sandbox Code Playgroud)

src/foo/Configuration.groovy

package foo

@Singleton
class Configuration {
    public String foo = 'foo_123'
    public String bar = 'bar_456'
}
Run Code Online (Sandbox Code Playgroud)

vars/cicd.groovy

#!groovy

import foo.Configuration

def call() {
    return initCicd()
}

def initCicd() {
    println Configuration.instance.foo
    return Configuration.instance
}
Run Code Online (Sandbox Code Playgroud)

变量/doMore.groovy

#!groovy

import foo.Configuration

def call() {
    println Configuration.instance.bar
}
Run Code Online (Sandbox Code Playgroud)

在管道脚本中,我简单地调用:

cicd()
doMore()
Run Code Online (Sandbox Code Playgroud)

我在控制台日志中得到类似的信息:

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
Run Code Online (Sandbox Code Playgroud)

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

  • 场景 1:在 master 上运行的作业。在这种情况下,您是说不同的作业会共享相同的配置吗?因此,如果作业 1 有一个在单例上设置的参数,它是否可以从一个不同值的并发作业参数更改?场景 2:容器化作业。在这种情况下,Jenkins 将每个作业提供给一个 JNLP 从属容器。容器被挂载到主机上(docker out of docker),但仍然应该是一个单独的进程。我会认为在这种情况下,单身人士会与其他工作影响隔离吗? (2认同)