Skip to content

Commit 8efe309

Browse files
authored
Merge pull request #1482 from dgageot/new-tagging
New tagging mechanism
2 parents bb700a0 + 5cee689 commit 8efe309

35 files changed

+305
-445
lines changed

docs/content/en/docs/how-tos/templating/_index.md

+2-6
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,5 @@ List of fields that support templating:
2020

2121
List of variables that are available for templating:
2222

23-
* all environment variables passed to the Skaffold process as startup
24-
* `IMAGE_NAME` - the artifacts' image name - the [image name rewriting](/docs/concepts/#image-repository-handling) acts after the template was calculated
25-
* `DIGEST` - the image digest calculated by the docker registry after pushing the image
26-
* if `DIGEST` is of format `algo:hex`, `DIGEST_ALGO` and `DIGEST_HEX` parts correspond to the parts of the string otherwise `DIGEST_HEX`=`DIGEST` is set
27-
28-
23+
* all environment variables passed to the skaffold process as startup
24+
* `IMAGE_NAME` - the artifacts' image name - the [image name rewriting](/docs/concepts/#image-repository-handling) acts after the template was calculated

integration/examples/annotated-skaffold.yaml

-3
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,6 @@ build:
1919
# The template is compiled and executed against the current environment,
2020
# with those variables injected:
2121
# IMAGE_NAME | Name of the image being built, as supplied in the artifacts section.
22-
# DIGEST | Digest of the newly built image. For eg. `sha256:27ffc7f352665cc50ae3cbcc4b2725e36062f1b38c611b6f95d6df9a7510de23`.
23-
# DIGEST_ALGO | Algorithm used by the digest: For eg. `sha256`.
24-
# DIGEST_HEX | Digest of the newly built image. For eg. `27ffc7f352665cc50ae3cbcc4b2725e36062f1b38c611b6f95d6df9a7510de23`.
2522
# Example
2623
# envTemplate:
2724
# template: "{{.RELEASE}}-{{.IMAGE_NAME}}"

pkg/skaffold/build/gcb/cloud_build.go

