В документации Jenkins упоминается, что все определения var являются одиночными по требованию, но не объясняется, что это значит. Ссылка на документацию:
https://jenkins.io/doc/book/pipeline/shared-libraries/#defining-global-variables
Означает ли это, что синглтон определяется в момент вызова задания и является ли он уникальным экземпляром для этой конкретной работы? И как это соотносится с явным вызовом @Singleton при размещении в классе?
Я попытался настроить свой общий конвейер, чтобы я мог просмотреть обе его стороны. Когда я запускаю приведенный ниже код, я вижу в выводе, что оба класса выводят ожидаемую информацию. Они оба начинаются как пустые строки , а затем устанавливаются равными env.BUILD_TAG (список поддерживаемых переменных env здесь) .
Меня беспокоит то, что если у меня одновременно запущено несколько заданий, они используют один и тот же синглтон или он уникален для каждой сборки? До сих пор я не смог доказать это, поэтому я надеялся, что у кого-то есть ответ на этот вопрос.
Структура
src
- org
- utilities
- GlobalStateClass.groovy
vars
- globalStateVar.groovy
- main.groovy
GlobalStateClass.groovy
#!groovy
package org.utilities
@Singleton
class GlobalStateClass implements Serialization{
public String version = ""
}
globalStateVar.groovy
#!groovy
class globalStateVar implements Serialization{
public String version = ""
}
main.groovy
#!groovy
import org.utilities.GlobalStateClass
def call () {
println "Old Values: ${ GlobalStateClass.instance.version } ${ globalStateVar.version }"
String v = env.BUILD_TAG
GlobalState.instance.version = v
globalStateVar.version = v
println "New Values: ${ GlobalStateClass.instance.version } ${ globalStateVar.version }"
}
Jenkinsfile
pipeline {
agent any
stages {
stage('test 0'){
main()
}
stage('test 1'){
main()
}
stage('test 2'){
main()
}
stage('test 3'){
main()
}
}
}