-
Improvement
-
Resolution: Unresolved
-
Minor
In the Jenkins documentation, it mentions that all var definitions are on-demand singletons, but does not explain what that means. Documentation reference: https://jenkins.io/doc/book/pipeline/shared-libraries/#defining-global-variables
Does this mean that the singleton is determined at the moment the job is called, so its a unique instance for that particular job? And how does this compare to an explicit @Singleton call when placed on a class?
I tried setting up my shared pipeline so I could review both sides of it. When I run the code below, I can see in the output that both classes print out the information I expect. They both start as empty strings and then are set equal to the env.BUILD_TAG.
My concern is that if I have multiple jobs running concurrently, do they share the same Singleton or is it unique to each build? So far I have not been able to prove this, so I was hoping someone has an answer to this.
Structure
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 } ${ state.version }" String v = env.BUILD_TAG GlobalState.instance.version = v state.version = v println "New Values: ${ GlobalStateClass.instance.version } ${ state.version }" }
Jenkinsfile
pipeline { agent any stages { stage('test 0'){ main() } stage('test 1'){ main() } stage('test 2'){ main() } stage('test 3'){ main() } } }