+7-17
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,6 @@ import (
2929
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/build/tag"
3030
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/color"
3131
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/constants"
32-
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/docker"
3332
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/gcp"
3433
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/schema/latest"
3534
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/sources"
@@ -49,6 +48,11 @@ func (b *Builder) Build(ctx context.Context, out io.Writer, tagger tag.Tagger, a
4948
}
5049

5150
func (b *Builder) buildArtifactWithCloudBuild(ctx context.Context, out io.Writer, tagger tag.Tagger, artifact *latest.Artifact) (string, error) {
51+
tag, err := tagger.GenerateFullyQualifiedImageName(artifact.Workspace, artifact.ImageName)
52+
if err != nil {
53+
return "", errors.Wrap(err, "generating tag")
54+
}
55+
5256
client, err := google.DefaultClient(ctx, cloudbuild.CloudPlatformScope)
5357
if err != nil {
5458
return "", errors.Wrap(err, "getting google client")
@@ -86,7 +90,7 @@ func (b *Builder) buildArtifactWithCloudBuild(ctx context.Context, out io.Writer
8690
return "", errors.Wrap(err, "checking bucket is in correct project")
8791
}
8892

89-
desc, err := b.buildDescription(artifact, cbBucket, buildObject)
93+
desc, err := b.buildDescription(artifact, tag, cbBucket, buildObject)
9094
if err != nil {
9195
return "", errors.Wrap(err, "could not create build description")
9296
}
@@ -152,22 +156,8 @@ watch:
152156
return "", errors.Wrap(err, "cleaning up source tar after build")
153157
}
154158
logrus.Infof("Deleted object %s", buildObject)
155-
builtTag := fmt.Sprintf("%s@%s", artifact.ImageName, digest)
156-
logrus.Infof("Image built at %s", builtTag)
157-
158-
newTag, err := tagger.GenerateFullyQualifiedImageName(artifact.Workspace, tag.Options{
159-
ImageName: artifact.ImageName,
160-
Digest: digest,
161-
})
162-
if err != nil {
163-
return "", errors.Wrap(err, "generating tag")
164-
}
165-
166-
if err := docker.AddTag(builtTag, newTag); err != nil {
167-
return "", errors.Wrap(err, "tagging image")
168-
}
169159

170-
return newTag, nil
160+
return tag + "@" + digest, nil
171161
}
172162

173163
func getBuildID(op *cloudbuild.Operation) (string, error) {

pkg/skaffold/build/gcb/desc.go

+7-7
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ import (
2424
cloudbuild "google.golang.org/api/cloudbuild/v1"
2525
)
2626

27-
func (b *Builder) buildDescription(artifact *latest.Artifact, bucket, object string) (*cloudbuild.Build, error) {
28-
steps, err := b.buildSteps(artifact)
27+
func (b *Builder) buildDescription(artifact *latest.Artifact, tag, bucket, object string) (*cloudbuild.Build, error) {
28+
steps, err := b.buildSteps(artifact, tag)
2929
if err != nil {
3030
return nil, err
3131
}
@@ -39,7 +39,7 @@ func (b *Builder) buildDescription(artifact *latest.Artifact, bucket, object str
3939
},
4040
},
4141
Steps: steps,
42-
Images: []string{artifact.ImageName},
42+
Images: []string{tag},
4343
Options: &cloudbuild.BuildOptions{
4444
DiskSizeGb: b.DiskSizeGb,
4545
MachineType: b.MachineType,
@@ -48,19 +48,19 @@ func (b *Builder) buildDescription(artifact *latest.Artifact, bucket, object str
4848
}, nil
4949
}
5050

51-
func (b *Builder) buildSteps(artifact *latest.Artifact) ([]*cloudbuild.BuildStep, error) {
51+
func (b *Builder) buildSteps(artifact *latest.Artifact, tag string) ([]*cloudbuild.BuildStep, error) {
5252
switch {
5353
case artifact.DockerArtifact != nil:
54-
return b.dockerBuildSteps(artifact.ImageName, artifact.DockerArtifact), nil
54+
return b.dockerBuildSteps(artifact.DockerArtifact, tag), nil
5555

5656
case artifact.BazelArtifact != nil:
5757
return nil, errors.New("skaffold can't build a bazel artifact with Google Cloud Build")
5858

5959
case artifact.JibMavenArtifact != nil:
60-
return b.jibMavenBuildSteps(artifact.ImageName, artifact.JibMavenArtifact), nil
60+
return b.jibMavenBuildSteps(artifact.JibMavenArtifact, tag), nil
6161

6262
case artifact.JibGradleArtifact != nil:
63-
return b.jibGradleBuildSteps(artifact.ImageName, artifact.JibGradleArtifact), nil
63+
return b.jibGradleBuildSteps(artifact.JibGradleArtifact, tag), nil
6464

6565
default:
6666
return nil, fmt.Errorf("undefined artifact type: %+v", artifact.ArtifactType)

pkg/skaffold/build/gcb/desc_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func TestBuildBazelDescriptionFail(t *testing.T) {
3333
builder := Builder{
3434
GoogleCloudBuild: &latest.GoogleCloudBuild{},
3535
}
36-
_, err := builder.buildDescription(artifact, "bucket", "object")
36+
_, err := builder.buildDescription(artifact, "tag", "bucket", "object")
3737

3838
testutil.CheckError(t, true, err)
3939
}

pkg/skaffold/build/gcb/docker.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ import (
2222
cloudbuild "google.golang.org/api/cloudbuild/v1"
2323
)
2424

25-
func (b *Builder) dockerBuildSteps(imageName string, artifact *latest.DockerArtifact) []*cloudbuild.BuildStep {
25+
func (b *Builder) dockerBuildSteps(artifact *latest.DockerArtifact, tag string) []*cloudbuild.BuildStep {
2626
var steps []*cloudbuild.BuildStep
2727

2828
for _, cacheFrom := range artifact.CacheFrom {
@@ -32,7 +32,7 @@ func (b *Builder) dockerBuildSteps(imageName string, artifact *latest.DockerArti
3232
})
3333
}
3434

35-
args := append([]string{"build", "--tag", imageName, "-f", artifact.DockerfilePath})
35+
args := append([]string{"build", "--tag", tag, "-f", artifact.DockerfilePath})
3636
args = append(args, docker.GetBuildArgs(artifact)...)
3737
args = append(args, ".")
3838

pkg/skaffold/build/gcb/docker_test.go

+3-4
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import (
2727

2828
func TestDockerBuildDescription(t *testing.T) {
2929
artifact := &latest.Artifact{
30-
ImageName: "nginx",
3130
ArtifactType: latest.ArtifactType{
3231
DockerArtifact: &latest.DockerArtifact{
3332
DockerfilePath: "Dockerfile",
@@ -47,7 +46,7 @@ func TestDockerBuildDescription(t *testing.T) {
4746
Timeout: "10m",
4847
},
4948
}
50-
desc, err := builder.buildDescription(artifact, "bucket", "object")
49+
desc, err := builder.buildDescription(artifact, "nginx", "bucket", "object")
5150

5251
expected := cloudbuild.Build{
5352
LogsBucket: "bucket",
@@ -61,7 +60,7 @@ func TestDockerBuildDescription(t *testing.T) {
6160
Name: "docker/docker",
6261
Args: []string{"build", "--tag", "nginx", "-f", "Dockerfile", "--build-arg", "arg1=value1", "--build-arg", "arg2", "."},
6362
}},
64-
Images: []string{artifact.ImageName},
63+
Images: []string{"nginx"},
6564
Options: &cloudbuild.BuildOptions{
6665
DiskSizeGb: 100,
6766
MachineType: "n1-standard-1",
@@ -83,7 +82,7 @@ func TestPullCacheFrom(t *testing.T) {
8382
DockerImage: "docker/docker",
8483
},
8584
}
86-
steps := builder.dockerBuildSteps("nginx2", artifact)
85+
steps := builder.dockerBuildSteps(artifact, "nginx2")
8786

8887
expected := []*cloudbuild.BuildStep{{
8988
Name: "docker/docker",

pkg/skaffold/build/gcb/jib.go

+4-4
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,16 @@ import (
2323
)
2424

2525
// TODO(dgageot): check that `package` is bound to `jib:build`
26-
func (b *Builder) jibMavenBuildSteps(imageName string, artifact *latest.JibMavenArtifact) []*cloudbuild.BuildStep {
26+
func (b *Builder) jibMavenBuildSteps(artifact *latest.JibMavenArtifact, tag string) []*cloudbuild.BuildStep {
2727
return []*cloudbuild.BuildStep{{
2828
Name: b.MavenImage,
29-
Args: jib.GenerateMavenArgs("dockerBuild", imageName, artifact, b.skipTests),
29+
Args: jib.GenerateMavenArgs("dockerBuild", tag, artifact, b.skipTests),
3030
}}
3131
}
3232

33-
func (b *Builder) jibGradleBuildSteps(imageName string, artifact *latest.JibGradleArtifact) []*cloudbuild.BuildStep {
33+
func (b *Builder) jibGradleBuildSteps(artifact *latest.JibGradleArtifact, tag string) []*cloudbuild.BuildStep {
3434
return []*cloudbuild.BuildStep{{
3535
Name: b.GradleImage,
36-
Args: jib.GenerateGradleArgs("jibDockerBuild", imageName, artifact, b.skipTests),
36+
Args: jib.GenerateGradleArgs("jibDockerBuild", tag, artifact, b.skipTests),
3737
}}
3838
}

pkg/skaffold/build/gcb/jib_test.go

+2-2
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ func TestJibMavenBuildSteps(t *testing.T) {
4141
},
4242
skipTests: tt.skipTests,
4343
}
44-
steps := builder.jibMavenBuildSteps("img", artifact)
44+
steps := builder.jibMavenBuildSteps(artifact, "img")
4545

4646
expected := []*cloudbuild.BuildStep{{
4747
Name: "maven:3.6.0",
@@ -69,7 +69,7 @@ func TestJibGradleBuildSteps(t *testing.T) {
6969
},
7070
skipTests: tt.skipTests,
7171
}
72-
steps := builder.jibGradleBuildSteps("img", artifact)
72+
steps := builder.jibGradleBuildSteps(artifact, "img")
7373

7474
expected := []*cloudbuild.BuildStep{{
7575
Name: "gradle:5.1.1",

pkg/skaffold/build/kaniko/kaniko.go

+5-18
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222

2323
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/build"
2424
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/build/tag"
25-
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/docker"
2625
"github.com/GoogleContainerTools/skaffold/pkg/skaffold/schema/latest"
2726
"github.com/pkg/errors"
2827
)
@@ -47,27 +46,15 @@ func (b *Builder) Build(ctx context.Context, out io.Writer, tagger tag.Tagger, a
4746
}
4847

4948
func (b *Builder) buildArtifactWithKaniko(ctx context.Context, out io.Writer, tagger tag.Tagger, artifact *latest.Artifact) (string, error) {
50-
initialTag, err := b.run(ctx, out, artifact)
51-
if err != nil {
52-
return "", errors.Wrapf(err, "kaniko build for [%s]", artifact.ImageName)
53-
}
54-
55-
digest, err := docker.RemoteDigest(initialTag)
56-
if err != nil {
57-
return "", errors.Wrap(err, "getting digest")
58-
}
59-
60-
tag, err := tagger.GenerateFullyQualifiedImageName(artifact.Workspace, tag.Options{
61-
ImageName: artifact.ImageName,
62-
Digest: digest,
63-
})
49+
tag, err := tagger.GenerateFullyQualifiedImageName(artifact.Workspace, artifact.ImageName)
6450
if err != nil {
6551
return "", errors.Wrap(err, "generating tag")
6652
}
6753

68-
if err := docker.AddTag(initialTag, tag); err != nil {
69-
return "", errors.Wrap(err, "tagging image")
54+
digest, err := b.run(ctx, out, artifact, tag)
55+
if err != nil {
56+
return "", errors.Wrapf(err, "kaniko build for [%s]", artifact.ImageName)
7057
}
7158

72-
return tag, nil
59+
return tag + "@" + digest, nil
7360
}

pkg/skaffold/build/kaniko/run.go

+4-7
Original file line numberDiff line numberDiff line change
@@ -31,17 +31,14 @@ import (
3131
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
3232
)
3333

34-
func (b *Builder) run(ctx context.Context, out io.Writer, artifact *latest.Artifact) (string, error) {
34+
func (b *Builder) run(ctx context.Context, out io.Writer, artifact *latest.Artifact, tag string) (string, error) {
3535
if artifact.DockerArtifact == nil {
3636
return "", errors.New("kaniko builder supports only Docker artifacts")
3737
}
3838

39-
initialTag := util.RandomID()
40-
imageDst := fmt.Sprintf("%s:%s", artifact.ImageName, initialTag)
41-
4239
// Prepare context
4340
s := sources.Retrieve(b.KanikoBuild)
44-
context, err := s.Setup(ctx, out, artifact, initialTag)
41+
context, err := s.Setup(ctx, out, artifact, util.RandomID())
4542
if err != nil {
4643
return "", errors.Wrap(err, "setting up build context")
4744
}
@@ -51,7 +48,7 @@ func (b *Builder) run(ctx context.Context, out io.Writer, artifact *latest.Artif
5148
args := []string{
5249
"--dockerfile", artifact.DockerArtifact.DockerfilePath,
5350
"--context", context,
54-
"--destination", imageDst,
51+
"--destination", tag,
5552
"-v", logLevel().String()}
5653
args = append(args, b.AdditionalFlags...)
5754
args = append(args, docker.GetBuildArgs(artifact.DockerArtifact)...)
@@ -96,5 +93,5 @@ func (b *Builder) run(ctx context.Context, out io.Writer, artifact *latest.Artif
9693

9794
waitForLogs()
9895

99-
return imageDst, nil
96+
return docker.RemoteDigest(tag)
10097
}

pkg/skaffold/build/local/bazel.go

+14-11
Original file line numberDiff line numberDiff line change
@@ -36,10 +36,10 @@ import (
3636
"github.com/pkg/errors"
3737
)
3838

39-
func (b *Builder) buildBazel(ctx context.Context, out io.Writer, workspace string, a *latest.Artifact) (string, error) {
39+
func (b *Builder) buildBazel(ctx context.Context, out io.Writer, workspace string, a *latest.BazelArtifact, tag string) (string, error) {
4040
args := []string{"build"}
41-
args = append(args, a.BazelArtifact.BuildArgs...)
42-
args = append(args, a.BazelArtifact.BuildTarget)
41+
args = append(args, a.BuildArgs...)
42+
args = append(args, a.BuildTarget)
4343

4444
// FIXME: is it possible to apply b.skipTests?
4545
cmd := exec.CommandContext(ctx, "bazel", args...)
@@ -50,20 +50,18 @@ func (b *Builder) buildBazel(ctx context.Context, out io.Writer, workspace strin
5050
return "", errors.Wrap(err, "running command")
5151
}
5252

53-
bazelBin, err := bazelBin(ctx, workspace, a.BazelArtifact)
53+
bazelBin, err := bazelBin(ctx, workspace, a)
5454
if err != nil {
5555
return "", errors.Wrap(err, "getting path of bazel-bin")
5656
}
5757

58-
tarPath := filepath.Join(bazelBin, buildTarPath(a.BazelArtifact.BuildTarget))
58+
tarPath := filepath.Join(bazelBin, buildTarPath(a.BuildTarget))
5959

6060
if b.pushImages {
61-
uniqueTag := a.ImageName + ":" + util.RandomID()
62-
return pushImage(tarPath, uniqueTag)
61+
return pushImage(tarPath, tag)
6362
}
6463

65-
ref := buildImageTag(a.BazelArtifact.BuildTarget)
66-
return b.loadImage(ctx, out, tarPath, ref)
64+
return b.loadImage(ctx, out, tarPath, a, tag)
6765
}
6866

6967
func pushImage(tarPath, tag string) (string, error) {
@@ -89,18 +87,23 @@ func pushImage(tarPath, tag string) (string, error) {
8987
return docker.RemoteDigest(tag)
9088
}
9189

92-
func (b *Builder) loadImage(ctx context.Context, out io.Writer, tarPath string, ref string) (string, error) {
90+
func (b *Builder) loadImage(ctx context.Context, out io.Writer, tarPath string, a *latest.BazelArtifact, tag string) (string, error) {
9391
imageTar, err := os.Open(tarPath)
9492
if err != nil {
9593
return "", errors.Wrap(err, "opening image tarball")
9694
}
9795
defer imageTar.Close()
9896

99-
imageID, err := b.localDocker.Load(ctx, out, imageTar, ref)
97+
bazelTag := buildImageTag(a.BuildTarget)
98+
imageID, err := b.localDocker.Load(ctx, out, imageTar, bazelTag)
10099
if err != nil {
101100
return "", errors.Wrap(err, "loading image into docker daemon")
102101
}
103102

103+
if err := b.localDocker.Tag(ctx, imageID, tag); err != nil {
104+
return "", errors.Wrap(err, "tagging the image")
105+
}
106+
104107
return imageID, nil
105108
}
106109

0 commit comments

Comments
 (0)