Hi -

I have an issue with variables being restored in a pipeline job after a 
Jenkins restart.

Say I have a pipeline like this:

// Local var set to 'env'
def localEnv = env

// Simple local var
def foo = "Bar"

pipeline {
    agent any
    
    environment {
        
        // You can do it here but I really want the whole env in my own var
        myBuildNumber = "${env.BUILD_NUMBER}"
    }
    
    stages {
        
        stage('Init') {
            
            steps {
                echo "${localEnv.BUILD_NUMBER}"    
            }
        }
        
        stage('Hello') {
            steps {
                
                echo "hello"
                
                input 'Waiting for input...'
                
                // Lets see what we have
                echo "localEnv.BUILD_NUMBER = ${localEnv.BUILD_NUMBER}"
                echo "env.BUILD_NUMBER = ${env.BUILD_NUMBER}"
                echo "foo = ${foo}"
                echo "myBuildNumber = ${myBuildNumber}"
            }
        }
    }
}

I am making my own local variable as copy of the 'env' variable (localEnv). 
I do this a lot in my jobs because I call custom library DSL-type structure 
similar to this:

myCustomThing {
   reference = localEnv.BUILD_NUMBER
   message = "Something about build ${localEnv.BUILD_NUMBER}"
}

If I use 'env' there, I get a null pointer exception on this closure - 
something to do with groovy Closure delegate (that is another question I 
guess), so I did this 'def localEnv = env' thing to get around that. 
Anyway, for the normal case my job above outputs this after selecting 
approve on the input and all is well:

Waiting for input...

Proceed <http://localhost:32779/job/Foo/21/console#> or Abort 
<http://localhost:32779/job/Foo/21/console#>

Approved by Bill Dennis <http://localhost:32779/user/bill>

[Pipeline] echo

localEnv.BUILD_NUMBER = 21

[Pipeline] echo

env.BUILD_NUMBER = 21

[Pipeline] echo

foo = Bar

[Pipeline] echo

myBuildNumber = 21

When I restart Jenkins while the input is waiting then approve the input 
the output is like this (note the null):

Waiting for input...

Proceed <http://localhost:32781/job/Foo/22/console#> or Abort 
<http://localhost:32781/job/Foo/22/console#>

Resuming build at Mon Mar 27 23:48:21 UTC 2017 after Jenkins restart

Ready to run at Mon Mar 27 23:48:32 UTC 2017

Approved by Bill Dennis <http://localhost:32781/user/bill>

[Pipeline] echo

localEnv.BUILD_NUMBER = null

[Pipeline] echo

env.BUILD_NUMBER = 22

[Pipeline] echo

foo = Bar


As can be seen, 'localEnv.BUILD_NUMBER' comes back as *null* after the 
Jenkins restart. So it looks like I need to do a deep-copy of the 'env' or 
set up many more variables in my environment section for everything that 
needs to be available from 'env' surviving a restart, so that things I need 
cans be passed to any of my shared library stuff. 


Does anyone have any deeper understanding of this?


Thanks,

--Bill




-- 
You received this message because you are subscribed to the Google Groups 
"Jenkins Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/jenkinsci-users/8aa04dac-5299-4d08-ba59-3a1a816c606c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to