diff --git a/cmd/getConfig.go b/cmd/getConfig.go index c48cd759e..3f9c5e278 100644 --- a/cmd/getConfig.go +++ b/cmd/getConfig.go @@ -75,8 +75,25 @@ func ConfigCommand() *cobra.Command { return createConfigCmd } -func generateConfig(utils getConfigUtils) error { +func getDockerImageValue(stepName string) (string, error) { + configOptions.contextConfig = true + configOptions.stepName = stepName + stepConfig, err := getConfig() + if err != nil { + return "", err + } + + var dockerImageValue string + dockerImageValue, ok := stepConfig.Config["dockerImage"].(string) + if !ok { + log.Entry().Infof("Config value of %v to compare with is not a string", stepConfig.Config["dockerImage"]) + } + + return dockerImageValue, nil +} + +func getConfig() (config.StepConfig, error) { var myConfig config.Config var stepConfig config.StepConfig @@ -86,7 +103,7 @@ func generateConfig(utils getConfigUtils) error { customConfig, err := configOptions.openFile(projectConfigFile, GeneralConfig.GitHubAccessTokens) if err != nil { if !os.IsNotExist(err) { - return errors.Wrapf(err, "config: open configuration file '%v' failed", projectConfigFile) + return stepConfig, errors.Wrapf(err, "config: open configuration file '%v' failed", projectConfigFile) } customConfig = nil } @@ -96,7 +113,7 @@ func generateConfig(utils getConfigUtils) error { fc, err := configOptions.openFile(f, GeneralConfig.GitHubAccessTokens) // only create error for non-default values if err != nil && f != ".pipeline/defaults.yaml" { - return errors.Wrapf(err, "config: getting defaults failed: '%v'", f) + return stepConfig, errors.Wrapf(err, "config: getting defaults failed: '%v'", f) } if err == nil { defaultConfig = append(defaultConfig, fc) @@ -105,13 +122,14 @@ func generateConfig(utils getConfigUtils) error { stepConfig, err = myConfig.GetStageConfig(GeneralConfig.ParametersJSON, customConfig, defaultConfig, GeneralConfig.IgnoreCustomDefaults, configOptions.stageConfigAcceptedParameters, GeneralConfig.StageName) if err != nil { - return errors.Wrap(err, "getting stage config failed") + return stepConfig, errors.Wrap(err, "getting stage config failed") } } else { - metadata, err := resolveMetadata() + log.Entry().Infof("Printing stepName %s", configOptions.stepName) + metadata, err := config.ResolveMetadata(GeneralConfig.GitHubAccessTokens, GetAllStepMetadata, configOptions.stepMetadata, configOptions.stepName) if err != nil { - return errors.Wrapf(err, "failed to resolve metadata") + return stepConfig, errors.Wrapf(err, "failed to resolve metadata") } // prepare output resource directories: @@ -128,21 +146,21 @@ func generateConfig(utils getConfigUtils) error { customConfig, err := configOptions.openFile(projectConfigFile, GeneralConfig.GitHubAccessTokens) if err != nil { if !os.IsNotExist(err) { - return errors.Wrapf(err, "config: open configuration file '%v' failed", projectConfigFile) + return stepConfig, errors.Wrapf(err, "config: open configuration file '%v' failed", projectConfigFile) } customConfig = nil } defaultConfig, paramFilter, err := defaultsAndFilters(&metadata, metadata.Metadata.Name) if err != nil { - return errors.Wrap(err, "defaults: retrieving step defaults failed") + return stepConfig, errors.Wrap(err, "defaults: retrieving step defaults failed") } for _, f := range GeneralConfig.DefaultConfig { fc, err := configOptions.openFile(f, GeneralConfig.GitHubAccessTokens) // only create error for non-default values if err != nil && f != ".pipeline/defaults.yaml" { - return errors.Wrapf(err, "config: getting defaults failed: '%v'", f) + return stepConfig, errors.Wrapf(err, "config: getting defaults failed: '%v'", f) } if err == nil { defaultConfig = append(defaultConfig, fc) @@ -158,7 +176,7 @@ func generateConfig(utils getConfigUtils) error { stepConfig, err = myConfig.GetStepConfig(flags, GeneralConfig.ParametersJSON, customConfig, defaultConfig, GeneralConfig.IgnoreCustomDefaults, paramFilter, params, metadata.Spec.Inputs.Secrets, resourceParams, GeneralConfig.StageName, metadata.Metadata.Name, metadata.Metadata.Aliases) if err != nil { - return errors.Wrap(err, "getting step config failed") + return stepConfig, errors.Wrap(err, "getting step config failed") } // apply context conditions if context configuration is requested @@ -166,6 +184,15 @@ func generateConfig(utils getConfigUtils) error { applyContextConditions(metadata, &stepConfig) } } + return stepConfig, nil +} + +func generateConfig(utils getConfigUtils) error { + + stepConfig, err := getConfig() + if err != nil { + return err + } myConfigJSON, _ := config.GetJSON(stepConfig.Config) @@ -253,33 +280,3 @@ func prepareOutputEnvironment(outputResources []config.StepResources, envRootPat } } } - -func resolveMetadata() (config.StepData, error) { - var metadata config.StepData - if configOptions.stepMetadata != "" { - metadataFile, err := configOptions.openFile(configOptions.stepMetadata, GeneralConfig.GitHubAccessTokens) - if err != nil { - return metadata, errors.Wrap(err, "open failed") - } - - err = metadata.ReadPipelineStepData(metadataFile) - if err != nil { - return metadata, errors.Wrap(err, "read failed") - } - } else { - if configOptions.stepName != "" { - if GeneralConfig.MetaDataResolver == nil { - GeneralConfig.MetaDataResolver = GetAllStepMetadata - } - metadataMap := GeneralConfig.MetaDataResolver() - var ok bool - metadata, ok = metadataMap[configOptions.stepName] - if !ok { - return metadata, errors.Errorf("could not retrieve by stepName %v", configOptions.stepName) - } - } else { - return metadata, errors.Errorf("either one of stepMetadata or stepName parameter has to be passed") - } - } - return metadata, nil -} diff --git a/cmd/getConfig_test.go b/cmd/getConfig_test.go index d7c59eee1..9b995343d 100644 --- a/cmd/getConfig_test.go +++ b/cmd/getConfig_test.go @@ -311,25 +311,3 @@ func TestPrepareOutputEnvironment(t *testing.T) { assert.NoDirExists(t, filepath.Join(dir, "influx", "measurement0", "influx0_0")) assert.NoDirExists(t, filepath.Join(dir, "influx", "measurement1", "influx0_1")) } - -func TestResolveMetadata(t *testing.T) { - - t.Run("Succes - stepName", func(t *testing.T) { - configOptions.stepName = "githubCreateIssue" - stepData, err := resolveMetadata() - assert.NoError(t, err) - assert.Equal(t, "githubCreateIssue", stepData.Metadata.Name) - }) - - t.Run("Error - wrong stepName", func(t *testing.T) { - configOptions.stepName = "notExisting" - _, err := resolveMetadata() - assert.EqualError(t, err, "could not retrieve by stepName notExisting") - }) - - t.Run("Error - missing input", func(t *testing.T) { - configOptions.stepName = "" - _, err := resolveMetadata() - assert.EqualError(t, err, "either one of stepMetadata or stepName parameter has to be passed") - }) -} diff --git a/cmd/kanikoExecute.go b/cmd/kanikoExecute.go index faf188c56..61154788d 100644 --- a/cmd/kanikoExecute.go +++ b/cmd/kanikoExecute.go @@ -5,6 +5,7 @@ import ( "os" "strings" + "github.com/SAP/jenkins-library/pkg/buildsettings" "github.com/SAP/jenkins-library/pkg/certutils" piperhttp "github.com/SAP/jenkins-library/pkg/http" "github.com/pkg/errors" @@ -101,6 +102,22 @@ func runKanikoExecute(config *kanikoExecuteOptions, telemetryData *telemetry.Cus } } + log.Entry().Debugf("creating build settings information...") + stepName := "kanikoExecute" + dockerImage, err := getDockerImageValue(stepName) + if err != nil { + return err + } + + kanikoConfig := buildsettings.BuildOptions{ + DockerImage: dockerImage, + } + buildSettingsInfo, err := buildsettings.CreateBuildSettingsInfo(&kanikoConfig, stepName) + if err != nil { + log.Entry().Warnf("failed to create build settings info: %v", err) + } + commonPipelineEnvironment.custom.buildSettingsInfo = buildSettingsInfo + if err := fileUtils.FileWrite("/kaniko/.docker/config.json", dockerConfig, 0644); err != nil { return errors.Wrap(err, "failed to write file '/kaniko/.docker/config.json'") } diff --git a/cmd/kanikoExecute_generated.go b/cmd/kanikoExecute_generated.go index a9672340b..bdad14878 100644 --- a/cmd/kanikoExecute_generated.go +++ b/cmd/kanikoExecute_generated.go @@ -35,6 +35,9 @@ type kanikoExecuteCommonPipelineEnvironment struct { registryURL string imageNameTag string } + custom struct { + buildSettingsInfo string + } } func (p *kanikoExecuteCommonPipelineEnvironment) persist(path, resourceName string) { @@ -45,6 +48,7 @@ func (p *kanikoExecuteCommonPipelineEnvironment) persist(path, resourceName stri }{ {category: "container", name: "registryUrl", value: p.container.registryURL}, {category: "container", name: "imageNameTag", value: p.container.imageNameTag}, + {category: "custom", name: "buildSettingsInfo", value: p.custom.buildSettingsInfo}, } errCount := 0 @@ -308,6 +312,7 @@ func kanikoExecuteMetadata() config.StepData { Parameters: []map[string]interface{}{ {"Name": "container/registryUrl"}, {"Name": "container/imageNameTag"}, + {"Name": "custom/buildSettingsInfo"}, }, }, }, diff --git a/cmd/mavenBuild.go b/cmd/mavenBuild.go index 8a3581635..1e51ff155 100644 --- a/cmd/mavenBuild.go +++ b/cmd/mavenBuild.go @@ -85,7 +85,13 @@ func runMavenBuild(config *mavenBuildOptions, telemetryData *telemetry.CustomDat _, err := maven.Execute(&mavenOptions, utils) - log.Entry().Infof("creating build settings information...") + log.Entry().Debugf("creating build settings information...") + stepName := "mavenBuild" + dockerImage, err := getDockerImageValue(stepName) + if err != nil { + return err + } + mavenConfig := buildsettings.BuildOptions{ Profiles: config.Profiles, GlobalSettingsFile: config.GlobalSettingsFile, @@ -93,12 +99,13 @@ func runMavenBuild(config *mavenBuildOptions, telemetryData *telemetry.CustomDat CreateBOM: config.CreateBOM, Publish: config.Publish, BuildSettingsInfo: config.BuildSettingsInfo, + DockerImage: dockerImage, } - builSettings, err := buildsettings.CreateBuildSettingsInfo(&mavenConfig, "mavenBuild") + buildSettingsInfo, err := buildsettings.CreateBuildSettingsInfo(&mavenConfig, stepName) if err != nil { - log.Entry().Warnf("failed to create build settings info : ''%v", err) + log.Entry().Warnf("failed to create build settings info: %v", err) } - commonPipelineEnvironment.custom.buildSettingsInfo = builSettings + commonPipelineEnvironment.custom.buildSettingsInfo = buildSettingsInfo if err == nil { if config.Publish && !config.Verify { diff --git a/cmd/mtaBuild.go b/cmd/mtaBuild.go index dd3ea2c12..4085fb09b 100644 --- a/cmd/mtaBuild.go +++ b/cmd/mtaBuild.go @@ -234,18 +234,26 @@ func runMtaBuild(config mtaBuildOptions, return err } - log.Entry().Infof("creating build settings information...") + log.Entry().Debugf("creating build settings information...") + stepName := "mtaBuild" + dockerImage, err := getDockerImageValue(stepName) + if err != nil { + return err + } + mtaConfig := buildsettings.BuildOptions{ Profiles: config.Profiles, GlobalSettingsFile: config.GlobalSettingsFile, Publish: config.Publish, BuildSettingsInfo: config.BuildSettingsInfo, + DefaultNpmRegistry: config.DefaultNpmRegistry, + DockerImage: dockerImage, } - builSettings, err := buildsettings.CreateBuildSettingsInfo(&mtaConfig, "mtaBuild") + buildSettingsInfo, err := buildsettings.CreateBuildSettingsInfo(&mtaConfig, stepName) if err != nil { - log.Entry().Warnf("failed to create build settings info : ''%v", err) + log.Entry().Warnf("failed to create build settings info: %v", err) } - commonPipelineEnvironment.custom.buildSettingsInfo = builSettings + commonPipelineEnvironment.custom.buildSettingsInfo = buildSettingsInfo commonPipelineEnvironment.mtarFilePath = mtarName diff --git a/cmd/npmExecuteScripts.go b/cmd/npmExecuteScripts.go index ebfd25179..c7be2a669 100644 --- a/cmd/npmExecuteScripts.go +++ b/cmd/npmExecuteScripts.go @@ -47,18 +47,25 @@ func runNpmExecuteScripts(npmExecutor npm.Executor, config *npmExecuteScriptsOpt return err } - log.Entry().Infof("creating build settings information...") + log.Entry().Debugf("creating build settings information...") + stepName := "npmExecuteScripts" + dockerImage, err := getDockerImageValue(stepName) + if err != nil { + return err + } + npmConfig := buildsettings.BuildOptions{ Publish: config.Publish, CreateBOM: config.CreateBOM, DefaultNpmRegistry: config.DefaultNpmRegistry, BuildSettingsInfo: config.BuildSettingsInfo, + DockerImage: dockerImage, } - builSettings, err := buildsettings.CreateBuildSettingsInfo(&npmConfig, "npmExecuteScripts") + buildSettingsInfo, err := buildsettings.CreateBuildSettingsInfo(&npmConfig, stepName) if err != nil { - log.Entry().Warnf("failed to create build settings info : ''%v", err) + log.Entry().Warnf("failed to create build settings info: %v", err) } - commonPipelineEnvironment.custom.buildSettingsInfo = builSettings + commonPipelineEnvironment.custom.buildSettingsInfo = buildSettingsInfo if config.Publish { packageJSONFiles, err := npmExecutor.FindPackageJSONFilesWithExcludes(config.BuildDescriptorExcludeList) diff --git a/pkg/buildsettings/buildSettings.go b/pkg/buildsettings/buildSettings.go index d6a0eca49..39fc513ca 100644 --- a/pkg/buildsettings/buildSettings.go +++ b/pkg/buildsettings/buildSettings.go @@ -43,6 +43,7 @@ func CreateBuildSettingsInfo(config *BuildOptions, buildTool string) (string, er Profiles: config.Profiles, Publish: config.Publish, DefaultNpmRegistry: config.DefaultNpmRegistry, + DockerImage: config.DockerImage, } var jsonMap map[string][]interface{} var jsonResult []byte diff --git a/pkg/config/stepmeta.go b/pkg/config/stepmeta.go index b6fc7624e..0c5d3954f 100644 --- a/pkg/config/stepmeta.go +++ b/pkg/config/stepmeta.go @@ -485,6 +485,38 @@ func putSliceIfNotEmpty(config map[string]interface{}, key string, value []strin } } +func ResolveMetadata(gitHubTokens map[string]string, metaDataResolver func() map[string]StepData, stepMetadata string, stepName string) (StepData, error) { + + var metadata StepData + + if stepMetadata != "" { + metadataFile, err := OpenPiperFile(stepMetadata, gitHubTokens) + if err != nil { + return metadata, errors.Wrap(err, "open failed") + } + + err = metadata.ReadPipelineStepData(metadataFile) + if err != nil { + return metadata, errors.Wrap(err, "read failed") + } + } else { + if stepName != "" { + if metaDataResolver == nil { + return metadata, errors.New("metaDataResolver is nil") + } + metadataMap := metaDataResolver() + var ok bool + metadata, ok = metadataMap[stepName] + if !ok { + return metadata, errors.Errorf("could not retrieve by stepName %v", stepName) + } + } else { + return metadata, errors.Errorf("either one of stepMetadata or stepName parameter has to be passed") + } + } + return metadata, nil +} + //ToDo: Enable this when the Volumes part is also implemented //func volumeMountsAsStringSlice(volumeMounts []VolumeMount) []string { // e := []string{} diff --git a/pkg/config/stepmeta_test.go b/pkg/config/stepmeta_test.go index 8c08b9e55..7ff80aff7 100644 --- a/pkg/config/stepmeta_test.go +++ b/pkg/config/stepmeta_test.go @@ -751,3 +751,35 @@ func defaultParams(params ...string) []string { return stepParams } + +func testMetadataResolver() map[string]StepData { + return map[string]StepData{ + "githubCreateIssue": { + Metadata: StepMetadata{ + Name: "githubCreateIssue", + }, + }, + } +} + +func TestResolveMetadata(t *testing.T) { + + t.Run("Succes - stepName", func(t *testing.T) { + stepName := "githubCreateIssue" + stepData, err := ResolveMetadata(map[string]string{}, testMetadataResolver, "", stepName) + assert.NoError(t, err) + assert.Equal(t, "githubCreateIssue", stepData.Metadata.Name) + }) + + t.Run("Error - wrong stepName", func(t *testing.T) { + stepName := "notExisting" + _, err := ResolveMetadata(map[string]string{}, testMetadataResolver, "", stepName) + assert.EqualError(t, err, "could not retrieve by stepName notExisting") + }) + + t.Run("Error - missing input", func(t *testing.T) { + stepName := "" + _, err := ResolveMetadata(map[string]string{}, testMetadataResolver, "", stepName) + assert.EqualError(t, err, "either one of stepMetadata or stepName parameter has to be passed") + }) +} diff --git a/resources/metadata/kanikoExecute.yaml b/resources/metadata/kanikoExecute.yaml index e6a37d243..d7371a1db 100644 --- a/resources/metadata/kanikoExecute.yaml +++ b/resources/metadata/kanikoExecute.yaml @@ -119,6 +119,7 @@ spec: params: - name: container/registryUrl - name: container/imageNameTag + - name: custom/buildSettingsInfo containers: - image: gcr.io/kaniko-project/executor:debug command: diff --git a/resources/metadata/mavenBuild.yaml b/resources/metadata/mavenBuild.yaml index 6b1dba744..4ad057a3d 100644 --- a/resources/metadata/mavenBuild.yaml +++ b/resources/metadata/mavenBuild.yaml @@ -192,7 +192,6 @@ spec: type: piperEnvironment params: - name: custom/buildSettingsInfo - type: "string" containers: - name: mvn image: maven:3.6-jdk-8 diff --git a/resources/metadata/mtaBuild.yaml b/resources/metadata/mtaBuild.yaml index 913b7357f..5f77210fe 100644 --- a/resources/metadata/mtaBuild.yaml +++ b/resources/metadata/mtaBuild.yaml @@ -226,6 +226,5 @@ spec: - name: mtarFilePath - name: custom/mtarPublishedUrl - name: custom/buildSettingsInfo - type: "string" containers: - image: devxci/mbtci-java11-node14 diff --git a/resources/metadata/npmExecuteScripts.yaml b/resources/metadata/npmExecuteScripts.yaml index 3b5797a75..877e96b1c 100644 --- a/resources/metadata/npmExecuteScripts.yaml +++ b/resources/metadata/npmExecuteScripts.yaml @@ -132,7 +132,6 @@ spec: type: piperEnvironment params: - name: custom/buildSettingsInfo - type: "string" containers: - name: node image: node:lts-stretch