From d2f4f528235e3d75e7609895fd7164e2cc49a415 Mon Sep 17 00:00:00 2001 From: tomek-d Date: Sun, 29 May 2022 18:25:28 +0200 Subject: [PATCH] Fix for shared lib and params variables being null in environment section --- .../GenericPipelineDeclaration.groovy | 30 ++++++++++- .../TestSharedLibraryEnvVariable.groovy | 51 +++++++++++++++++++ .../test_lib_var_not_defined_in_env.jenkins | 16 ++++++ .../test_params_not_defined_in_env.jenkins | 17 +++++++ .../env_var_not_defined/vars/envHelper.groovy | 4 ++ 5 files changed, 117 insertions(+), 1 deletion(-) create mode 100644 src/test/groovy/com/lesfurets/jenkins/TestSharedLibraryEnvVariable.groovy create mode 100644 src/test/jenkins/job/library/test_lib_var_not_defined_in_env.jenkins create mode 100644 src/test/jenkins/job/library/test_params_not_defined_in_env.jenkins create mode 100644 src/test/resources/libs/env_var_not_defined/vars/envHelper.groovy diff --git a/src/main/groovy/com/lesfurets/jenkins/unit/declarative/GenericPipelineDeclaration.groovy b/src/main/groovy/com/lesfurets/jenkins/unit/declarative/GenericPipelineDeclaration.groovy index 4300935c..e50b3d71 100644 --- a/src/main/groovy/com/lesfurets/jenkins/unit/declarative/GenericPipelineDeclaration.groovy +++ b/src/main/groovy/com/lesfurets/jenkins/unit/declarative/GenericPipelineDeclaration.groovy @@ -102,10 +102,38 @@ abstract class GenericPipelineDeclaration { env.env = env env.currentBuild = delegate.binding.currentBuild - def cl = this.environment.rehydrate(env, delegate, this) + def cl = this.environment.rehydrate(wrapEnv(env as Map), delegate, this) cl.resolveStrategy = DELEGATE_FIRST cl.call() } } + private def wrapEnv(Map env) { + return new GroovyObject() { + Object invokeMethod(String name, Object args) { + GenericPipelineDeclaration.this.invokeMethod(name, args) + } + + Object getProperty(String propertyName) { + if (env.containsKey(propertyName)) { + env.get(propertyName) + } else { + GenericPipelineDeclaration.this.getProperty(propertyName) + } + } + + void setProperty(String propertyName, Object newValue) { + env.put(propertyName, newValue) + } + + MetaClass getMetaClass() { + GenericPipelineDeclaration.this.metaClass + } + + void setMetaClass(MetaClass metaClass) { + throw new UnsupportedOperationException("This is wrapper object. Setting metadata class is not supported here.") + } + } + } + } diff --git a/src/test/groovy/com/lesfurets/jenkins/TestSharedLibraryEnvVariable.groovy b/src/test/groovy/com/lesfurets/jenkins/TestSharedLibraryEnvVariable.groovy new file mode 100644 index 00000000..f620d610 --- /dev/null +++ b/src/test/groovy/com/lesfurets/jenkins/TestSharedLibraryEnvVariable.groovy @@ -0,0 +1,51 @@ +package com.lesfurets.jenkins + +import com.lesfurets.jenkins.unit.declarative.DeclarativePipelineTest +import org.junit.Assert +import org.junit.Before +import org.junit.Test + +import static com.lesfurets.jenkins.unit.global.lib.LibraryConfiguration.library +import static com.lesfurets.jenkins.unit.global.lib.ProjectSource.projectSource + +class TestSharedLibraryEnvVariable extends DeclarativePipelineTest { + + String sharedLibVars = this.class.getResource("/libs/env_var_not_defined").getFile() + + @Override + @Before + void setUp() throws Exception { + scriptRoots += 'src/test/jenkins' + + super.setUp() + + def library = library().name("env_var_not_defined") + .retriever(projectSource(sharedLibVars)) + .defaultVersion("master") + .targetPath(sharedLibVars) + .allowOverride(true) + .implicit(false) + .build() + helper.registerSharedLibrary(library) + } + + @Test + void "test lib var not defined in env"() { + + runScript("job/library/test_lib_var_not_defined_in_env.jenkins") + + def prop1 = binding.env["prop1"] + Assert.assertEquals("magic", prop1) + } + + @Test + void "test params not defined in env"() { + def version = "1.2.0" + addParam("VERSION", version) + + runScript("job/library/test_params_not_defined_in_env.jenkins") + + def versionFromEnv = binding.env["VERSION"] + Assert.assertEquals(version, versionFromEnv.toString()) + } +} diff --git a/src/test/jenkins/job/library/test_lib_var_not_defined_in_env.jenkins b/src/test/jenkins/job/library/test_lib_var_not_defined_in_env.jenkins new file mode 100644 index 00000000..4d747941 --- /dev/null +++ b/src/test/jenkins/job/library/test_lib_var_not_defined_in_env.jenkins @@ -0,0 +1,16 @@ +@Library("env_var_not_defined") _ + +pipeline { + + environment { + prop1 = envHelper.property1() + } + + stages { + stage('Test stage'){ + steps { + echo "prop1=${env.prop1}" + } + } + } +} \ No newline at end of file diff --git a/src/test/jenkins/job/library/test_params_not_defined_in_env.jenkins b/src/test/jenkins/job/library/test_params_not_defined_in_env.jenkins new file mode 100644 index 00000000..76a0229a --- /dev/null +++ b/src/test/jenkins/job/library/test_params_not_defined_in_env.jenkins @@ -0,0 +1,17 @@ +pipeline { + agent none + parameters { + string name: 'VERSION', defaultValue: 'default-version' + } + environment { + VERSION = "${params.VERSION}" + } + stages { + stage('Print VERSION') { + steps { + echo env.VERSION // null when VERSION = "${VERSION}" + echo VERSION // default-version when VERSION = "${VERSION}" + } + } + } +} \ No newline at end of file diff --git a/src/test/resources/libs/env_var_not_defined/vars/envHelper.groovy b/src/test/resources/libs/env_var_not_defined/vars/envHelper.groovy new file mode 100644 index 00000000..0209a748 --- /dev/null +++ b/src/test/resources/libs/env_var_not_defined/vars/envHelper.groovy @@ -0,0 +1,4 @@ + +def property1() { + return "magic" +}