1
0
mirror of https://github.com/goreleaser/goreleaser.git synced 2025-03-17 20:47:50 +02:00

refactor: docker push moved to publish

This commit is contained in:
Carlos Alexandro Becker 2018-10-20 13:45:31 -03:00 committed by Carlos Alexandro Becker
parent b8d0f29099
commit 21084567fc
4 changed files with 65 additions and 46 deletions

View File

@ -24,7 +24,9 @@ const (
Binary
// LinuxPackage is a linux package generated by nfpm or snapcraft
LinuxPackage
// DockerImage is a docker image
// PublishableDockerImage is a Docker image yet to be published
PublishableDockerImage
// DockerImage is a published Docker image
DockerImage
// Checksum is a checksums file
Checksum
@ -37,13 +39,13 @@ func (t Type) String() string {
case UploadableArchive:
return "Archive"
case UploadableBinary:
return "Binary"
case Binary:
return "Binary"
case LinuxPackage:
return "LinuxPackage"
return "Linux Package"
case DockerImage:
return "DockerImage"
case PublishableDockerImage:
return "Docker Image"
case Checksum:
return "Checksum"
case Signature:

View File

@ -10,8 +10,6 @@ import (
"strings"
"github.com/apex/log"
"github.com/pkg/errors"
"github.com/goreleaser/goreleaser/internal/artifact"
"github.com/goreleaser/goreleaser/internal/deprecate"
"github.com/goreleaser/goreleaser/internal/pipe"
@ -19,6 +17,7 @@ import (
"github.com/goreleaser/goreleaser/internal/tmpl"
"github.com/goreleaser/goreleaser/pkg/config"
"github.com/goreleaser/goreleaser/pkg/context"
"github.com/pkg/errors"
)
// ErrNoDocker is shown when docker cannot be found in $PATH
@ -78,6 +77,17 @@ func (Pipe) Run(ctx *context.Context) error {
return doRun(ctx)
}
// Publish the docker images
func (Pipe) Publish(ctx *context.Context) error {
var images = ctx.Artifacts.Filter(artifact.ByType(artifact.PublishableDockerImage)).List()
for _, image := range images {
if err := dockerPush(ctx, image); err != nil {
return err
}
}
return nil
}
func missingImage(ctx *context.Context) bool {
return ctx.Config.Dockers[0].Image == "" && len(ctx.Config.Dockers[0].ImageTemplates) == 0
}
@ -112,14 +122,14 @@ func doRun(ctx *context.Context) error {
return g.Wait()
}
func process(ctx *context.Context, docker config.Docker, artifact artifact.Artifact) error {
func process(ctx *context.Context, docker config.Docker, bin artifact.Artifact) error {
tmp, err := ioutil.TempDir(ctx.Config.Dist, "goreleaserdocker")
if err != nil {
return errors.Wrap(err, "failed to create temporary dir")
}
log.Debug("tempdir: " + tmp)
images, err := processImageTemplates(ctx, docker, artifact)
images, err := processImageTemplates(ctx, docker, bin)
if err != nil {
return err
}
@ -132,11 +142,11 @@ func process(ctx *context.Context, docker config.Docker, artifact artifact.Artif
return errors.Wrapf(err, "failed to link extra file '%s'", file)
}
}
if err := os.Link(artifact.Path, filepath.Join(tmp, filepath.Base(artifact.Path))); err != nil {
if err := os.Link(bin.Path, filepath.Join(tmp, filepath.Base(bin.Path))); err != nil {
return errors.Wrap(err, "failed to link binary")
}
buildFlags, err := processBuildFlagTemplates(ctx, docker, artifact)
buildFlags, err := processBuildFlagTemplates(ctx, docker, bin)
if err != nil {
return err
}
@ -149,7 +159,22 @@ func process(ctx *context.Context, docker config.Docker, artifact artifact.Artif
return err
}
}
return publish(ctx, docker, images)
if docker.SkipPush {
// TODO: this should also be better handled
log.Warn(pipe.Skip("skip_push is set").Error())
return nil
}
for _, img := range images {
ctx.Artifacts.Add(artifact.Artifact{
Type: artifact.PublishableDockerImage,
Name: img,
Path: img,
Goarch: docker.Goarch,
Goos: docker.Goos,
Goarm: docker.Goarm,
})
}
return nil
}
func processImageTemplates(ctx *context.Context, docker config.Docker, artifact artifact.Artifact) ([]string, error) {
@ -224,25 +249,6 @@ func link(src, dest string) error {
})
}
func publish(ctx *context.Context, docker config.Docker, images []string) error {
if ctx.SkipPublish {
// TODO: this should be better handled
log.Warn(pipe.ErrSkipPublishEnabled.Error())
return nil
}
if docker.SkipPush {
// TODO: this should also be better handled
log.Warn(pipe.Skip("skip_push is set").Error())
return nil
}
for _, image := range images {
if err := dockerPush(ctx, docker, image); err != nil {
return err
}
}
return nil
}
func dockerBuild(ctx *context.Context, root, image string, flags []string) error {
log.WithField("image", image).Info("building docker image")
/* #nosec */
@ -276,23 +282,17 @@ func dockerTag(ctx *context.Context, image, tag string) error {
return nil
}
func dockerPush(ctx *context.Context, docker config.Docker, image string) error {
func dockerPush(ctx *context.Context, image artifact.Artifact) error {
log.WithField("image", image).Info("pushing docker image")
/* #nosec */
var cmd = exec.CommandContext(ctx, "docker", "push", image)
var cmd = exec.CommandContext(ctx, "docker", "push", image.Name)
log.WithField("cmd", cmd.Args).Debug("running")
out, err := cmd.CombinedOutput()
if err != nil {
return errors.Wrapf(err, "failed to push docker image: \n%s", string(out))
}
log.Debugf("docker push output: \n%s", string(out))
ctx.Artifacts.Add(artifact.Artifact{
Type: artifact.DockerImage,
Name: image,
Path: image,
Goarch: docker.Goarch,
Goos: docker.Goos,
Goarm: docker.Goarm,
})
image.Type = artifact.DockerImage
ctx.Artifacts.Add(image)
return nil
}

View File

@ -92,6 +92,7 @@ func TestRunPipe(t *testing.T) {
expect []string
assertImageLabels imageLabelFinder
assertError errChecker
pubAssertError errChecker
}{
"valid": {
publish: true,
@ -147,7 +148,8 @@ func TestRunPipe(t *testing.T) {
"label=org.label-schema.version=1.0.0",
"label=org.label-schema.vcs-ref=a1b2c3d4",
"label=org.label-schema.name=mybin"),
assertError: shouldNotErr,
assertError: shouldNotErr,
pubAssertError: shouldNotErr,
},
"with deprecated image name & tag templates": {
publish: true,
@ -173,7 +175,8 @@ func TestRunPipe(t *testing.T) {
"goreleaser/test_run_pipe",
"label=org.label-schema.version=1.0.0",
),
assertError: shouldNotErr,
assertError: shouldNotErr,
pubAssertError: shouldNotErr,
},
"multiple images with same extra file": {
publish: true,
@ -203,6 +206,7 @@ func TestRunPipe(t *testing.T) {
},
assertImageLabels: noLabels,
assertError: shouldNotErr,
pubAssertError: shouldNotErr,
},
"multiple images with same dockerfile": {
publish: true,
@ -229,7 +233,8 @@ func TestRunPipe(t *testing.T) {
registry + "goreleaser/test_run_pipe:latest",
registry + "goreleaser/test_run_pipe2:latest",
},
assertError: shouldNotErr,
assertError: shouldNotErr,
pubAssertError: shouldNotErr,
},
"valid_skip_push": {
publish: true,
@ -249,6 +254,7 @@ func TestRunPipe(t *testing.T) {
},
assertImageLabels: noLabels,
assertError: shouldNotErr,
pubAssertError: shouldNotErr,
},
"valid_no_latest": {
publish: true,
@ -267,6 +273,7 @@ func TestRunPipe(t *testing.T) {
},
assertImageLabels: noLabels,
assertError: shouldNotErr,
pubAssertError: shouldNotErr,
},
"valid_dont_publish": {
publish: false,
@ -285,6 +292,7 @@ func TestRunPipe(t *testing.T) {
},
assertImageLabels: noLabels,
assertError: shouldNotErr,
pubAssertError: shouldNotErr,
},
"valid build args": {
publish: false,
@ -306,6 +314,7 @@ func TestRunPipe(t *testing.T) {
},
assertImageLabels: noLabels,
assertError: shouldNotErr,
pubAssertError: shouldNotErr,
},
"bad build args": {
publish: false,
@ -432,6 +441,7 @@ func TestRunPipe(t *testing.T) {
},
assertImageLabels: noLabels,
assertError: shouldNotErr,
pubAssertError: shouldNotErr,
},
"no_permissions": {
publish: true,
@ -449,7 +459,8 @@ func TestRunPipe(t *testing.T) {
"docker.io/nope:latest",
},
assertImageLabels: noLabels,
assertError: shouldErr(`requested access to the resource is denied`),
assertError: shouldNotErr,
pubAssertError: shouldErr(`requested access to the resource is denied`),
},
"dockerfile_doesnt_exist": {
publish: true,
@ -524,7 +535,7 @@ func TestRunPipe(t *testing.T) {
for name, docker := range table {
t.Run(name, func(tt *testing.T) {
folder, err := ioutil.TempDir("", "archivetest")
folder, err := ioutil.TempDir("", "dockertest")
require.NoError(tt, err)
var dist = filepath.Join(folder, "dist")
require.NoError(tt, os.Mkdir(dist, 0755))
@ -567,7 +578,11 @@ func TestRunPipe(t *testing.T) {
_ = exec.Command("docker", "rmi", img).Run()
}
docker.assertError(tt, Pipe{}.Run(ctx))
err = Pipe{}.Run(ctx)
docker.assertError(tt, err)
if err == nil {
docker.pubAssertError(tt, Pipe{}.Publish(ctx))
}
for _, d := range docker.dockers {
if d.ImageTemplates == nil {

View File

@ -9,6 +9,7 @@ import (
"github.com/goreleaser/goreleaser/internal/pipe"
"github.com/goreleaser/goreleaser/internal/pipe/artifactory"
"github.com/goreleaser/goreleaser/internal/pipe/brew"
"github.com/goreleaser/goreleaser/internal/pipe/docker"
"github.com/goreleaser/goreleaser/internal/pipe/put"
"github.com/goreleaser/goreleaser/internal/pipe/release"
"github.com/goreleaser/goreleaser/internal/pipe/s3"
@ -39,6 +40,7 @@ var publishers = []Publisher{
release.Pipe{},
brew.Pipe{},
scoop.Pipe{},
docker.Pipe{},
}
var bold = color.New(color.Bold)