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  }