diff --git a/resources/default_pipeline_environment.yml b/resources/default_pipeline_environment.yml index 21c806922..26bb4cfbc 100644 --- a/resources/default_pipeline_environment.yml +++ b/resources/default_pipeline_environment.yml @@ -17,8 +17,11 @@ steps: dockerImage: 'maven:3.5-jdk-7' influxWriteData: influxServer: 'jenkins' + mtaBuild: + buildTarget: 'NEO' neoDeploy: deployMode: 'mta' warAction: 'deploy' vmSize: 'lite' neoCredentialsId: 'CI_CREDENTIALS_ID' + diff --git a/src/com/sap/piper/ConfigurationMerger.groovy b/src/com/sap/piper/ConfigurationMerger.groovy index 82d489154..05ee43f90 100644 --- a/src/com/sap/piper/ConfigurationMerger.groovy +++ b/src/com/sap/piper/ConfigurationMerger.groovy @@ -46,4 +46,19 @@ class ConfigurationMerger { return merged } + + @NonCPS + def static merge( + Map parameters, List parameterKeys, + Map generalConfigurationMap, List generalConfigurationKeys, Map generalConfigurationDefaults, + Map stepConfigurationMap, List stepConfigurationKeys, Map stepConfigurationDefaults=[:] + ){ + Map merged + Map mergedStepConfiguration = merge(stepConfigurationMap, stepConfigurationKeys, stepConfigurationDefaults) + Map mergedGeneralConfiguration = merge(generalConfigurationMap, generalConfigurationKeys, generalConfigurationDefaults) + merged = merge(mergedGeneralConfiguration, null, mergedStepConfiguration) + merged = merge(parameters, parameterKeys, merged) + + return merged + } } diff --git a/test/groovy/MTABuildTest.groovy b/test/groovy/MTABuildTest.groovy index e678aec8e..a3b3a7641 100644 --- a/test/groovy/MTABuildTest.groovy +++ b/test/groovy/MTABuildTest.groovy @@ -1,6 +1,6 @@ import hudson.AbortException -import org.jenkinsci.plugins.pipeline.utility.steps.shaded.org.yaml.snakeyaml.Yaml -import org.jenkinsci.plugins.pipeline.utility.steps.shaded.org.yaml.snakeyaml.parser.ParserException +import org.yaml.snakeyaml.Yaml +import org.yaml.snakeyaml.parser.ParserException import org.junit.Before import org.junit.Rule import org.junit.Test @@ -42,10 +42,6 @@ public class MTABuildTest extends BasePipelineTest { mtaYaml = new File("$currentDir/mta.yaml") mtaYaml << defaultMtaYaml() - helper.registerAllowedMethod('readYaml', [Map], { - m -> - return new Yaml().load((m.file as File).text) - }) helper.registerAllowedMethod('pwd', [], { currentDir } ) binding.setVariable('PATH', '/usr/bin') @@ -123,7 +119,7 @@ public class MTABuildTest extends BasePipelineTest { assert jscr.shell[1].contains(' -jar /mylocation/mta/mta.jar --mtar ') - assert jlr.log.contains('[mtaBuild] MTA JAR "/mylocation/mta/mta.jar" retrieved from parameters.') + assert jlr.log.contains('[mtaBuild] MTA JAR "/mylocation/mta/mta.jar" retrieved from configuration.') } @@ -161,16 +157,6 @@ public class MTABuildTest extends BasePipelineTest { } - @Test - void noBuildTargetTest() { - - thrown.expect(Exception) - thrown.expectMessage('ERROR - NO VALUE AVAILABLE FOR buildTarget') - - mtaBuildScript.call() - } - - @Test void mtaJarLocationFromEnvironmentTest() { @@ -184,6 +170,50 @@ public class MTABuildTest extends BasePipelineTest { } + @Test + void mtaJarLocationFromCustomStepConfigurationTest() { + + cpe.configuration = [general:[mtaJarLocation: '/general/mta']] + + mtaBuildScript.call(script: [commonPipelineEnvironment: cpe], + buildTarget: 'NEO') + + assert jscr.shell[1].contains('-jar /general/mta/mta.jar --mtar') + assert jlr.log.contains('[mtaBuild] MTA JAR "/general/mta/mta.jar" retrieved from configuration.') + } + + + @Test + void buildTargetFromParametersTest() { + + mtaBuildScript.call(buildTarget: 'NEO') + + assert jscr.shell[1].contains('java -jar mta.jar --mtar com.mycompany.northwind.mtar --build-target=NEO build') + } + + + @Test + void buildTargetFromCustomStepConfigurationTest() { + + cpe.configuration = [steps:[mtaBuild:[buildTarget: 'NEO']]] + + mtaBuildScript.call(script: [commonPipelineEnvironment: cpe]) + + assert jscr.shell[1].contains('java -jar mta.jar --mtar com.mycompany.northwind.mtar --build-target=NEO build') + } + + + @Test + void buildTargetFromDefaultStepConfigurationTest() { + + cpe.defaultConfiguration = [steps:[mtaBuild:[buildTarget: 'NEO']]] + + mtaBuildScript.call(script: [commonPipelineEnvironment: cpe]) + + assert jscr.shell[1].contains('java -jar mta.jar --mtar com.mycompany.northwind.mtar --build-target=NEO build') + } + + private defaultMtaYaml() { return ''' _schema-version: "2.0.0" diff --git a/test/groovy/util/JenkinsReadYamlRule.groovy b/test/groovy/util/JenkinsReadYamlRule.groovy index 187bb8d32..09b3248a2 100644 --- a/test/groovy/util/JenkinsReadYamlRule.groovy +++ b/test/groovy/util/JenkinsReadYamlRule.groovy @@ -29,7 +29,7 @@ class JenkinsReadYamlRule implements TestRule { if(m.text) { return new Yaml().load(m.text) } else if(m.file) { - throw new UnsupportedOperationException() + return new Yaml().load((m.file as File).text) } else { throw new IllegalArgumentException("Key 'text' is missing in map ${m}.") } diff --git a/vars/mtaBuild.groovy b/vars/mtaBuild.groovy index 1601512b8..6f92c8946 100644 --- a/vars/mtaBuild.groovy +++ b/vars/mtaBuild.groovy @@ -1,16 +1,37 @@ -import com.sap.piper.Utils +import com.sap.piper.ConfigurationLoader +import com.sap.piper.ConfigurationMerger def call(Map parameters = [:]) { - handlePipelineStepErrors (stepName: 'mtaBuild', stepParameters: parameters) { + def stepName = 'mtaBuild' - def utils = new Utils() - def buildTarget = utils.getMandatoryParameter(parameters, 'buildTarget', null) - def script = parameters.script - if (script == null){ - script = [commonPipelineEnvironment: commonPipelineEnvironment] - } + List parameterKeys = [ + 'buildTarget', + 'mtaJarLocation' + ] + + List stepConfigurationKeys = [ + 'buildTarget' + ] + + List generalConfigurationKeys = [ + 'mtaJarLocation' + ] + + handlePipelineStepErrors (stepName: stepName, stepParameters: parameters) { + + final script = parameters?.script ?: [commonPipelineEnvironment: commonPipelineEnvironment] + + prepareDefaultValues script: script + + final Map stepConfiguration = ConfigurationLoader.stepConfiguration(script, stepName) + final Map stepDefaults = ConfigurationLoader.defaultStepConfiguration(script, stepName) + final Map generalConfiguration = ConfigurationLoader.generalConfiguration(script) + final Map configuration = ConfigurationMerger.merge( + parameters, parameterKeys, + generalConfiguration, generalConfigurationKeys, [:], + stepConfiguration, stepConfigurationKeys, stepDefaults) def mtaYaml = readYaml file: "${pwd()}/mta.yaml" @@ -24,7 +45,8 @@ def call(Map parameters = [:]) { def mtarFileName = "${id}.mtar" - def mtaJar = getMtaJar(parameters) + def mtaJar = getMtaJar(stepName, configuration) + def buildTarget = configuration.buildTarget sh """#!/bin/bash export PATH=./node_modules/.bin:${PATH} @@ -32,27 +54,28 @@ def call(Map parameters = [:]) { """ def mtarFilePath = "${pwd()}/${mtarFileName}" - script.commonPipelineEnvironment.setMtarFilePath(mtarFilePath) + script?.commonPipelineEnvironment?.setMtarFilePath(mtarFilePath) return mtarFilePath } } -private getMtaJar(parameters) { +private getMtaJar(stepName, configuration) { def mtaJarLocation = 'mta.jar' //default, maybe it is in current working directory - if(parameters?.mtaJarLocation){ - mtaJarLocation = "${parameters.mtaJarLocation}/mta.jar" - echo "[mtaBuild] MTA JAR \"${mtaJarLocation}\" retrieved from parameters." + if(configuration?.mtaJarLocation){ + mtaJarLocation = "${configuration.mtaJarLocation}/mta.jar" + echo "[$stepName] MTA JAR \"${mtaJarLocation}\" retrieved from configuration." return mtaJarLocation } if(env?.MTA_JAR_LOCATION){ mtaJarLocation = "${env.MTA_JAR_LOCATION}/mta.jar" - echo "[mtaBuild] MTA JAR \"${mtaJarLocation}\" retrieved from environment." + echo "[$stepName] MTA JAR \"${mtaJarLocation}\" retrieved from environment." return mtaJarLocation } - echo "[mtaBuild] Using MTA JAR from current working directory." + echo "[$stepName] Using MTA JAR from current working directory." return mtaJarLocation } +