mirror of
https://github.com/SAP/jenkins-library.git
synced 2024-12-12 10:55:20 +02:00
feat(cnbBuild): generate buildSettingInfo
Co-authored-by: Sumit Kulhadia <sumit.kulhadia@sap.com> Co-authored-by: Johannes Dillmann <j.dillmann@sap.com>
This commit is contained in:
parent
dd0aae6ded
commit
4ab32f7e7c
@ -8,6 +8,7 @@ import (
|
|||||||
"path"
|
"path"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
|
"github.com/SAP/jenkins-library/pkg/buildsettings"
|
||||||
"github.com/SAP/jenkins-library/pkg/certutils"
|
"github.com/SAP/jenkins-library/pkg/certutils"
|
||||||
"github.com/SAP/jenkins-library/pkg/cnbutils"
|
"github.com/SAP/jenkins-library/pkg/cnbutils"
|
||||||
"github.com/SAP/jenkins-library/pkg/cnbutils/bindings"
|
"github.com/SAP/jenkins-library/pkg/cnbutils/bindings"
|
||||||
@ -47,8 +48,9 @@ type cnbBuildUtilsBundle struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type cnbBuildTelemetry struct {
|
type cnbBuildTelemetry struct {
|
||||||
Version int `json:"version"`
|
dockerImage string
|
||||||
Data []cnbBuildTelemetryData `json:"data"`
|
Version int `json:"version"`
|
||||||
|
Data []cnbBuildTelemetryData `json:"data"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type cnbBuildTelemetryData struct {
|
type cnbBuildTelemetryData struct {
|
||||||
@ -306,7 +308,7 @@ func (config *cnbBuildOptions) resolvePath(utils cnbutils.BuildUtils) (pathEnum,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func addConfigTelemetryData(utils cnbutils.BuildUtils, data *cnbBuildTelemetryData, config *cnbBuildOptions) {
|
func addConfigTelemetryData(utils cnbutils.BuildUtils, data *cnbBuildTelemetryData, dockerImage string, config *cnbBuildOptions) {
|
||||||
var bindingKeys []string
|
var bindingKeys []string
|
||||||
for k := range config.Bindings {
|
for k := range config.Bindings {
|
||||||
bindingKeys = append(bindingKeys, k)
|
bindingKeys = append(bindingKeys, k)
|
||||||
@ -330,13 +332,7 @@ func addConfigTelemetryData(utils cnbutils.BuildUtils, data *cnbBuildTelemetryDa
|
|||||||
|
|
||||||
data.Buildpacks.FromConfig = privacy.FilterBuildpacks(config.Buildpacks)
|
data.Buildpacks.FromConfig = privacy.FilterBuildpacks(config.Buildpacks)
|
||||||
|
|
||||||
dockerImage, err := GetDockerImageValue("cnbBuild")
|
data.Builder = privacy.FilterBuilder(dockerImage)
|
||||||
if err != nil {
|
|
||||||
log.Entry().Warnf("Error while preparing telemetry: retrieving docker image failed: '%v'", err)
|
|
||||||
data.Builder = ""
|
|
||||||
} else {
|
|
||||||
data.Builder = privacy.FilterBuilder(dockerImage)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func addProjectDescriptorTelemetryData(data *cnbBuildTelemetryData, descriptor project.Descriptor) {
|
func addProjectDescriptorTelemetryData(data *cnbBuildTelemetryData, descriptor project.Descriptor) {
|
||||||
@ -357,22 +353,42 @@ func addProjectDescriptorTelemetryData(data *cnbBuildTelemetryData, descriptor p
|
|||||||
}
|
}
|
||||||
|
|
||||||
func callCnbBuild(config *cnbBuildOptions, telemetryData *telemetry.CustomData, utils cnbutils.BuildUtils, commonPipelineEnvironment *cnbBuildCommonPipelineEnvironment, httpClient piperhttp.Sender) error {
|
func callCnbBuild(config *cnbBuildOptions, telemetryData *telemetry.CustomData, utils cnbutils.BuildUtils, commonPipelineEnvironment *cnbBuildCommonPipelineEnvironment, httpClient piperhttp.Sender) error {
|
||||||
telemetry := &cnbBuildTelemetry{
|
stepName := "cnbBuild"
|
||||||
|
cnbTelemetry := &cnbBuildTelemetry{
|
||||||
Version: 3,
|
Version: 3,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dockerImage, err := GetDockerImageValue(stepName)
|
||||||
|
if err != nil {
|
||||||
|
log.Entry().Warnf("failed to retrieve dockerImage configuration: '%v'", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
cnbTelemetry.dockerImage = dockerImage
|
||||||
|
|
||||||
|
cnbBuildConfig := buildsettings.BuildOptions{
|
||||||
|
DockerImage: dockerImage,
|
||||||
|
BuildSettingsInfo: config.BuildSettingsInfo,
|
||||||
|
}
|
||||||
|
log.Entry().Debugf("creating build settings information...")
|
||||||
|
buildSettingsInfo, err := buildsettings.CreateBuildSettingsInfo(&cnbBuildConfig, stepName)
|
||||||
|
if err != nil {
|
||||||
|
log.Entry().Warnf("failed to create build settings info: %v", err)
|
||||||
|
}
|
||||||
|
commonPipelineEnvironment.custom.buildSettingsInfo = buildSettingsInfo
|
||||||
|
|
||||||
mergedConfigs, err := processConfigs(*config, config.MultipleImages)
|
mergedConfigs, err := processConfigs(*config, config.MultipleImages)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "failed to process config")
|
return errors.Wrap(err, "failed to process config")
|
||||||
}
|
}
|
||||||
for _, c := range mergedConfigs {
|
for _, c := range mergedConfigs {
|
||||||
err = runCnbBuild(&c, telemetryData, telemetry, utils, commonPipelineEnvironment, httpClient)
|
err = runCnbBuild(&c, cnbTelemetry, utils, commonPipelineEnvironment, httpClient)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
telemetryData.Custom1Label = "cnbBuildStepData"
|
telemetryData.Custom1Label = "cnbBuildStepData"
|
||||||
customData, err := json.Marshal(telemetry)
|
customData, err := json.Marshal(cnbTelemetry)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return errors.Wrap(err, "failed to marshal custom telemetry data")
|
return errors.Wrap(err, "failed to marshal custom telemetry data")
|
||||||
}
|
}
|
||||||
@ -380,7 +396,7 @@ func callCnbBuild(config *cnbBuildOptions, telemetryData *telemetry.CustomData,
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func runCnbBuild(config *cnbBuildOptions, telemetryData *telemetry.CustomData, telemetry *cnbBuildTelemetry, utils cnbutils.BuildUtils, commonPipelineEnvironment *cnbBuildCommonPipelineEnvironment, httpClient piperhttp.Sender) error {
|
func runCnbBuild(config *cnbBuildOptions, cnbTelemetry *cnbBuildTelemetry, utils cnbutils.BuildUtils, commonPipelineEnvironment *cnbBuildCommonPipelineEnvironment, httpClient piperhttp.Sender) error {
|
||||||
err := cleanDir("/layers", utils)
|
err := cleanDir("/layers", utils)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.SetErrorCategory(log.ErrorBuild)
|
log.SetErrorCategory(log.ErrorBuild)
|
||||||
@ -394,7 +410,7 @@ func runCnbBuild(config *cnbBuildOptions, telemetryData *telemetry.CustomData, t
|
|||||||
}
|
}
|
||||||
|
|
||||||
customTelemetryData := cnbBuildTelemetryData{}
|
customTelemetryData := cnbBuildTelemetryData{}
|
||||||
addConfigTelemetryData(utils, &customTelemetryData, config)
|
addConfigTelemetryData(utils, &customTelemetryData, cnbTelemetry.dockerImage, config)
|
||||||
|
|
||||||
err = isBuilder(utils)
|
err = isBuilder(utils)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -444,7 +460,7 @@ func runCnbBuild(config *cnbBuildOptions, telemetryData *telemetry.CustomData, t
|
|||||||
}
|
}
|
||||||
customTelemetryData.Buildpacks.Overall = privacy.FilterBuildpacks(config.Buildpacks)
|
customTelemetryData.Buildpacks.Overall = privacy.FilterBuildpacks(config.Buildpacks)
|
||||||
customTelemetryData.BuildEnv.KeyValues = privacy.FilterEnv(config.BuildEnvVars)
|
customTelemetryData.BuildEnv.KeyValues = privacy.FilterEnv(config.BuildEnvVars)
|
||||||
telemetry.Data = append(telemetry.Data, customTelemetryData)
|
cnbTelemetry.Data = append(cnbTelemetry.Data, customTelemetryData)
|
||||||
|
|
||||||
if commonPipelineEnvironment.container.imageNameTag == "" {
|
if commonPipelineEnvironment.container.imageNameTag == "" {
|
||||||
commonPipelineEnvironment.container.registryURL = fmt.Sprintf("%s://%s", targetImage.ContainerRegistry.Scheme, targetImage.ContainerRegistry.Host)
|
commonPipelineEnvironment.container.registryURL = fmt.Sprintf("%s://%s", targetImage.ContainerRegistry.Scheme, targetImage.ContainerRegistry.Host)
|
||||||
|
@ -31,6 +31,7 @@ type cnbBuildOptions struct {
|
|||||||
Bindings map[string]interface{} `json:"bindings,omitempty"`
|
Bindings map[string]interface{} `json:"bindings,omitempty"`
|
||||||
MultipleImages []map[string]interface{} `json:"multipleImages,omitempty"`
|
MultipleImages []map[string]interface{} `json:"multipleImages,omitempty"`
|
||||||
PreserveFiles []string `json:"preserveFiles,omitempty"`
|
PreserveFiles []string `json:"preserveFiles,omitempty"`
|
||||||
|
BuildSettingsInfo string `json:"buildSettingsInfo,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type cnbBuildCommonPipelineEnvironment struct {
|
type cnbBuildCommonPipelineEnvironment struct {
|
||||||
@ -42,6 +43,9 @@ type cnbBuildCommonPipelineEnvironment struct {
|
|||||||
imageNameTags []string
|
imageNameTags []string
|
||||||
imageDigests []string
|
imageDigests []string
|
||||||
}
|
}
|
||||||
|
custom struct {
|
||||||
|
buildSettingsInfo string
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *cnbBuildCommonPipelineEnvironment) persist(path, resourceName string) {
|
func (p *cnbBuildCommonPipelineEnvironment) persist(path, resourceName string) {
|
||||||
@ -56,6 +60,7 @@ func (p *cnbBuildCommonPipelineEnvironment) persist(path, resourceName string) {
|
|||||||
{category: "container", name: "imageNames", value: p.container.imageNames},
|
{category: "container", name: "imageNames", value: p.container.imageNames},
|
||||||
{category: "container", name: "imageNameTags", value: p.container.imageNameTags},
|
{category: "container", name: "imageNameTags", value: p.container.imageNameTags},
|
||||||
{category: "container", name: "imageDigests", value: p.container.imageDigests},
|
{category: "container", name: "imageDigests", value: p.container.imageDigests},
|
||||||
|
{category: "custom", name: "buildSettingsInfo", value: p.custom.buildSettingsInfo},
|
||||||
}
|
}
|
||||||
|
|
||||||
errCount := 0
|
errCount := 0
|
||||||
@ -176,6 +181,7 @@ func addCnbBuildFlags(cmd *cobra.Command, stepConfig *cnbBuildOptions) {
|
|||||||
cmd.Flags().StringSliceVar(&stepConfig.AdditionalTags, "additionalTags", []string{}, "List of tags which will be pushed to the registry (additionally to the provided `containerImageTag`), e.g. \"latest\".")
|
cmd.Flags().StringSliceVar(&stepConfig.AdditionalTags, "additionalTags", []string{}, "List of tags which will be pushed to the registry (additionally to the provided `containerImageTag`), e.g. \"latest\".")
|
||||||
|
|
||||||
cmd.Flags().StringSliceVar(&stepConfig.PreserveFiles, "preserveFiles", []string{}, "List of globs, for keeping build results in the Jenkins workspace.\n\n*Note*: globs will be calculated relative to the [path](#path) property.\n")
|
cmd.Flags().StringSliceVar(&stepConfig.PreserveFiles, "preserveFiles", []string{}, "List of globs, for keeping build results in the Jenkins workspace.\n\n*Note*: globs will be calculated relative to the [path](#path) property.\n")
|
||||||
|
cmd.Flags().StringVar(&stepConfig.BuildSettingsInfo, "buildSettingsInfo", os.Getenv("PIPER_buildSettingsInfo"), "Build settings info is typically filled by the step automatically to create information about the build settings that were used during the mta build. This information is typically used for compliance related processes.")
|
||||||
|
|
||||||
cmd.MarkFlagRequired("containerImageTag")
|
cmd.MarkFlagRequired("containerImageTag")
|
||||||
cmd.MarkFlagRequired("containerRegistryUrl")
|
cmd.MarkFlagRequired("containerRegistryUrl")
|
||||||
@ -345,6 +351,20 @@ func cnbBuildMetadata() config.StepData {
|
|||||||
Aliases: []config.Alias{},
|
Aliases: []config.Alias{},
|
||||||
Default: []string{},
|
Default: []string{},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
Name: "buildSettingsInfo",
|
||||||
|
ResourceRef: []config.ResourceReference{
|
||||||
|
{
|
||||||
|
Name: "commonPipelineEnvironment",
|
||||||
|
Param: "custom/buildSettingsInfo",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Scope: []string{"STEPS", "STAGES", "PARAMETERS"},
|
||||||
|
Type: "string",
|
||||||
|
Mandatory: false,
|
||||||
|
Aliases: []config.Alias{},
|
||||||
|
Default: os.Getenv("PIPER_buildSettingsInfo"),
|
||||||
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Containers: []config.Container{
|
Containers: []config.Container{
|
||||||
@ -362,6 +382,7 @@ func cnbBuildMetadata() config.StepData {
|
|||||||
{"name": "container/imageNames", "type": "[]string"},
|
{"name": "container/imageNames", "type": "[]string"},
|
||||||
{"name": "container/imageNameTags", "type": "[]string"},
|
{"name": "container/imageNameTags", "type": "[]string"},
|
||||||
{"name": "container/imageDigests", "type": "[]string"},
|
{"name": "container/imageDigests", "type": "[]string"},
|
||||||
|
{"name": "custom/buildSettingsInfo"},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
@ -74,6 +74,7 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
assert.Contains(t, runner.Calls[0].Params, fmt.Sprintf("%s/%s:%s", imageRegistry, config.ContainerImageName, config.ContainerImageTag))
|
assert.Contains(t, runner.Calls[0].Params, fmt.Sprintf("%s/%s:%s", imageRegistry, config.ContainerImageName, config.ContainerImageTag))
|
||||||
assert.Equal(t, config.ContainerRegistryURL, commonPipelineEnvironment.container.registryURL)
|
assert.Equal(t, config.ContainerRegistryURL, commonPipelineEnvironment.container.registryURL)
|
||||||
assert.Equal(t, "my-image:0.0.1", commonPipelineEnvironment.container.imageNameTag)
|
assert.Equal(t, "my-image:0.0.1", commonPipelineEnvironment.container.imageNameTag)
|
||||||
|
assert.Equal(t, `{"cnbBuild":[{"dockerImage":"paketobuildpacks/builder:base"}]}`, commonPipelineEnvironment.custom.buildSettingsInfo)
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("prefers project descriptor", func(t *testing.T) {
|
t.Run("prefers project descriptor", func(t *testing.T) {
|
||||||
@ -169,7 +170,6 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
|
|
||||||
t.Run("success case (custom buildpacks and custom env variables, renaming docker conf file, additional tag)", func(t *testing.T) {
|
t.Run("success case (custom buildpacks and custom env variables, renaming docker conf file, additional tag)", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment{}
|
|
||||||
config := cnbBuildOptions{
|
config := cnbBuildOptions{
|
||||||
ContainerImageName: "my-image",
|
ContainerImageName: "my-image",
|
||||||
ContainerImageTag: "0.0.1",
|
ContainerImageTag: "0.0.1",
|
||||||
@ -186,7 +186,7 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
|
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
|
||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &cnbBuildCommonPipelineEnvironment{}, &piperhttp.Client{})
|
||||||
|
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
runner := utils.ExecMockRunner
|
runner := utils.ExecMockRunner
|
||||||
@ -206,7 +206,6 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
|
|
||||||
t.Run("success case (customTlsCertificates)", func(t *testing.T) {
|
t.Run("success case (customTlsCertificates)", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment{}
|
|
||||||
httpmock.Activate()
|
httpmock.Activate()
|
||||||
defer httpmock.DeactivateAndReset()
|
defer httpmock.DeactivateAndReset()
|
||||||
httpmock.RegisterResponder(http.MethodGet, "https://test-cert.com/cert.crt", httpmock.NewStringResponder(200, "testCert"))
|
httpmock.RegisterResponder(http.MethodGet, "https://test-cert.com/cert.crt", httpmock.NewStringResponder(200, "testCert"))
|
||||||
@ -229,7 +228,7 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
|
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
|
||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &commonPipelineEnvironment, client)
|
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &cnbBuildCommonPipelineEnvironment{}, client)
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
result, err := utils.FilesMock.FileRead(caCertsTmpFile)
|
result, err := utils.FilesMock.FileRead(caCertsTmpFile)
|
||||||
@ -246,7 +245,6 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
|
|
||||||
t.Run("success case (additionalTags)", func(t *testing.T) {
|
t.Run("success case (additionalTags)", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment{}
|
|
||||||
config := cnbBuildOptions{
|
config := cnbBuildOptions{
|
||||||
ContainerImageName: "my-image",
|
ContainerImageName: "my-image",
|
||||||
ContainerImageTag: "3.1.5",
|
ContainerImageTag: "3.1.5",
|
||||||
@ -259,7 +257,7 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
|
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
|
||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &cnbBuildCommonPipelineEnvironment{}, &piperhttp.Client{})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
runner := utils.ExecMockRunner
|
runner := utils.ExecMockRunner
|
||||||
@ -321,7 +319,6 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
|
|
||||||
t.Run("error case: Invalid DockerConfigJSON file", func(t *testing.T) {
|
t.Run("error case: Invalid DockerConfigJSON file", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment{}
|
|
||||||
config := cnbBuildOptions{
|
config := cnbBuildOptions{
|
||||||
ContainerImageTag: "0.0.1",
|
ContainerImageTag: "0.0.1",
|
||||||
ContainerRegistryURL: imageRegistry,
|
ContainerRegistryURL: imageRegistry,
|
||||||
@ -333,13 +330,12 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":"dXNlcjpwYXNz"}}`))
|
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":"dXNlcjpwYXNz"}}`))
|
||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &cnbBuildCommonPipelineEnvironment{}, &piperhttp.Client{})
|
||||||
assert.EqualError(t, err, "failed to generate CNB_REGISTRY_AUTH: json: cannot unmarshal string into Go struct field ConfigFile.auths of type types.AuthConfig")
|
assert.EqualError(t, err, "failed to generate CNB_REGISTRY_AUTH: json: cannot unmarshal string into Go struct field ConfigFile.auths of type types.AuthConfig")
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("error case: DockerConfigJSON file not there (config.json)", func(t *testing.T) {
|
t.Run("error case: DockerConfigJSON file not there (config.json)", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment{}
|
|
||||||
config := cnbBuildOptions{
|
config := cnbBuildOptions{
|
||||||
ContainerImageTag: "0.0.1",
|
ContainerImageTag: "0.0.1",
|
||||||
ContainerRegistryURL: imageRegistry,
|
ContainerRegistryURL: imageRegistry,
|
||||||
@ -350,13 +346,12 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
utils := newCnbBuildTestsUtils()
|
utils := newCnbBuildTestsUtils()
|
||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &cnbBuildCommonPipelineEnvironment{}, &piperhttp.Client{})
|
||||||
assert.EqualError(t, err, "failed to generate CNB_REGISTRY_AUTH: could not read 'not-there/config.json'")
|
assert.EqualError(t, err, "failed to generate CNB_REGISTRY_AUTH: could not read 'not-there/config.json'")
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("error case: DockerConfigJSON file not there (not config.json)", func(t *testing.T) {
|
t.Run("error case: DockerConfigJSON file not there (not config.json)", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment{}
|
|
||||||
config := cnbBuildOptions{
|
config := cnbBuildOptions{
|
||||||
ContainerImageTag: "0.0.1",
|
ContainerImageTag: "0.0.1",
|
||||||
ContainerRegistryURL: imageRegistry,
|
ContainerRegistryURL: imageRegistry,
|
||||||
@ -367,24 +362,22 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
utils := newCnbBuildTestsUtils()
|
utils := newCnbBuildTestsUtils()
|
||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &cnbBuildCommonPipelineEnvironment{}, &piperhttp.Client{})
|
||||||
assert.EqualError(t, err, "failed to rename DockerConfigJSON file 'not-there': renaming file 'not-there' is not supported, since it does not exist, or is not a leaf-entry")
|
assert.EqualError(t, err, "failed to rename DockerConfigJSON file 'not-there': renaming file 'not-there' is not supported, since it does not exist, or is not a leaf-entry")
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("error case: dockerImage is not a valid builder", func(t *testing.T) {
|
t.Run("error case: dockerImage is not a valid builder", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment{}
|
|
||||||
config := cnbBuildOptions{}
|
config := cnbBuildOptions{}
|
||||||
|
|
||||||
utils := newCnbBuildTestsUtils()
|
utils := newCnbBuildTestsUtils()
|
||||||
|
|
||||||
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &cnbBuildCommonPipelineEnvironment{}, &piperhttp.Client{})
|
||||||
assert.EqualError(t, err, "the provided dockerImage is not a valid builder: binary '/cnb/lifecycle/creator' not found")
|
assert.EqualError(t, err, "the provided dockerImage is not a valid builder: binary '/cnb/lifecycle/creator' not found")
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("error case: builder image does not contain tls certificates", func(t *testing.T) {
|
t.Run("error case: builder image does not contain tls certificates", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment{}
|
|
||||||
config := cnbBuildOptions{
|
config := cnbBuildOptions{
|
||||||
ContainerImageName: "my-image",
|
ContainerImageName: "my-image",
|
||||||
ContainerImageTag: "0.0.1",
|
ContainerImageTag: "0.0.1",
|
||||||
@ -398,13 +391,12 @@ func TestRunCnbBuild(t *testing.T) {
|
|||||||
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
|
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
|
||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetry.CustomData{}, &utils, &cnbBuildCommonPipelineEnvironment{}, &piperhttp.Client{})
|
||||||
assert.EqualError(t, err, "failed to copy certificates: cannot copy '/etc/ssl/certs/ca-certificates.crt': file does not exist")
|
assert.EqualError(t, err, "failed to copy certificates: cannot copy '/etc/ssl/certs/ca-certificates.crt': file does not exist")
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("success case (telemetry was added)", func(t *testing.T) {
|
t.Run("success case (telemetry was added)", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment{}
|
|
||||||
registry := "some-registry"
|
registry := "some-registry"
|
||||||
config := cnbBuildOptions{
|
config := cnbBuildOptions{
|
||||||
ContainerImageName: "my-image",
|
ContainerImageName: "my-image",
|
||||||
@ -438,7 +430,7 @@ uri = "some-buildpack"`))
|
|||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
telemetryData := telemetry.CustomData{}
|
telemetryData := telemetry.CustomData{}
|
||||||
err := callCnbBuild(&config, &telemetryData, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetryData, &utils, &cnbBuildCommonPipelineEnvironment{}, &piperhttp.Client{})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
customDataAsString := telemetryData.Custom1
|
customDataAsString := telemetryData.Custom1
|
||||||
@ -467,7 +459,6 @@ uri = "some-buildpack"`))
|
|||||||
|
|
||||||
t.Run("error case, multiple artifacts in path", func(t *testing.T) {
|
t.Run("error case, multiple artifacts in path", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment{}
|
|
||||||
config := cnbBuildOptions{
|
config := cnbBuildOptions{
|
||||||
ContainerImageName: "my-image",
|
ContainerImageName: "my-image",
|
||||||
ContainerImageTag: "3.1.5",
|
ContainerImageTag: "3.1.5",
|
||||||
@ -488,7 +479,7 @@ uri = "some-buildpack"`))
|
|||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
telemetryData := telemetry.CustomData{}
|
telemetryData := telemetry.CustomData{}
|
||||||
err := callCnbBuild(&config, &telemetryData, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetryData, &utils, &cnbBuildCommonPipelineEnvironment{}, &piperhttp.Client{})
|
||||||
require.EqualError(t, err, "could not resolve path: Failed to resolve glob for 'target/*.jar', matching 2 file(s)")
|
require.EqualError(t, err, "could not resolve path: Failed to resolve glob for 'target/*.jar', matching 2 file(s)")
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -526,7 +517,6 @@ uri = "some-buildpack"`))
|
|||||||
|
|
||||||
t.Run("success case (build env telemetry was added)", func(t *testing.T) {
|
t.Run("success case (build env telemetry was added)", func(t *testing.T) {
|
||||||
t.Parallel()
|
t.Parallel()
|
||||||
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment{}
|
|
||||||
registry := "some-registry"
|
registry := "some-registry"
|
||||||
config := cnbBuildOptions{
|
config := cnbBuildOptions{
|
||||||
ContainerImageName: "my-image",
|
ContainerImageName: "my-image",
|
||||||
@ -558,7 +548,7 @@ uri = "some-buildpack"
|
|||||||
addBuilderFiles(&utils)
|
addBuilderFiles(&utils)
|
||||||
|
|
||||||
telemetryData := telemetry.CustomData{}
|
telemetryData := telemetry.CustomData{}
|
||||||
err := callCnbBuild(&config, &telemetryData, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
|
err := callCnbBuild(&config, &telemetryData, &utils, &cnbBuildCommonPipelineEnvironment{}, &piperhttp.Client{})
|
||||||
require.NoError(t, err)
|
require.NoError(t, err)
|
||||||
|
|
||||||
customDataAsString := telemetryData.Custom1
|
customDataAsString := telemetryData.Custom1
|
||||||
@ -623,5 +613,4 @@ uri = "some-buildpack"
|
|||||||
|
|
||||||
assert.Equal(t, "my-image-0:3.1.5", commonPipelineEnvironment.container.imageNameTag)
|
assert.Equal(t, "my-image-0:3.1.5", commonPipelineEnvironment.container.imageNameTag)
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,7 @@ type BuildSettings struct {
|
|||||||
MtaBuild []BuildOptions `json:"mtaBuild,omitempty"`
|
MtaBuild []BuildOptions `json:"mtaBuild,omitempty"`
|
||||||
PythonBuild []BuildOptions `json:"pythonBuild,omitempty"`
|
PythonBuild []BuildOptions `json:"pythonBuild,omitempty"`
|
||||||
NpmExecuteScripts []BuildOptions `json:"npmExecuteScripts,omitempty"`
|
NpmExecuteScripts []BuildOptions `json:"npmExecuteScripts,omitempty"`
|
||||||
|
CnbBuild []BuildOptions `json:"cnbBuild,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type BuildOptions struct {
|
type BuildOptions struct {
|
||||||
@ -101,6 +102,10 @@ func CreateBuildSettingsInfo(config *BuildOptions, buildTool string) (string, er
|
|||||||
jsonResult, err = json.Marshal(BuildSettings{
|
jsonResult, err = json.Marshal(BuildSettings{
|
||||||
NpmExecuteScripts: settings,
|
NpmExecuteScripts: settings,
|
||||||
})
|
})
|
||||||
|
case "cnbBuild":
|
||||||
|
jsonResult, err = json.Marshal(BuildSettings{
|
||||||
|
CnbBuild: settings,
|
||||||
|
})
|
||||||
default:
|
default:
|
||||||
log.Entry().Warningf("buildTool '%s' not supported for creation of build settings", buildTool)
|
log.Entry().Warningf("buildTool '%s' not supported for creation of build settings", buildTool)
|
||||||
return "", nil
|
return "", nil
|
||||||
|
@ -64,6 +64,11 @@ func TestCreateBuildSettingsInfo(t *testing.T) {
|
|||||||
buildTool: "npmExecuteScripts",
|
buildTool: "npmExecuteScripts",
|
||||||
expected: "{\"npmExecuteScripts\":[{\"createBOM\":true}]}",
|
expected: "{\"npmExecuteScripts\":[{\"createBOM\":true}]}",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
config: BuildOptions{DockerImage: "builder:latest"},
|
||||||
|
buildTool: "cnbBuild",
|
||||||
|
expected: "{\"cnbBuild\":[{\"dockerImage\":\"builder:latest\"}]}",
|
||||||
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, testCase := range testTableConfig {
|
for _, testCase := range testTableConfig {
|
||||||
|
@ -233,6 +233,16 @@ spec:
|
|||||||
- PARAMETERS
|
- PARAMETERS
|
||||||
- STAGES
|
- STAGES
|
||||||
- STEPS
|
- STEPS
|
||||||
|
- name: buildSettingsInfo
|
||||||
|
type: string
|
||||||
|
description: Build settings info is typically filled by the step automatically to create information about the build settings that were used during the mta build. This information is typically used for compliance related processes.
|
||||||
|
scope:
|
||||||
|
- STEPS
|
||||||
|
- STAGES
|
||||||
|
- PARAMETERS
|
||||||
|
resourceRef:
|
||||||
|
- name: commonPipelineEnvironment
|
||||||
|
param: custom/buildSettingsInfo
|
||||||
outputs:
|
outputs:
|
||||||
resources:
|
resources:
|
||||||
- name: commonPipelineEnvironment
|
- name: commonPipelineEnvironment
|
||||||
@ -247,5 +257,6 @@ spec:
|
|||||||
type: "[]string"
|
type: "[]string"
|
||||||
- name: container/imageDigests
|
- name: container/imageDigests
|
||||||
type: "[]string"
|
type: "[]string"
|
||||||
|
- name: custom/buildSettingsInfo
|
||||||
containers:
|
containers:
|
||||||
- image: "paketobuildpacks/builder:base"
|
- image: "paketobuildpacks/builder:base"
|
||||||
|
Loading…
Reference in New Issue
Block a user