You've already forked sap-jenkins-library
mirror of
https://github.com/SAP/jenkins-library.git
synced 2025-11-06 09:09:19 +02:00
feat(cnbBuild): refactored buildEnvVars input property, added resourceRef to the buildpacks (#3310)
Co-authored-by: Johannes Dillmann <j.dillmann@sap.com>
This commit is contained in:
@@ -222,6 +222,22 @@ func prepareDockerConfig(source string, utils cnbutils.BuildUtils) (string, erro
|
||||
return source, nil
|
||||
}
|
||||
|
||||
func (c *cnbBuildOptions) mergeEnvVars(vars map[string]interface{}) {
|
||||
if c.BuildEnvVars == nil {
|
||||
c.BuildEnvVars = vars
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
for k, v := range vars {
|
||||
_, exists := c.BuildEnvVars[k]
|
||||
|
||||
if !exists {
|
||||
c.BuildEnvVars[k] = v
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func runCnbBuild(config *cnbBuildOptions, telemetryData *telemetry.CustomData, utils cnbutils.BuildUtils, commonPipelineEnvironment *cnbBuildCommonPipelineEnvironment, httpClient piperhttp.Sender) error {
|
||||
var err error
|
||||
|
||||
@@ -252,14 +268,12 @@ func runCnbBuild(config *cnbBuildOptions, telemetryData *telemetry.CustomData, u
|
||||
return errors.Wrapf(err, "failed to parse %s", config.ProjectDescriptor)
|
||||
}
|
||||
|
||||
config.mergeEnvVars(descriptor.EnvVars)
|
||||
|
||||
if (config.Buildpacks == nil || len(config.Buildpacks) == 0) && len(descriptor.Buildpacks) > 0 {
|
||||
config.Buildpacks = descriptor.Buildpacks
|
||||
}
|
||||
|
||||
if (config.BuildEnvVars == nil || len(config.BuildEnvVars) == 0) && len(descriptor.EnvVars) > 0 {
|
||||
config.BuildEnvVars = descriptor.EnvVars
|
||||
}
|
||||
|
||||
if descriptor.Exclude != nil {
|
||||
exclude = descriptor.Exclude
|
||||
}
|
||||
@@ -410,20 +424,21 @@ func runCnbBuild(config *cnbBuildOptions, telemetryData *telemetry.CustomData, u
|
||||
log.Entry().Info("skipping certificates update")
|
||||
}
|
||||
|
||||
err = utils.RunExecutable(detectorPath, "-buildpacks", buildpacksPath, "-order", orderPath, "-platform", platformPath)
|
||||
err = utils.RunExecutable(detectorPath, "-buildpacks", buildpacksPath, "-order", orderPath, "-platform", platformPath, "-no-color")
|
||||
if err != nil {
|
||||
log.SetErrorCategory(log.ErrorBuild)
|
||||
return errors.Wrapf(err, "execution of '%s' failed", detectorPath)
|
||||
}
|
||||
|
||||
err = utils.RunExecutable(builderPath, "-buildpacks", buildpacksPath, "-platform", platformPath)
|
||||
err = utils.RunExecutable(builderPath, "-buildpacks", buildpacksPath, "-platform", platformPath, "-no-color")
|
||||
if err != nil {
|
||||
log.SetErrorCategory(log.ErrorBuild)
|
||||
return errors.Wrapf(err, "execution of '%s' failed", builderPath)
|
||||
}
|
||||
|
||||
utils.AppendEnv([]string{fmt.Sprintf("CNB_REGISTRY_AUTH=%s", string(cnbRegistryAuth))})
|
||||
err = utils.RunExecutable(exporterPath, targets...)
|
||||
exporterArgs := append([]string{"-no-color"}, targets...)
|
||||
err = utils.RunExecutable(exporterPath, exporterArgs...)
|
||||
if err != nil {
|
||||
log.SetErrorCategory(log.ErrorBuild)
|
||||
return errors.Wrapf(err, "execution of '%s' failed", exporterPath)
|
||||
|
||||
@@ -22,7 +22,7 @@ type cnbBuildOptions struct {
|
||||
ContainerImageTag string `json:"containerImageTag,omitempty"`
|
||||
ContainerRegistryURL string `json:"containerRegistryUrl,omitempty"`
|
||||
Buildpacks []string `json:"buildpacks,omitempty"`
|
||||
BuildEnvVars []string `json:"buildEnvVars,omitempty"`
|
||||
BuildEnvVars map[string]interface{} `json:"buildEnvVars,omitempty"`
|
||||
Path string `json:"path,omitempty"`
|
||||
ProjectDescriptor string `json:"projectDescriptor,omitempty"`
|
||||
DockerConfigJSON string `json:"dockerConfigJSON,omitempty"`
|
||||
@@ -157,9 +157,9 @@ func addCnbBuildFlags(cmd *cobra.Command, stepConfig *cnbBuildOptions) {
|
||||
cmd.Flags().StringVar(&stepConfig.ContainerImageTag, "containerImageTag", os.Getenv("PIPER_containerImageTag"), "Tag of the container which will be built")
|
||||
cmd.Flags().StringVar(&stepConfig.ContainerRegistryURL, "containerRegistryUrl", os.Getenv("PIPER_containerRegistryUrl"), "Container registry where the image should be pushed to")
|
||||
cmd.Flags().StringSliceVar(&stepConfig.Buildpacks, "buildpacks", []string{}, "List of custom buildpacks to use in the form of '$HOSTNAME/$REPO[:$TAG]'.")
|
||||
cmd.Flags().StringSliceVar(&stepConfig.BuildEnvVars, "buildEnvVars", []string{}, "List of custom environment variables used during a build in the form of 'KEY=VALUE'.")
|
||||
|
||||
cmd.Flags().StringVar(&stepConfig.Path, "path", os.Getenv("PIPER_path"), "The path should either point to a directory with your sources or an artifact in zip format.\nThis property determines the input to the buildpack.\n")
|
||||
cmd.Flags().StringVar(&stepConfig.ProjectDescriptor, "projectDescriptor", `project.toml`, "Path to the project.toml file.\nSee [buildpacks.io](https://buildpacks.io/docs/reference/config/project-descriptor/) for the reference.\nParameters passed to the cnbBuild step will take precedence over the parameters set in the project.toml file.\n\nNote: Inline buildpacks (see [specification](https://buildpacks.io/docs/reference/config/project-descriptor/#build-_table-optional_)) are not supported yet.\n")
|
||||
cmd.Flags().StringVar(&stepConfig.ProjectDescriptor, "projectDescriptor", `project.toml`, "Path to the project.toml file.\nSee [buildpacks.io](https://buildpacks.io/docs/reference/config/project-descriptor/) for the reference.\nParameters passed to the cnbBuild step will take precedence over the parameters set in the project.toml file, except the `env` block.\nEnvironment variables declared in a project descriptor file, will be merged with the `buildEnvVars` property, with the `buildEnvVars` having a precedence.\n\nNote: Inline buildpacks (see [specification](https://buildpacks.io/docs/reference/config/project-descriptor/#build-_table-optional_)) are not supported yet.\n")
|
||||
cmd.Flags().StringVar(&stepConfig.DockerConfigJSON, "dockerConfigJSON", os.Getenv("PIPER_dockerConfigJSON"), "Path to the file `.docker/config.json` - this is typically provided by your CI/CD system. You can find more details about the Docker credentials in the [Docker documentation](https://docs.docker.com/engine/reference/commandline/login/).")
|
||||
cmd.Flags().StringSliceVar(&stepConfig.CustomTLSCertificateLinks, "customTlsCertificateLinks", []string{}, "List containing download links of custom TLS certificates. This is required to ensure trusted connections to registries with custom certificates.")
|
||||
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\".")
|
||||
@@ -221,22 +221,26 @@ func cnbBuildMetadata() config.StepData {
|
||||
Default: os.Getenv("PIPER_containerRegistryUrl"),
|
||||
},
|
||||
{
|
||||
Name: "buildpacks",
|
||||
ResourceRef: []config.ResourceReference{},
|
||||
Scope: []string{"PARAMETERS", "STAGES", "STEPS"},
|
||||
Type: "[]string",
|
||||
Mandatory: false,
|
||||
Aliases: []config.Alias{},
|
||||
Default: []string{},
|
||||
Name: "buildpacks",
|
||||
ResourceRef: []config.ResourceReference{
|
||||
{
|
||||
Name: "commonPipelineEnvironment",
|
||||
Param: "container/buildpacks",
|
||||
},
|
||||
},
|
||||
Scope: []string{"PARAMETERS", "STAGES", "STEPS"},
|
||||
Type: "[]string",
|
||||
Mandatory: false,
|
||||
Aliases: []config.Alias{},
|
||||
Default: []string{},
|
||||
},
|
||||
{
|
||||
Name: "buildEnvVars",
|
||||
ResourceRef: []config.ResourceReference{},
|
||||
Scope: []string{"PARAMETERS", "STAGES", "STEPS"},
|
||||
Type: "[]string",
|
||||
Type: "map[string]interface{}",
|
||||
Mandatory: false,
|
||||
Aliases: []config.Alias{},
|
||||
Default: []string{},
|
||||
},
|
||||
{
|
||||
Name: "path",
|
||||
|
||||
@@ -55,9 +55,9 @@ func TestRunCnbBuild(t *testing.T) {
|
||||
assert.Equal(t, "/cnb/lifecycle/detector", runner.Calls[0].Exec)
|
||||
assert.Equal(t, "/cnb/lifecycle/builder", runner.Calls[1].Exec)
|
||||
assert.Equal(t, "/cnb/lifecycle/exporter", runner.Calls[2].Exec)
|
||||
assert.Equal(t, []string{"-buildpacks", "/cnb/buildpacks", "-order", "/cnb/order.toml", "-platform", "/tmp/platform"}, runner.Calls[0].Params)
|
||||
assert.Equal(t, []string{"-buildpacks", "/cnb/buildpacks", "-platform", "/tmp/platform"}, runner.Calls[1].Params)
|
||||
assert.Equal(t, []string{fmt.Sprintf("%s/%s:%s", registry, config.ContainerImageName, config.ContainerImageTag)}, runner.Calls[2].Params)
|
||||
assert.Equal(t, []string{"-buildpacks", "/cnb/buildpacks", "-order", "/cnb/order.toml", "-platform", "/tmp/platform", "-no-color"}, runner.Calls[0].Params)
|
||||
assert.Equal(t, []string{"-buildpacks", "/cnb/buildpacks", "-platform", "/tmp/platform", "-no-color"}, runner.Calls[1].Params)
|
||||
assert.Equal(t, []string{"-no-color", fmt.Sprintf("%s/%s:%s", registry, config.ContainerImageName, config.ContainerImageTag)}, runner.Calls[2].Params)
|
||||
assert.Equal(t, commonPipelineEnvironment.container.registryURL, fmt.Sprintf("https://%s", registry))
|
||||
assert.Equal(t, commonPipelineEnvironment.container.imageNameTag, "my-image:0.0.1")
|
||||
})
|
||||
@@ -84,9 +84,9 @@ func TestRunCnbBuild(t *testing.T) {
|
||||
assert.Equal(t, "/cnb/lifecycle/detector", runner.Calls[0].Exec)
|
||||
assert.Equal(t, "/cnb/lifecycle/builder", runner.Calls[1].Exec)
|
||||
assert.Equal(t, "/cnb/lifecycle/exporter", runner.Calls[2].Exec)
|
||||
assert.Equal(t, []string{"-buildpacks", "/cnb/buildpacks", "-order", "/cnb/order.toml", "-platform", "/tmp/platform"}, runner.Calls[0].Params)
|
||||
assert.Equal(t, []string{"-buildpacks", "/cnb/buildpacks", "-platform", "/tmp/platform"}, runner.Calls[1].Params)
|
||||
assert.Equal(t, []string{fmt.Sprintf("%s/%s:%s", registry, config.ContainerImageName, config.ContainerImageTag)}, runner.Calls[2].Params)
|
||||
assert.Equal(t, []string{"-buildpacks", "/cnb/buildpacks", "-order", "/cnb/order.toml", "-platform", "/tmp/platform", "-no-color"}, runner.Calls[0].Params)
|
||||
assert.Equal(t, []string{"-buildpacks", "/cnb/buildpacks", "-platform", "/tmp/platform", "-no-color"}, runner.Calls[1].Params)
|
||||
assert.Equal(t, []string{"-no-color", fmt.Sprintf("%s/%s:%s", registry, config.ContainerImageName, config.ContainerImageTag)}, runner.Calls[2].Params)
|
||||
assert.Equal(t, commonPipelineEnvironment.container.registryURL, fmt.Sprintf("https://%s", registry))
|
||||
assert.Equal(t, commonPipelineEnvironment.container.imageNameTag, "my-image:0.0.1")
|
||||
})
|
||||
@@ -100,8 +100,10 @@ func TestRunCnbBuild(t *testing.T) {
|
||||
ContainerRegistryURL: registry,
|
||||
DockerConfigJSON: "/path/to/test.json",
|
||||
Buildpacks: []string{"test"},
|
||||
BuildEnvVars: []string{"FOO=BAR"},
|
||||
AdditionalTags: []string{"latest"},
|
||||
BuildEnvVars: map[string]interface{}{
|
||||
"FOO": "BAR",
|
||||
},
|
||||
AdditionalTags: []string{"latest"},
|
||||
}
|
||||
|
||||
utils := newCnbBuildTestsUtils()
|
||||
@@ -116,9 +118,9 @@ func TestRunCnbBuild(t *testing.T) {
|
||||
assert.Equal(t, "/cnb/lifecycle/detector", runner.Calls[0].Exec)
|
||||
assert.Equal(t, "/cnb/lifecycle/builder", runner.Calls[1].Exec)
|
||||
assert.Equal(t, "/cnb/lifecycle/exporter", runner.Calls[2].Exec)
|
||||
assert.Equal(t, []string{"-buildpacks", "/tmp/buildpacks", "-order", "/tmp/buildpacks/order.toml", "-platform", "/tmp/platform"}, runner.Calls[0].Params)
|
||||
assert.Equal(t, []string{"-buildpacks", "/tmp/buildpacks", "-platform", "/tmp/platform"}, runner.Calls[1].Params)
|
||||
assert.Equal(t, []string{fmt.Sprintf("%s/%s:%s", registry, config.ContainerImageName, config.ContainerImageTag), fmt.Sprintf("%s/%s:latest", registry, config.ContainerImageName)}, runner.Calls[2].Params)
|
||||
assert.Equal(t, []string{"-buildpacks", "/tmp/buildpacks", "-order", "/tmp/buildpacks/order.toml", "-platform", "/tmp/platform", "-no-color"}, runner.Calls[0].Params)
|
||||
assert.Equal(t, []string{"-buildpacks", "/tmp/buildpacks", "-platform", "/tmp/platform", "-no-color"}, runner.Calls[1].Params)
|
||||
assert.Equal(t, []string{"-no-color", fmt.Sprintf("%s/%s:%s", registry, config.ContainerImageName, config.ContainerImageTag), fmt.Sprintf("%s/%s:latest", registry, config.ContainerImageName)}, runner.Calls[2].Params)
|
||||
})
|
||||
|
||||
t.Run("success case (customTlsCertificates)", func(t *testing.T) {
|
||||
@@ -161,9 +163,9 @@ func TestRunCnbBuild(t *testing.T) {
|
||||
assert.Equal(t, "/cnb/lifecycle/detector", runner.Calls[0].Exec)
|
||||
assert.Equal(t, "/cnb/lifecycle/builder", runner.Calls[1].Exec)
|
||||
assert.Equal(t, "/cnb/lifecycle/exporter", runner.Calls[2].Exec)
|
||||
assert.Equal(t, []string{"-buildpacks", "/tmp/buildpacks", "-order", "/tmp/buildpacks/order.toml", "-platform", "/tmp/platform"}, runner.Calls[0].Params)
|
||||
assert.Equal(t, []string{"-buildpacks", "/tmp/buildpacks", "-platform", "/tmp/platform"}, runner.Calls[1].Params)
|
||||
assert.Equal(t, []string{fmt.Sprintf("%s/%s:%s", registry, config.ContainerImageName, config.ContainerImageTag)}, runner.Calls[2].Params)
|
||||
assert.Equal(t, []string{"-buildpacks", "/tmp/buildpacks", "-order", "/tmp/buildpacks/order.toml", "-platform", "/tmp/platform", "-no-color"}, runner.Calls[0].Params)
|
||||
assert.Equal(t, []string{"-buildpacks", "/tmp/buildpacks", "-platform", "/tmp/platform", "-no-color"}, runner.Calls[1].Params)
|
||||
assert.Equal(t, []string{"-no-color", fmt.Sprintf("%s/%s:%s", registry, config.ContainerImageName, config.ContainerImageTag)}, runner.Calls[2].Params)
|
||||
})
|
||||
|
||||
t.Run("success case (additionalTags)", func(t *testing.T) {
|
||||
@@ -188,7 +190,7 @@ func TestRunCnbBuild(t *testing.T) {
|
||||
|
||||
runner := utils.ExecMockRunner
|
||||
assert.Equal(t, "/cnb/lifecycle/exporter", runner.Calls[2].Exec)
|
||||
assert.ElementsMatch(t, []string{fmt.Sprintf("%s/%s:%s", registry, config.ContainerImageName, config.ContainerImageTag), fmt.Sprintf("%s/%s:3", registry, config.ContainerImageName), fmt.Sprintf("%s/%s:3.1", registry, config.ContainerImageName)}, runner.Calls[2].Params)
|
||||
assert.ElementsMatch(t, []string{"-no-color", fmt.Sprintf("%s/%s:%s", registry, config.ContainerImageName, config.ContainerImageTag), fmt.Sprintf("%s/%s:3", registry, config.ContainerImageName), fmt.Sprintf("%s/%s:3.1", registry, config.ContainerImageName)}, runner.Calls[2].Params)
|
||||
})
|
||||
|
||||
t.Run("error case: Invalid DockerConfigJSON file", func(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user