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 }