Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-70747

Expose environment variables in PostBuildScript plugin

    • Icon: Improvement Improvement
    • Resolution: Unresolved
    • Icon: Minor Minor
    • postbuildscript-plugin
    • None
    • Jenkins 2.375.3, PostBuildScript Plugin Version 3.2.0-460.va_fda_0fa_26720

      It would be useful to be able to access the environment variables in a Groovy script.

      Thanks to JENKINS-24308, this is partly possible using a deprecated method:

      def envVars = build.getEnvVars() // Deprecated
      envVars.each {k,v -> println "$k = $v"}

      This works for now, but getEnvVars() is deprecated.

      The suggested replacement is to use getEnvironment(TaskListener).

      I've tried a couple of ways, but both fail:

      • Using a LogTaskListener

      {{import java.util.logging.Level}}
      {{import java.util.logging.Logger}}
      {{import hudson.util.LogTaskListener}}

      {{def envVars = build.getEnvironment​(new LogTaskListener(Logger.getLogger("script"), Level.INFO))}}
      {{envVars.each {k,v -> println "$k = $v"}}}

      This fails with this exception:

      [PostBuildScript] - [INFO] Executing post build scripts.
      [PostBuildScript] - [INFO] An error occured during post-build processing.
      {{groovy.lang.MissingMethodException: No signature of method: hudson.maven.MavenModuleSetBuild.getEnvironment​() is applicable for argument types: (hudson.util.LogTaskListener) values: [hudson.util.LogTaskListener@8a58d4]}}
      Possible solutions: getEnvironment(), getEnvironments(), getEnvironment(hudson.model.TaskListener), getEnvironment(hudson.model.TaskListener), getEnvironment(hudson.model.TaskListener), getEnvironment(hudson.model.TaskListener)
      at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:71)
      at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:48)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:128)
      at Script1.run(Script1.groovy:5)
      at groovy.lang.GroovyShell.evaluate(GroovyShell.java:574)
      at groovy.lang.GroovyShell.evaluate(GroovyShell.java:612)
      at groovy.lang.GroovyShell.evaluate(GroovyShell.java:583)
      at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript.evaluate(SecureGroovyScript.java:450)
      at org.jenkinsci.plugins.postbuildscript.service.GroovyScriptExecutor.execute(GroovyScriptExecutor.java:49)
      at org.jenkinsci.plugins.postbuildscript.service.GroovyScriptPreparer.evaluateScript(GroovyScriptPreparer.java:53)
      at org.jenkinsci.plugins.postbuildscript.service.GroovyScriptPreparer.evaluateScript(GroovyScriptPreparer.java:38)
      at org.jenkinsci.plugins.postbuildscript.processor.Processor.processGroovyScripts(Processor.java:152)
      at org.jenkinsci.plugins.postbuildscript.processor.Processor.processScripts(Processor.java:90)

      • Using a StreamBuildListener

       

       

      import hudson.model.StreamBuildListener
      import java.nio.charset.StandardCharsets

      def taskListener = new hudson.model.StreamBuildListener(OutputStream.nullOutputStream(), java.nio.charset.StandardCharsets.UTF_8)
      {{def envVars = build.getEnvironment​(taskListener)}}
      envVars.each {k,v -> println "$k = $v"}

      This fails with this exception:

      [PostBuildScript] - [INFO] Executing post build scripts.
      [PostBuildScript] - [INFO] An error occured during post-build processing.
      {{groovy.lang.MissingMethodException: No signature of method: hudson.maven.MavenModuleSetBuild.getEnvironment​() is applicable for argument types: (hudson.model.StreamBuildListener) values: [hudson.model.StreamBuildListener@7cb4e1f8]}}
      Possible solutions: getEnvironment(), getEnvironments(), getEnvironment(hudson.model.TaskListener), getEnvironment(hudson.model.TaskListener), getEnvironment(hudson.model.TaskListener), getEnvironment(hudson.model.TaskListener)
      at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:71)
      at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:48)
      at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)
      at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:128)
      at Script1.run(Script1.groovy:5)
      at groovy.lang.GroovyShell.evaluate(GroovyShell.java:574)
      at groovy.lang.GroovyShell.evaluate(GroovyShell.java:612)
      at groovy.lang.GroovyShell.evaluate(GroovyShell.java:583)
      at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript.evaluate(SecureGroovyScript.java:450)
      at org.jenkinsci.plugins.postbuildscript.service.GroovyScriptExecutor.execute(GroovyScriptExecutor.java:49)
      at org.jenkinsci.plugins.postbuildscript.service.GroovyScriptPreparer.evaluateScript(GroovyScriptPreparer.java:53)
      at org.jenkinsci.plugins.postbuildscript.service.GroovyScriptPreparer.evaluateScript(GroovyScriptPreparer.java:38)
      at org.jenkinsci.plugins.postbuildscript.processor.Processor.processGroovyScripts(Processor.java:152)
      at org.jenkinsci.plugins.postbuildscript.processor.Processor.processScripts(Processor.java:90)

      It might be that different class loaders are used and that it would cause a signature mismatch for hudson.model.TaskListener

      A possible solution might be to add this to GroovyScriptExecutor.execute():

      binding.setVariable("envVars", build.getEnvironment(log.getListener()));

          [JENKINS-70747] Expose environment variables in PostBuildScript plugin

          Bruno Harbulot created issue -
          Bruno Harbulot made changes -
          Description Original: It would be useful to be able to access the environment variables in a Groovy script.

          Thanks to JENKINS-24308, this is partly possible using a deprecated method:
          {quote}{{def envVars = build.getEnvVars() // Deprecated}}
          {{{}envVars.each {k,v -> println "$k = $v"{}}}}
          {quote}
          This works for now, but {{getEnvVars()}} is deprecated.

          The suggested replacement is to use {{{}getEnvironment(TaskListener){}}}.

          I've tried a couple of ways, but both fail:
           * Using a LogTaskListener

          {quote}{{{{{}import java.util.logging.Level{}}}}}
          {{{{{}import java.util.logging.Logger{}}}}}
          {{{{{}import hudson.util.LogTaskListener{}}}}}

          {\{def envVars = build.getEnvironment​(new LogTaskListener(Logger.getLogger("script"), Level.INFO))}}
          {{{}envVars.each {k,v -> println "$k = $v"{}}}}
          {quote}
          This fails with this exception:
          {quote}{{[PostBuildScript] - [INFO] Executing post build scripts.}}
          {{[PostBuildScript] - [INFO] An error occured during post-build processing.}}
          {{groovy.lang.MissingMethodException: No signature of method: hudson.maven.MavenModuleSetBuild.getEnvironment​() is applicable for argument types: (hudson.util.LogTaskListener) values: [hudson.util.LogTaskListener@8a58d4]}}
          {{Possible solutions: getEnvironment(), getEnvironments(), getEnvironment(hudson.model.TaskListener), getEnvironment(hudson.model.TaskListener), getEnvironment(hudson.model.TaskListener), getEnvironment(hudson.model.TaskListener)}}
          {{at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:71)}}
          {{at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:48)}}
          {{at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)}}
          {{at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)}}
          {{at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:128)}}
          {{at Script1.run(Script1.groovy:5)}}
          {{at groovy.lang.GroovyShell.evaluate(GroovyShell.java:574)}}
          {{at groovy.lang.GroovyShell.evaluate(GroovyShell.java:612)}}
          {{at groovy.lang.GroovyShell.evaluate(GroovyShell.java:583)}}
          {{at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript.evaluate(SecureGroovyScript.java:450)}}
          {{at org.jenkinsci.plugins.postbuildscript.service.GroovyScriptExecutor.execute(GroovyScriptExecutor.java:49)}}
          {{at org.jenkinsci.plugins.postbuildscript.service.GroovyScriptPreparer.evaluateScript(GroovyScriptPreparer.java:53)}}
          {{at org.jenkinsci.plugins.postbuildscript.service.GroovyScriptPreparer.evaluateScript(GroovyScriptPreparer.java:38)}}
          {{at org.jenkinsci.plugins.postbuildscript.processor.Processor.processGroovyScripts(Processor.java:152)}}
          {{at org.jenkinsci.plugins.postbuildscript.processor.Processor.processScripts(Processor.java:90)}}
          {quote} * Using a StreamBuildListener

           
          {quote}{{import hudson.model.StreamBuildListener}}
          {{import java.nio.charset.StandardCharsets}}

          {{def taskListener = new hudson.model.StreamBuildListener(OutputStream.nullOutputStream(), java.nio.charset.StandardCharsets.UTF_8)}}
          {\{def envVars = build.getEnvironment​(taskListener)}}
          {{{}envVars.each {k,v -> println "$k = $v"{}}}}
          {quote}
          This fails with this exception:
          {quote}{{[PostBuildScript] - [INFO] Executing post build scripts.}}
          {{[PostBuildScript] - [INFO] An error occured during post-build processing.}}
          {{groovy.lang.MissingMethodException: No signature of method: hudson.maven.MavenModuleSetBuild.getEnvironment​() is applicable for argument types: (hudson.model.StreamBuildListener) values: [hudson.model.StreamBuildListener@7cb4e1f8]}}
          {{Possible solutions: getEnvironment(), getEnvironments(), getEnvironment(hudson.model.TaskListener), getEnvironment(hudson.model.TaskListener), getEnvironment(hudson.model.TaskListener), getEnvironment(hudson.model.TaskListener)}}
          {{at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:71)}}
          {{at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:48)}}
          {{at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)}}
          {{at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)}}
          {{at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:128)}}
          {{at Script1.run(Script1.groovy:5)}}
          {{at groovy.lang.GroovyShell.evaluate(GroovyShell.java:574)}}
          {{at groovy.lang.GroovyShell.evaluate(GroovyShell.java:612)}}
          {{at groovy.lang.GroovyShell.evaluate(GroovyShell.java:583)}}
          {{at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript.evaluate(SecureGroovyScript.java:450)}}
          {{at org.jenkinsci.plugins.postbuildscript.service.GroovyScriptExecutor.execute(GroovyScriptExecutor.java:49)}}
          {{at org.jenkinsci.plugins.postbuildscript.service.GroovyScriptPreparer.evaluateScript(GroovyScriptPreparer.java:53)}}
          {{at org.jenkinsci.plugins.postbuildscript.service.GroovyScriptPreparer.evaluateScript(GroovyScriptPreparer.java:38)}}
          {{at org.jenkinsci.plugins.postbuildscript.processor.Processor.processGroovyScripts(Processor.java:152)}}
          {{at org.jenkinsci.plugins.postbuildscript.processor.Processor.processScripts(Processor.java:90)}}
          {quote}
          It might be that different class loaders are used and that it would cause a signature mismatch for {{hudson.model.TaskListener}}

          A possible solution might be to add this to {{{}GroovyScriptExecutor.execute(){}}}:

          {{binding.setVariable("envVars", build.getEnvironment(log.getListener()));}}
          New: It would be useful to be able to access the environment variables in a Groovy script.

          Thanks to JENKINS-24308, this is partly possible using a deprecated method:
          {quote}{{def envVars = build.getEnvVars() // Deprecated}}
          {{{}envVars.each {k,v -> println "$k = $v"{}}}}
          {quote}
          This works for now, but {{getEnvVars()}} is deprecated.

          The suggested replacement is to use {{{}getEnvironment(TaskListener){}}}.

          I've tried a couple of ways, but both fail:
           * Using a LogTaskListener

          {quote}{{{{import java.util.logging.Level}}}}
          {{{{import java.util.logging.Logger}}}}
          {{{{import hudson.util.LogTaskListener}}}}

          {{def envVars = build.getEnvironment​(new LogTaskListener(Logger.getLogger("script"), Level.INFO))}}
          {{{{{}envVars.each {k,v -> println "$k = $v"{}}}}}}
          {quote}
          This fails with this exception:
          {quote}{{[PostBuildScript] - [INFO] Executing post build scripts.}}
          {{[PostBuildScript] - [INFO] An error occured during post-build processing.}}
          {{groovy.lang.MissingMethodException: No signature of method: hudson.maven.MavenModuleSetBuild.getEnvironment​() is applicable for argument types: (hudson.util.LogTaskListener) values: [hudson.util.LogTaskListener@8a58d4]}}
          {{Possible solutions: getEnvironment(), getEnvironments(), getEnvironment(hudson.model.TaskListener), getEnvironment(hudson.model.TaskListener), getEnvironment(hudson.model.TaskListener), getEnvironment(hudson.model.TaskListener)}}
          {{at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:71)}}
          {{at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:48)}}
          {{at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)}}
          {{at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)}}
          {{at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:128)}}
          {{at Script1.run(Script1.groovy:5)}}
          {{at groovy.lang.GroovyShell.evaluate(GroovyShell.java:574)}}
          {{at groovy.lang.GroovyShell.evaluate(GroovyShell.java:612)}}
          {{at groovy.lang.GroovyShell.evaluate(GroovyShell.java:583)}}
          {{at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript.evaluate(SecureGroovyScript.java:450)}}
          {{at org.jenkinsci.plugins.postbuildscript.service.GroovyScriptExecutor.execute(GroovyScriptExecutor.java:49)}}
          {{at org.jenkinsci.plugins.postbuildscript.service.GroovyScriptPreparer.evaluateScript(GroovyScriptPreparer.java:53)}}
          {{at org.jenkinsci.plugins.postbuildscript.service.GroovyScriptPreparer.evaluateScript(GroovyScriptPreparer.java:38)}}
          {{at org.jenkinsci.plugins.postbuildscript.processor.Processor.processGroovyScripts(Processor.java:152)}}
          {{at org.jenkinsci.plugins.postbuildscript.processor.Processor.processScripts(Processor.java:90)}}
          {quote}
          * Using a StreamBuildListener

           

           
          {quote}{{import hudson.model.StreamBuildListener}}
          {{import java.nio.charset.StandardCharsets}}

          {{def taskListener = new hudson.model.StreamBuildListener(OutputStream.nullOutputStream(), java.nio.charset.StandardCharsets.UTF_8)}}
          {{def envVars = build.getEnvironment​(taskListener)}}
          {{{}envVars.each {k,v -> println "$k = $v"{}}}}
          {quote}
          This fails with this exception:
          {quote}{{[PostBuildScript] - [INFO] Executing post build scripts.}}
          {{[PostBuildScript] - [INFO] An error occured during post-build processing.}}
          {{groovy.lang.MissingMethodException: No signature of method: hudson.maven.MavenModuleSetBuild.getEnvironment​() is applicable for argument types: (hudson.model.StreamBuildListener) values: [hudson.model.StreamBuildListener@7cb4e1f8]}}
          {{Possible solutions: getEnvironment(), getEnvironments(), getEnvironment(hudson.model.TaskListener), getEnvironment(hudson.model.TaskListener), getEnvironment(hudson.model.TaskListener), getEnvironment(hudson.model.TaskListener)}}
          {{at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:71)}}
          {{at org.codehaus.groovy.runtime.callsite.PojoMetaClassSite.call(PojoMetaClassSite.java:48)}}
          {{at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)}}
          {{at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:116)}}
          {{at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:128)}}
          {{at Script1.run(Script1.groovy:5)}}
          {{at groovy.lang.GroovyShell.evaluate(GroovyShell.java:574)}}
          {{at groovy.lang.GroovyShell.evaluate(GroovyShell.java:612)}}
          {{at groovy.lang.GroovyShell.evaluate(GroovyShell.java:583)}}
          {{at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SecureGroovyScript.evaluate(SecureGroovyScript.java:450)}}
          {{at org.jenkinsci.plugins.postbuildscript.service.GroovyScriptExecutor.execute(GroovyScriptExecutor.java:49)}}
          {{at org.jenkinsci.plugins.postbuildscript.service.GroovyScriptPreparer.evaluateScript(GroovyScriptPreparer.java:53)}}
          {{at org.jenkinsci.plugins.postbuildscript.service.GroovyScriptPreparer.evaluateScript(GroovyScriptPreparer.java:38)}}
          {{at org.jenkinsci.plugins.postbuildscript.processor.Processor.processGroovyScripts(Processor.java:152)}}
          {{at org.jenkinsci.plugins.postbuildscript.processor.Processor.processScripts(Processor.java:90)}}
          {quote}
          It might be that different class loaders are used and that it would cause a signature mismatch for {{hudson.model.TaskListener}}

          A possible solution might be to add this to {{{}GroovyScriptExecutor.execute(){}}}:

          {{binding.setVariable("envVars", build.getEnvironment(log.getListener()));}}

            dheid Daniel Heid
            bharbulot Bruno Harbulot
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated: