Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions pkg/apis/build/v1alpha2/build_pod.go
Original file line number Diff line number Diff line change
Expand Up @@ -191,6 +191,14 @@ func (b *Build) BuildPod(images BuildPodImages, buildContext BuildContext) (*cor
dnsProbeHost := ref.Context().RegistryStr()

buildEnv := b.Spec.Source.Source().BuildEnvVars()
var gitMetadataEnv []corev1.EnvVar
if b.Spec.Source.Git != nil {
gitMetadataEnv = []corev1.EnvVar{
{Name: PlatformEnvVarPrefix + "BPE_GIT_REVISION", Value: b.Spec.Source.Git.Revision},
{Name: PlatformEnvVarPrefix + "BP_OCI_REVISION", Value: b.Spec.Source.Git.Revision},
}
}
buildEnv = append(buildEnv, gitMetadataEnv...)
for _, envVar := range b.Spec.Env {
envVar.Name = PlatformEnvVarPrefix + envVar.Name
buildEnv = append(buildEnv, envVar)
Expand Down
44 changes: 43 additions & 1 deletion pkg/apis/build/v1alpha2/image_builds.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@ package v1alpha2

import (
"fmt"
"slices"
"strconv"
"time"

Expand Down Expand Up @@ -37,6 +38,14 @@ type BuildReason string

func (im *Image) Build(sourceResolver *SourceResolver, builder BuilderResource, latestBuild *Build, reasons, changes string, nextBuildNumber int64, priorityClass string) *Build {
buildNumber := strconv.Itoa(int(nextBuildNumber))
tags := im.generateTags(buildNumber)

if resolvedGit := im.resolvedGitSource(sourceResolver); resolvedGit != nil {
if shaTag, err := im.gitRevisionTag(resolvedGit.Revision); err == nil && shaTag != "" {
tags = appendIfMissing(tags, shaTag)
}
}

return &Build{
ObjectMeta: metav1.ObjectMeta{
Namespace: im.Namespace,
Expand All @@ -57,7 +66,7 @@ func (im *Image) Build(sourceResolver *SourceResolver, builder BuilderResource,
}),
},
Spec: BuildSpec{
Tags: im.generateTags(buildNumber),
Tags: tags,
Builder: builder.BuildBuilderSpec(),
RunImage: BuildSpecImage{
Image: builder.RunImage(),
Expand Down Expand Up @@ -277,6 +286,39 @@ func (im *Image) generateTags(buildNumber string) []string {
)
}

func (im *Image) resolvedGitSource(sourceResolver *SourceResolver) *corev1alpha1.ResolvedGitSource {
if sourceResolver == nil {
return nil
}

gitSource := sourceResolver.Status.Source.Git
if gitSource == nil {
return nil
}

return gitSource
}

func (im *Image) gitRevisionTag(revision string) (string, error) {
if revision == "" {
return "", nil
}

tag, err := name.NewTag(im.Spec.Tag, name.WeakValidation)
if err != nil {
return "", err
}

return fmt.Sprintf("%s:%s", tag.Context().Name(), revision), nil
}

func appendIfMissing(tags []string, candidate string) []string {
if slices.Contains(tags, candidate) {
return tags
}
return append(tags, candidate)
}

func (im *Image) generateBuildName(buildNumber string) string {
return kmeta.ChildName(im.Name, "-build-"+buildNumber)
}
Expand Down
36 changes: 27 additions & 9 deletions pkg/apis/build/v1alpha2/image_builds_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,8 @@ func TestImageBuilds(t *testing.T) {
}

func testImageBuilds(t *testing.T, when spec.G, it spec.S) {
const gitRevision = "9f86d081884c7d659a2feaa0c55ad015a3bf4f1b"

image := &Image{
ObjectMeta: metav1.ObjectMeta{
Name: "image-name",
Expand Down Expand Up @@ -99,15 +101,15 @@ func testImageBuilds(t *testing.T, when spec.G, it spec.S) {
sourceResolver.Status.Source = corev1alpha1.ResolvedSourceConfig{
Git: &corev1alpha1.ResolvedGitSource{
URL: "https://some.git/url",
Revision: "revision",
Revision: gitRevision,
Type: corev1alpha1.Commit,
},
}

latestBuild.Spec.Source = corev1alpha1.SourceConfig{
Git: &corev1alpha1.Git{
URL: "https://some.git/url",
Revision: "revision",
Revision: gitRevision,
},
}

Expand Down Expand Up @@ -147,11 +149,27 @@ func testImageBuilds(t *testing.T, when spec.G, it spec.S) {
it("sets git url and git revision when image source is git", func() {
build := image.Build(sourceResolver, builder, latestBuild, "", "", 27, "")
assert.Contains(t, build.Spec.Source.Git.URL, "https://some.git/url")
assert.Contains(t, build.Spec.Source.Git.Revision, "revision")
assert.Equal(t, gitRevision, build.Spec.Source.Git.Revision)
assert.Nil(t, build.Spec.Source.Blob)
assert.Nil(t, build.Spec.Source.Registry)
})

it("appends the git sha tag when a git source is present", func() {
image.Spec.Tag = "gcr.io/imagename/foo:test"
build := image.Build(sourceResolver, builder, latestBuild, "", "", 12, "")
assert.Contains(t, build.Spec.Tags, "gcr.io/imagename/foo:"+gitRevision)
})

it("appends the git sha tag even when the resolved git source is not marked as a commit", func() {
image.Spec.Tag = "gcr.io/imagename/foo:test"
previousType := sourceResolver.Status.Source.Git.Type
sourceResolver.Status.Source.Git.Type = corev1alpha1.Branch
defer func() { sourceResolver.Status.Source.Git.Type = previousType }()

build := image.Build(sourceResolver, builder, latestBuild, "", "", 12, "")
assert.Contains(t, build.Spec.Tags, "gcr.io/imagename/foo:"+gitRevision)
})

it("sets blob url when image source is blob", func() {
sourceResolver.Status.Source = corev1alpha1.ResolvedSourceConfig{
Blob: &corev1alpha1.ResolvedBlobSource{
Expand Down Expand Up @@ -180,15 +198,15 @@ func testImageBuilds(t *testing.T, when spec.G, it spec.S) {
image.Spec.Tag = "imagename/foo:test"
image.Spec.ImageTaggingStrategy = corev1alpha1.None
build := image.Build(sourceResolver, builder, latestBuild, "", "", 1, "")
require.Len(t, build.Spec.Tags, 1)
require.Len(t, build.Spec.Tags, 2)
})

it("with adds additional tags names", func() {
image.Spec.Tag = "imagename/foo:test"
image.Spec.AdditionalTags = []string{"imagename/foo:test2", "anotherimage/foo:test3"}
image.Spec.ImageTaggingStrategy = corev1alpha1.None
build := image.Build(sourceResolver, builder, latestBuild, "", "", 1, "")
require.Len(t, build.Spec.Tags, 3)
require.Len(t, build.Spec.Tags, 4)
})

it("generates a build with default process when set", func() {
Expand All @@ -202,29 +220,29 @@ func testImageBuilds(t *testing.T, when spec.G, it spec.S) {
it("with tag prefix if image name has a tag", func() {
image.Spec.Tag = "gcr.io/imagename/foo:test"
build := image.Build(sourceResolver, builder, latestBuild, "", "", 45, "")
require.Len(t, build.Spec.Tags, 2)
require.Len(t, build.Spec.Tags, 3)
require.Regexp(t, "gcr.io/imagename/foo:test-b45\\.\\d{8}\\.\\d{6}", build.Spec.Tags[1])
})

it("without tag prefix if image name has no provided tag", func() {
image.Spec.Tag = "gcr.io/imagename/notags"
build := image.Build(sourceResolver, builder, latestBuild, "", "", 1, "")
require.Len(t, build.Spec.Tags, 2)
require.Len(t, build.Spec.Tags, 3)
require.Regexp(t, "gcr.io/imagename/notags:b1\\.\\d{8}\\.\\d{6}", build.Spec.Tags[1])
})

it("with additional tags if provided", func() {
image.Spec.Tag = "gcr.io/imagename/tagged:latest"
image.Spec.AdditionalTags = []string{"imagename/foo:test2", "anotherimage/foo:test3"}
build := image.Build(sourceResolver, builder, latestBuild, "", "", 1, "")
require.Len(t, build.Spec.Tags, 4)
require.Len(t, build.Spec.Tags, 5)
require.Regexp(t, "gcr.io/imagename/tagged:b1\\.\\d{8}\\.\\d{6}", build.Spec.Tags[1])
})

it("without tag prefix if image name has the tag 'latest' provided", func() {
image.Spec.Tag = "gcr.io/imagename/tagged:latest"
build := image.Build(sourceResolver, builder, latestBuild, "", "", 1, "")
require.Len(t, build.Spec.Tags, 2)
require.Len(t, build.Spec.Tags, 3)
require.Regexp(t, "gcr.io/imagename/tagged:b1\\.\\d{8}\\.\\d{6}", build.Spec.Tags[1])
})
})
Expand Down
Loading