github.com/ouraigua/jenkins-library@v0.0.0-20231028010029-fbeaf2f3aa9b/src/com/sap/piper/k8s/ContainerMap.groovy (about)

     1  package com.sap.piper.k8s
     2  
     3  import com.sap.piper.API
     4  import com.sap.piper.Utils
     5  import groovy.json.JsonOutput
     6  
     7  @API
     8  @Singleton
     9  class ContainerMap implements Serializable {
    10      static final long serialVersionUID = 1L
    11  
    12      private Map containerMap = null
    13  
    14      Map getMap() {
    15          if (containerMap == null) {
    16              containerMap = [:]
    17          }
    18          return containerMap
    19      }
    20  
    21      void setMap(Map containersMap) {
    22          containerMap = containersMap
    23      }
    24  
    25      private static class PiperExecutionPreparator {
    26          private boolean executionPrepared
    27          private utils
    28  
    29          public PiperExecutionPreparator(utils){
    30              this.utils = utils
    31          }
    32          void prepareExecution(Script script) {
    33              if (!executionPrepared) {
    34                  script.piperExecuteBin.prepareExecution(script, utils)
    35                  executionPrepared = true
    36              }
    37          }
    38      }
    39  
    40      void initFromResource(Script script, String yamlResourceName, String buildTool, utils = new Utils()) {
    41          Map containers = [:]
    42          PiperExecutionPreparator piperPreparator = new PiperExecutionPreparator(utils)
    43          Map stageToStepMapping
    44          Map stepToMetaDataMapping
    45          try {
    46              Map yamlContents = script.readYaml(text: script.libraryResource(yamlResourceName))
    47              stageToStepMapping = yamlContents.containerMaps as Map
    48              stepToMetaDataMapping = yamlContents.stepMetadata as Map ?: [:]
    49          } catch (Exception e) {
    50              script.error "Failed to parse container maps in '$yamlResourceName'. It is expected to contain " +
    51                  "the entries 'containerMaps' and optionally 'stepMetadata' in the root." +
    52                  "containerMaps which is a map of stage identifiers to a list of executed steps. " +
    53                  "The optional 'stepMetadata' is a map of (go-implemented) step names to their YAML " +
    54                  "metadata resource file." +
    55                  "Error: ${e.getMessage()}"
    56          }
    57          stageToStepMapping.each { stageName, stepsList ->
    58              containers[stageName] = getContainersForStage(script, stageName as String, stepsList as List,
    59                  stepToMetaDataMapping, buildTool, piperPreparator)
    60          }
    61          setMap(containers)
    62      }
    63  
    64      static Map getContainersForStage(Script script, String stageName, List stepsList, Map stepToMetaDataMapping, String buildTool, PiperExecutionPreparator piperPreparator) {
    65          Map containers = [:]
    66          stepsList.each { stepName ->
    67              String imageName
    68              String stepMetadata = stepToMetaDataMapping[stepName]
    69              if (stepMetadata) {
    70                  piperPreparator.prepareExecution(script)
    71                  imageName = getDockerImageNameForGoStep(script, stageName, stepMetadata, buildTool)
    72              } else {
    73                  imageName = getDockerImageNameForGroovyStep(script, stageName, stepName as String)
    74              }
    75              if (imageName) {
    76                  containers[imageName] = stepName.toLowerCase()
    77              }
    78          }
    79          return containers
    80      }
    81  
    82      static String getDockerImageNameForGroovyStep(Script script, String stageName, String stepName) {
    83          Map configuration = script.commonPipelineEnvironment.getStepConfiguration(stepName, stageName)
    84  
    85          String dockerImage = configuration.dockerImage
    86  
    87          if (!dockerImage && stepName == "mtaBuild") {
    88              dockerImage = configuration[configuration.mtaBuildTool]?.dockerImage
    89          }
    90  
    91          return dockerImage
    92      }
    93  
    94      static String getDockerImageNameForGoStep(Script script, String stageName, String stepMetadata, String buildTool) {
    95          String stepMetadataPath = "metadata/$stepMetadata"
    96          script.piperExecuteBin.prepareMetadataResource(script, stepMetadataPath)
    97  
    98          Map stepParameters = script.piperExecuteBin.prepareStepParameters(['buildTool': buildTool])
    99  
   100          String defaultConfigArgs = script.piperExecuteBin.getCustomDefaultConfigsArg()
   101          String customConfigArg = script.piperExecuteBin.getCustomConfigArg(script)
   102  
   103          Map config = [:]
   104          script.withEnv(["PIPER_parametersJSON=${JsonOutput.toJson(stepParameters)}",
   105                          "STAGE_NAME=$stageName"]) {
   106              config = script.piperExecuteBin.getStepContextConfig(script, './piper', stepMetadataPath, defaultConfigArgs,
   107                  customConfigArg)
   108          }
   109          return config.dockerImage
   110      }
   111  }