Skip to content

Commit

Permalink
chore(cnbBuild): simplify telemetry data (#4864)
Browse files Browse the repository at this point in the history
Co-authored-by: Johannes Dillmann <[email protected]>
  • Loading branch information
pbusko and modulo11 authored Mar 14, 2024
1 parent 1259a32 commit 4d86308
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 278 deletions.
26 changes: 6 additions & 20 deletions cmd/cnbBuild.go
Original file line number Diff line number Diff line change
Expand Up @@ -296,8 +296,10 @@ func callCnbBuild(config *cnbBuildOptions, telemetryData *telemetry.CustomData,
if err != nil {
log.Entry().Warnf("failed to retrieve dockerImage configuration: '%v'", err)
}
telemetry.WithBuilder(dockerImage)

telemetry.WithImage(dockerImage)
buildTool, _ := getBuildToolFromStageConfig("cnbBuild")
telemetry.WithBuildTool(buildTool)

cnbBuildConfig := buildsettings.BuildOptions{
CreateBOM: config.CreateBOM,
Expand Down Expand Up @@ -351,10 +353,12 @@ func callCnbBuild(config *cnbBuildOptions, telemetryData *telemetry.CustomData,
}
}

return telemetry.Export()
return nil
}

func runCnbBuild(config *cnbBuildOptions, telemetry *buildpacks.Telemetry, imageSummary *cnbutils.ImageSummary, utils cnbutils.BuildUtils, commonPipelineEnvironment *cnbBuildCommonPipelineEnvironment, httpClient piperhttp.Sender) error {
telemetry.WithRunImage(config.RunImage)

err := cleanDir("/layers", utils)
if err != nil {
log.SetErrorCategory(log.ErrorBuild)
Expand Down Expand Up @@ -388,8 +392,6 @@ func runCnbBuild(config *cnbBuildOptions, telemetry *buildpacks.Telemetry, image
}
config.BuildEnvVars["TMPDIR"] = tempdir

telemetrySegment := createInitialTelemetrySegment(config, utils)

include := ignore.CompileIgnoreLines("**/*")
exclude := ignore.CompileIgnoreLines("piper", ".pipeline", ".git")

Expand All @@ -407,7 +409,6 @@ func runCnbBuild(config *cnbBuildOptions, telemetry *buildpacks.Telemetry, image
log.SetErrorCategory(log.ErrorConfiguration)
return errors.Wrapf(err, "failed to parse %s", projDescPath)
}
telemetrySegment.WithProjectDescriptor(descriptor)

config.mergeEnvVars(descriptor.EnvVars)

Expand Down Expand Up @@ -440,8 +441,6 @@ func runCnbBuild(config *cnbBuildOptions, telemetry *buildpacks.Telemetry, image
return errors.Wrap(err, "failed to retrieve target image configuration")
}

telemetry.AddSegment(telemetrySegment.WithBuildpacksOverall(config.Buildpacks).WithKeyValues(config.BuildEnvVars))

if commonPipelineEnvironment.container.imageNameTag == "" {
commonPipelineEnvironment.container.registryURL = fmt.Sprintf("%s://%s", targetImage.ContainerRegistry.Scheme, targetImage.ContainerRegistry.Host)
commonPipelineEnvironment.container.imageNameTag = fmt.Sprintf("%v:%v", targetImage.ContainerImageName, targetImage.ContainerImageTag)
Expand Down Expand Up @@ -627,16 +626,3 @@ func expandEnvVars(envVars map[string]any) map[string]any {
}
return expandedEnvVars
}

func createInitialTelemetrySegment(config *cnbBuildOptions, utils cnbutils.BuildUtils) *buildpacks.Segment {
telemetrySegment := buildpacks.NewSegment()
projectPath, _, _ := config.resolvePath(utils) // ignore error here, telemetry problems should not fail the build
buildTool, _ := getBuildToolFromStageConfig("cnbBuild") // ignore error here, telemetry problems should not fail the build

return telemetrySegment.WithBindings(config.Bindings).
WithTags(config.ContainerImageTag, config.AdditionalTags).
WithPath(projectPath).
WithEnv(config.BuildEnvVars).
WithBuildTool(buildTool).
WithBuildpacksFromConfig(config.Buildpacks)
}
126 changes: 10 additions & 116 deletions cmd/cnbBuild_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,11 @@
package cmd

import (
"encoding/json"
"fmt"
"net/http"
"path/filepath"
"testing"

"github.com/SAP/jenkins-library/pkg/buildpacks"
"github.com/SAP/jenkins-library/pkg/cnbutils"
piperconf "github.com/SAP/jenkins-library/pkg/config"
piperhttp "github.com/SAP/jenkins-library/pkg/http"
Expand Down Expand Up @@ -179,13 +177,6 @@ func TestRunCnbBuild(t *testing.T) {

assert.Equal(t, "sha256:52eac630560210e5ae13eb10797c4246d6f02d425f32b9430ca00bde697c79ec", commonPipelineEnvironment.container.imageDigest)
assert.Contains(t, commonPipelineEnvironment.container.imageDigests, "sha256:52eac630560210e5ae13eb10797c4246d6f02d425f32b9430ca00bde697c79ec")

customDataAsString := telemetryData.CnbBuildStepData
customData := &buildpacks.BuildpacksTelemetry{}
err = json.Unmarshal([]byte(customDataAsString), customData)
require.NoError(t, err)
assert.Equal(t, 1, len(customData.Data))
assert.Equal(t, "root", string(customData.Data[0].Path))
})

t.Run("success case (registry with https)", func(t *testing.T) {
Expand Down Expand Up @@ -584,58 +575,25 @@ func TestRunCnbBuild(t *testing.T) {
ContainerImageName: "my-image",
ContainerImageTag: "3.1.5",
ContainerRegistryURL: registry,
DockerConfigJSON: "/path/to/config.json",
ProjectDescriptor: "project.toml",
AdditionalTags: []string{"latest"},
Buildpacks: []string{"paketobuildpacks/java", "gcr.io/paketo-buildpacks/node"},
Bindings: map[string]interface{}{"SECRET": map[string]string{"key": "KEY", "file": "a_file"}},
Path: "target",
MultipleImages: []map[string]interface{}{
{
"runImage": "foo",
},
{
"runImage": "bar",
},
},
}

utils := newCnbBuildTestsUtils()
utils.FilesMock.AddFile(config.DockerConfigJSON, []byte(`{"auths":{"my-registry":{"auth":"dXNlcjpwYXNz"}}}`))
utils.FilesMock.AddDir("target")
utils.FilesMock.AddFile("target/project.toml", []byte(`[project]
id = "test"
name = "test"
version = "1.0.0"
[build]
include = []
exclude = ["*.tar"]
[[build.buildpacks]]
uri = "some-buildpack"`))
utils.FilesMock.AddFile("a_file", []byte(`{}`))
utils.FilesMock.AddFile("target/somelib.jar", []byte(`FFFFFF`))

addBuilderFiles(&utils)

telemetryData := &telemetry.CustomData{}
err := callCnbBuild(&config, telemetryData, &utils, &cnbBuildCommonPipelineEnvironment{}, &piperhttp.Client{})
require.NoError(t, err)

customDataAsString := telemetryData.CnbBuildStepData
customData := &buildpacks.BuildpacksTelemetry{}
err = json.Unmarshal([]byte(customDataAsString), customData)

require.NoError(t, err)
assert.Equal(t, 3, customData.Version)
require.Equal(t, 1, len(customData.Data))
assert.Equal(t, "3.1.5", customData.Data[0].ImageTag)
assert.Equal(t, "folder", string(customData.Data[0].Path))
assert.Contains(t, customData.Data[0].AdditionalTags, "latest")
assert.Contains(t, customData.Data[0].BindingKeys, "SECRET")
assert.Equal(t, "paketobuildpacks/builder-jammy-base:latest", customData.Data[0].Builder)

assert.Contains(t, customData.Data[0].Buildpacks.FromConfig, "paketobuildpacks/java")
assert.NotContains(t, customData.Data[0].Buildpacks.FromProjectDescriptor, "paketobuildpacks/java")
assert.Contains(t, customData.Data[0].Buildpacks.FromProjectDescriptor, "bcc73ab1f0a0d3fb0d1bf2b6df5510a25ccd14a761dbc0f5044ea24ead30452b")
assert.Contains(t, customData.Data[0].Buildpacks.Overall, "paketobuildpacks/java")

assert.True(t, customData.Data[0].ProjectDescriptor.Used)
assert.False(t, customData.Data[0].ProjectDescriptor.IncludeUsed)
assert.True(t, customData.Data[0].ProjectDescriptor.ExcludeUsed)
assert.Equal(t, "paketobuildpacks/builder-jammy-base:latest", telemetryData.CnbBuilder)
assert.Equal(t, "foo,bar", telemetryData.CnbRunImage)
})

t.Run("error case, multiple artifacts in path", func(t *testing.T) {
Expand Down Expand Up @@ -696,63 +654,6 @@ uri = "some-buildpack"`))
assert.Equal(t, "my-image:3.1.5", commonPipelineEnvironment.container.imageNameTag)
})

t.Run("success case (build env telemetry was added)", func(t *testing.T) {
t.Parallel()
registry := "some-registry"
config := cnbBuildOptions{
ContainerImageName: "my-image",
ContainerImageTag: "3.1.5",
ContainerRegistryURL: registry,
ProjectDescriptor: "project.toml",
BuildEnvVars: map[string]interface{}{"CONFIG_KEY": "var", "BP_JVM_VERSION": "8"},
}

utils := newCnbBuildTestsUtils()
utils.FilesMock.AddFile("project.toml", []byte(`[project]
id = "test"
[build]
include = []
[[build.env]]
name='PROJECT_KEY'
value='var'
[[build.env]]
name='BP_NODE_VERSION'
value='11'
[[build.buildpacks]]
uri = "some-buildpack"
`))

addBuilderFiles(&utils)

telemetryData := &telemetry.CustomData{}
err := callCnbBuild(&config, telemetryData, &utils, &cnbBuildCommonPipelineEnvironment{}, &piperhttp.Client{})
require.NoError(t, err)

customDataAsString := telemetryData.CnbBuildStepData
customData := &buildpacks.BuildpacksTelemetry{}
err = json.Unmarshal([]byte(customDataAsString), customData)

require.NoError(t, err)
require.Equal(t, 1, len(customData.Data))
assert.Contains(t, customData.Data[0].BuildEnv.KeysFromConfig, "CONFIG_KEY")
assert.NotContains(t, customData.Data[0].BuildEnv.KeysFromProjectDescriptor, "CONFIG_KEY")
assert.Contains(t, customData.Data[0].BuildEnv.KeysOverall, "CONFIG_KEY")

assert.NotContains(t, customData.Data[0].BuildEnv.KeysFromConfig, "PROJECT_KEY")
assert.Contains(t, customData.Data[0].BuildEnv.KeysFromProjectDescriptor, "PROJECT_KEY")
assert.Contains(t, customData.Data[0].BuildEnv.KeysOverall, "PROJECT_KEY")

assert.Equal(t, "8", customData.Data[0].BuildEnv.KeyValues["BP_JVM_VERSION"])
assert.Equal(t, "11", customData.Data[0].BuildEnv.KeyValues["BP_NODE_VERSION"])
assert.NotContains(t, customData.Data[0].BuildEnv.KeyValues, "PROJECT_KEY")

assert.Contains(t, customData.Data[0].Buildpacks.Overall, "bcc73ab1f0a0d3fb0d1bf2b6df5510a25ccd14a761dbc0f5044ea24ead30452b")
})

t.Run("success case (multiple images configured)", func(t *testing.T) {
t.Parallel()
commonPipelineEnvironment := cnbBuildCommonPipelineEnvironment{}
Expand All @@ -774,20 +675,13 @@ uri = "some-buildpack"
err := callCnbBuild(&config, telemetryData, &utils, &commonPipelineEnvironment, &piperhttp.Client{})
require.NoError(t, err)

customDataAsString := telemetryData.CnbBuildStepData
customData := &buildpacks.BuildpacksTelemetry{}
err = json.Unmarshal([]byte(customDataAsString), customData)
assert.NoError(t, err)
require.Equal(t, expectedImageCount, len(customData.Data))

runner := utils.ExecMockRunner
require.Equal(t, expectedImageCount, len(runner.Calls)-1)
for i, call := range runner.Calls {
if i == 0 { // first call is -version
continue
}
lifecycleCall := i - 1
assert.Equal(t, 4, len(customData.Data[lifecycleCall].AdditionalTags))
assertLifecycleCalls(t, runner, i+1)
containerImageName := fmt.Sprintf("my-image-%d", lifecycleCall)
assert.Contains(t, call.Params, fmt.Sprintf("%s/%s:%s", config.ContainerRegistryURL, containerImageName, config.ContainerImageTag))
Expand Down
Loading

0 comments on commit 4d86308

Please sign in to comment.