diff --git a/internal/artifact/artifact.go b/internal/artifact/artifact.go index 1458f179a..db430249a 100644 --- a/internal/artifact/artifact.go +++ b/internal/artifact/artifact.go @@ -141,6 +141,8 @@ func And(filters ...Filter) Filter { // is accepted. // You can compose filters by using the And and Or filters. func (artifacts *Artifacts) Filter(filter Filter) Artifacts { + // TODO: this could be done lazily and the real job could be done in the + // #List() method maybe? var result = New() for _, a := range artifacts.items { if filter(a) { diff --git a/pipeline/docker/docker.go b/pipeline/docker/docker.go index e0b9ddf50..749f1f9fb 100644 --- a/pipeline/docker/docker.go +++ b/pipeline/docker/docker.go @@ -12,6 +12,7 @@ import ( "github.com/apex/log" "github.com/pkg/errors" + "golang.org/x/sync/errgroup" "github.com/goreleaser/goreleaser/config" "github.com/goreleaser/goreleaser/context" @@ -69,31 +70,40 @@ func (Pipe) Run(ctx *context.Context) error { } func doRun(ctx *context.Context) error { - // TODO: could be done in parallel. + var g errgroup.Group + sem := make(chan bool, ctx.Parallelism) for _, docker := range ctx.Config.Dockers { - log.WithField("docker", docker).Debug("looking for binaries matching") - var binaries = ctx.Artifacts.Filter( - artifact.And( - artifact.ByGoos(docker.Goos), - artifact.ByGoarch(docker.Goarch), - artifact.ByGoarm(docker.Goarm), - artifact.ByType(artifact.Binary), - func(a artifact.Artifact) bool { - return a.Extra["Binary"] == docker.Binary - }, - ), - ).List() - if len(binaries) == 0 { - log.Warn("no binaries found") - } - for _, binary := range binaries { - var err = process(ctx, docker, binary) - if err != nil && !pipeline.IsSkip(err) { - return err + docker := docker + sem <- true + g.Go(func() error { + defer func() { + <-sem + }() + log.WithField("docker", docker).Debug("looking for binaries matching") + var binaries = ctx.Artifacts.Filter( + artifact.And( + artifact.ByGoos(docker.Goos), + artifact.ByGoarch(docker.Goarch), + artifact.ByGoarm(docker.Goarm), + artifact.ByType(artifact.Binary), + func(a artifact.Artifact) bool { + return a.Extra["Binary"] == docker.Binary + }, + ), + ).List() + if len(binaries) == 0 { + log.Warn("no binaries found") } - } + for _, binary := range binaries { + var err = process(ctx, docker, binary) + if err != nil { + return err + } + } + return nil + }) } - return nil + return g.Wait() } func tagName(ctx *context.Context, docker config.Docker) (string, error) { @@ -167,10 +177,8 @@ func link(src, dest string) error { func publish(ctx *context.Context, docker config.Docker, image, latest string) error { // TODO: improve this so it can log it to stdout if !ctx.Publish { - return pipeline.Skip("--skip-publish is set") - } - if ctx.Config.Release.Draft { - return pipeline.Skip("release is marked as draft") + log.Warn("skipping push because --skip-publish is set") + return nil } if err := dockerPush(ctx, image); err != nil { return err