1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2025-12-03 23:10:20 +02:00

Add Changes for value of docker image (#3303)

* Add Changes for value of docker image

* Get docker image value

* Fix

* Fix unit

* Add chnages for kaniko and mta builds

* Fix

* Test changes

* Test

* Move func ResolveMetadata to stepmeta.go

* Fix

* Change getConfig.go

* Fix getting docker value for mta, npm and kaniko

* Fix according to suggestions

* Add func to get only value of docker image

* Test empty value of docker image

* Fix for getDockerImageValue

Co-authored-by: Oliver Nocon <33484802+OliverNocon@users.noreply.github.com>
This commit is contained in:
kingvvgo
2021-12-01 07:46:18 +01:00
committed by GitHub
parent 347ae68ea9
commit b29a2f2264
14 changed files with 159 additions and 77 deletions

View File

@@ -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
}

View File

@@ -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")
})
}

View File

@@ -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'")
}

View File

@@ -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"},
},
},
},

View File

@@ -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 {

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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{}

View File

@@ -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")
})
}

View File

@@ -119,6 +119,7 @@ spec:
params:
- name: container/registryUrl
- name: container/imageNameTag
- name: custom/buildSettingsInfo
containers:
- image: gcr.io/kaniko-project/executor:debug
command:

View File

@@ -192,7 +192,6 @@ spec:
type: piperEnvironment
params:
- name: custom/buildSettingsInfo
type: "string"
containers:
- name: mvn
image: maven:3.6-jdk-8

View File

@@ -226,6 +226,5 @@ spec:
- name: mtarFilePath
- name: custom/mtarPublishedUrl
- name: custom/buildSettingsInfo
type: "string"
containers:
- image: devxci/mbtci-java11-node14

View File

@@ -132,7 +132,6 @@ spec:
type: piperEnvironment
params:
- name: custom/buildSettingsInfo
type: "string"
containers:
- name: node
image: node:lts-stretch