diff --git a/internal/artifact/artifact.go b/internal/artifact/artifact.go index e11302a8f43..15f96f06340 100644 --- a/internal/artifact/artifact.go +++ b/internal/artifact/artifact.go @@ -40,6 +40,8 @@ const ( PublishableDockerImage // DockerImage is a published Docker image. DockerImage + // DockerManifest is a published Docker manifest. + DockerManifest // Checksum is a checksums file. Checksum // Signature is a signature file. @@ -60,6 +62,8 @@ func (t Type) String() string { return "Linux Package" case PublishableDockerImage, DockerImage: return "Docker Image" + case DockerManifest: + return "Docker Manifest" case PublishableSnapcraft, Snapcraft: return "Snap" case Checksum: diff --git a/internal/artifact/artifact_test.go b/internal/artifact/artifact_test.go index ba468937eb9..6ae69171a43 100644 --- a/internal/artifact/artifact_test.go +++ b/internal/artifact/artifact_test.go @@ -288,3 +288,28 @@ func TestByFormats(t *testing.T) { require.Len(t, artifacts.Filter(ByFormats("zip")).items, 2) require.Len(t, artifacts.Filter(ByFormats("zip", "tar.gz")).items, 3) } + +func TestTypeToString(t *testing.T) { + for _, a := range []Type{ + UploadableArchive, + UploadableBinary, + UploadableFile, + Binary, + LinuxPackage, + PublishableSnapcraft, + Snapcraft, + PublishableDockerImage, + DockerImage, + DockerManifest, + Checksum, + Signature, + UploadableSourceArchive, + } { + t.Run(a.String(), func(t *testing.T) { + require.NotEqual(t, "unknown", a.String()) + }) + } + t.Run("unknown", func(t *testing.T) { + require.Equal(t, "unknown", Type(9999).String()) + }) +} diff --git a/internal/pipe/docker/docker_test.go b/internal/pipe/docker/docker_test.go index 40e5ede2ca8..c4d0dae4f23 100644 --- a/internal/pipe/docker/docker_test.go +++ b/internal/pipe/docker/docker_test.go @@ -152,10 +152,10 @@ func TestRunPipe(t *testing.T) { }, manifests: []config.DockerManifest{ { - NameTemplate: registry + "goreleaser/test_multiarch_fail:test", - ImageTemplates: []string{registry + "goreleaser/test_multiarch_fail:latest-amd64"}, - CreateFlags: []string{"--insecure"}, - PushFlags: []string{"--insecure"}, + NameTemplate: registry + "goreleaser/test_multiarch_fail:test", + ImageTemplates: []string{registry + "goreleaser/test_multiarch_fail:latest-amd64"}, + CreateFlags: []string{"--insecure"}, + PushFlags: []string{"--insecure"}, }, }, expect: []string{registry + "goreleaser/test_multiarch_fail:latest-arm64v8"}, @@ -176,8 +176,8 @@ func TestRunPipe(t *testing.T) { }, manifests: []config.DockerManifest{ { - NameTemplate: registry + "goreleaser/test_multiarch_manifest_tmpl_error:{{ .Goos }", - ImageTemplates: []string{registry + "goreleaser/test_multiarch_manifest_tmpl_error"}, + NameTemplate: registry + "goreleaser/test_multiarch_manifest_tmpl_error:{{ .Goos }", + ImageTemplates: []string{registry + "goreleaser/test_multiarch_manifest_tmpl_error"}, }, }, expect: []string{registry + "goreleaser/test_multiarch_manifest_tmpl_error"}, @@ -198,8 +198,8 @@ func TestRunPipe(t *testing.T) { }, manifests: []config.DockerManifest{ { - NameTemplate: registry + "goreleaser/test_multiarch_img_tmpl_error", - ImageTemplates: []string{registry + "goreleaser/test_multiarch_img_tmpl_error:{{ .Goos }"}, + NameTemplate: registry + "goreleaser/test_multiarch_img_tmpl_error", + ImageTemplates: []string{registry + "goreleaser/test_multiarch_img_tmpl_error:{{ .Goos }"}, }, }, expect: []string{registry + "goreleaser/test_multiarch_img_tmpl_error"}, @@ -220,8 +220,8 @@ func TestRunPipe(t *testing.T) { }, manifests: []config.DockerManifest{ { - NameTemplate: " ", - ImageTemplates: []string{registry + "goreleaser/test_multiarch_no_mainifest_name"}, + NameTemplate: " ", + ImageTemplates: []string{registry + "goreleaser/test_multiarch_no_mainifest_name"}, }, }, expect: []string{registry + "goreleaser/test_multiarch_no_mainifest_name"}, @@ -242,8 +242,8 @@ func TestRunPipe(t *testing.T) { }, manifests: []config.DockerManifest{ { - NameTemplate: "ignored", - ImageTemplates: []string{" ", " ", ""}, + NameTemplate: "ignored", + ImageTemplates: []string{" ", " ", ""}, }, }, expect: []string{registry + "goreleaser/test_multiarch_no_mainifest_images"}, diff --git a/internal/pipe/docker/manifest.go b/internal/pipe/docker/manifest.go index b6f783aa282..da7fe4564d8 100644 --- a/internal/pipe/docker/manifest.go +++ b/internal/pipe/docker/manifest.go @@ -6,6 +6,7 @@ import ( "strings" "github.com/apex/log" + "github.com/goreleaser/goreleaser/internal/artifact" "github.com/goreleaser/goreleaser/internal/pipe" "github.com/goreleaser/goreleaser/internal/semerrgroup" "github.com/goreleaser/goreleaser/internal/tmpl" @@ -41,6 +42,11 @@ func (ManifestPipe) Publish(ctx *context.Context) error { if err := dockerManifestCreate(ctx, name, images, manifest.CreateFlags); err != nil { return err } + ctx.Artifacts.Add(&artifact.Artifact{ + Type: artifact.DockerManifest, + Name: name, + Path: name, + }) return dockerManifestPush(ctx, name, manifest.PushFlags) }) } diff --git a/internal/pipe/release/body.go b/internal/pipe/release/body.go index 7b5450134cc..c73aad2806d 100644 --- a/internal/pipe/release/body.go +++ b/internal/pipe/release/body.go @@ -23,6 +23,9 @@ func describeBody(ctx *context.Context) (bytes.Buffer, error) { var out bytes.Buffer // nolint:prealloc var dockers []string + for _, a := range ctx.Artifacts.Filter(artifact.ByType(artifact.DockerManifest)).List() { + dockers = append(dockers, a.Name) + } for _, a := range ctx.Artifacts.Filter(artifact.ByType(artifact.DockerImage)).List() { dockers = append(dockers, a.Name) } diff --git a/internal/pipe/release/body_test.go b/internal/pipe/release/body_test.go index da1af5b1056..080cd1c48ba 100644 --- a/internal/pipe/release/body_test.go +++ b/internal/pipe/release/body_test.go @@ -21,6 +21,19 @@ func TestDescribeBody(t *testing.T) { "goreleaser/goreleaser:0.40.0", "goreleaser/goreleaser:latest", "goreleaser/godownloader:v0.1.0", + } { + ctx.Artifacts.Add(&artifact.Artifact{ + Name: d, + Type: artifact.DockerManifest, + }) + } + for _, d := range []string{ + "goreleaser/goreleaser:0.40.0-amd64", + "goreleaser/goreleaser:latest-amd64", + "goreleaser/godownloader:v0.1.0-amd64", + "goreleaser/goreleaser:0.40.0-arm64", + "goreleaser/goreleaser:latest-arm64", + "goreleaser/godownloader:v0.1.0-arm64", } { ctx.Artifacts.Add(&artifact.Artifact{ Name: d, diff --git a/internal/pipe/release/testdata/release1.golden b/internal/pipe/release/testdata/release1.golden index 1005de7a8f6..50aa260ef02 100755 --- a/internal/pipe/release/testdata/release1.golden +++ b/internal/pipe/release/testdata/release1.golden @@ -6,3 +6,9 @@ feature2: other description - `docker pull goreleaser/goreleaser:0.40.0` - `docker pull goreleaser/goreleaser:latest` - `docker pull goreleaser/godownloader:v0.1.0` +- `docker pull goreleaser/goreleaser:0.40.0-amd64` +- `docker pull goreleaser/goreleaser:latest-amd64` +- `docker pull goreleaser/godownloader:v0.1.0-amd64` +- `docker pull goreleaser/goreleaser:0.40.0-arm64` +- `docker pull goreleaser/goreleaser:latest-arm64` +- `docker pull goreleaser/godownloader:v0.1.0-arm64`