github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/src/com/sap/piper/DefaultValueCache.groovy (about) 1 package com.sap.piper 2 3 @API 4 class DefaultValueCache implements Serializable { 5 private static DefaultValueCache instance 6 7 private Map defaultValues 8 9 private List customDefaults = [] 10 11 private DefaultValueCache(Map defaultValues, List customDefaults){ 12 this.defaultValues = defaultValues 13 if(customDefaults) { 14 this.customDefaults.addAll(customDefaults) 15 } 16 } 17 18 static getInstance(){ 19 return instance 20 } 21 22 static createInstance(Map defaultValues, List customDefaults = []){ 23 instance = new DefaultValueCache(defaultValues, customDefaults) 24 } 25 26 Map getDefaultValues(){ 27 return defaultValues 28 } 29 30 static reset(){ 31 instance = null 32 } 33 34 List getCustomDefaults() { 35 def result = [] 36 result.addAll(customDefaults) 37 return result 38 } 39 40 static void prepare(Script steps, Map parameters = [:]) { 41 if (parameters == null) parameters = [:] 42 if (!getInstance() || parameters.customDefaults || parameters.customDefaultsFromFiles) { 43 List defaultsFromResources = ['default_pipeline_environment.yml'] 44 List customDefaults = Utils.appendParameterToStringList( 45 [], parameters, 'customDefaults') 46 defaultsFromResources.addAll(customDefaults) 47 List defaultsFromFiles = Utils.appendParameterToStringList( 48 [], parameters, 'customDefaultsFromFiles') 49 50 Map defaultValues = [:] 51 defaultValues = addDefaultsFromLibraryResources(steps, defaultValues, defaultsFromResources) 52 defaultValues = addDefaultsFromFiles(steps, defaultValues, defaultsFromFiles) 53 54 // The "customDefault" parameter is used for storing which extra defaults need to be 55 // passed to piper-go. The library resource 'default_pipeline_environment.yml' shall 56 // be excluded, since the go steps have their own in-built defaults in their yaml files. 57 createInstance(defaultValues, customDefaults + defaultsFromFiles) 58 } 59 } 60 61 private static Map addDefaultsFromLibraryResources(Script steps, Map defaultValues, List resourceFiles) { 62 for (String configFileName : resourceFiles) { 63 if (resourceFiles.size() > 1) { 64 steps.echo "Loading configuration file '${configFileName}'" 65 } 66 Map configuration = steps.readYaml text: steps.libraryResource(configFileName) 67 defaultValues = mergeIntoDefaults(defaultValues, configuration) 68 } 69 return defaultValues 70 } 71 72 private static Map addDefaultsFromFiles(Script steps, Map defaultValues, List configFiles) { 73 for (String configFileName : configFiles) { 74 steps.echo "Loading configuration file '${configFileName}'" 75 try { 76 Map configuration = steps.readYaml file: ".pipeline/$configFileName" 77 defaultValues = mergeIntoDefaults(defaultValues, configuration) 78 } catch (Exception e) { 79 steps.error "Failed to parse custom defaults as YAML file. " + 80 "Please make sure it is valid YAML, and if loading from a remote location, " + 81 "that the response body only contains valid YAML. " + 82 "If you use a file from a GitHub repository, make sure you've used the 'raw' link, " + 83 "for example https://my.github.local/raw/someorg/shared-config/master/backend-service.yml\n" + 84 "File path: .pipeline/${configFileName}\n" + 85 "Content: ${steps.readFile file: ".pipeline/${configFileName}"}\n" + 86 "Exeption message: ${e.getMessage()}\n" + 87 "Exception stacktrace: ${Arrays.toString(e.getStackTrace())}" 88 } 89 } 90 return defaultValues 91 } 92 93 private static Map mergeIntoDefaults(Map defaultValues, Map configuration) { 94 return MapUtils.merge( 95 MapUtils.pruneNulls(defaultValues), 96 MapUtils.pruneNulls(configuration)) 97 } 98 }