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

refactor: semerrgroup wraps errgroup with a semaphore

This commit is contained in:
Carlos Alexandro Becker 2018-07-09 21:38:00 -07:00
parent ccdd761c50
commit b6f6e227de
No known key found for this signature in database
GPG Key ID: E61E2F7DC14AB940
11 changed files with 53 additions and 79 deletions

View File

@ -13,12 +13,11 @@ import (
"github.com/apex/log"
"github.com/pkg/errors"
"golang.org/x/sync/errgroup"
"github.com/goreleaser/goreleaser/config"
"github.com/goreleaser/goreleaser/context"
"github.com/goreleaser/goreleaser/internal/artifact"
"github.com/goreleaser/goreleaser/internal/semaphore"
"github.com/goreleaser/goreleaser/internal/semerrgroup"
"github.com/goreleaser/goreleaser/pipeline"
)
@ -158,13 +157,10 @@ func Upload(ctx *context.Context, puts []config.Put, kind string, check Response
}
func runPipeByFilter(ctx *context.Context, put config.Put, filter artifact.Filter, kind string, check ResponseChecker) error {
var sem = semaphore.New(ctx.Parallelism)
var g errgroup.Group
var g = semerrgroup.New(ctx.Parallelism)
for _, artifact := range ctx.Artifacts.Filter(filter).List() {
sem.Acquire()
artifact := artifact
g.Go(func() error {
defer sem.Release()
return uploadAsset(ctx, put, artifact, kind, check)
})
}

View File

@ -1,20 +0,0 @@
// Package semaphore provides a small and simple semaphore lib for goreleaser.
package semaphore
// Semaphore is the semaphore itself
type Semaphore chan bool
// New returns a new semaphore of a given size.
func New(size int) Semaphore {
return make(Semaphore, size)
}
// Acquire acquires one semaphore permit.
func (s Semaphore) Acquire() {
s <- true
}
// Release releases one semaphore permit
func (s Semaphore) Release() {
<-s
}

View File

@ -0,0 +1,34 @@
// Package semerrgroup provides a small and simple semaphore lib for goreleaser.
package semerrgroup
import "golang.org/x/sync/errgroup"
// Group is the Group itself
type Group struct {
ch chan bool
g errgroup.Group
}
// New returns a new Group of a given size.
func New(size int) *Group {
return &Group{
ch: make(chan bool, size),
g: errgroup.Group{},
}
}
// Go execs one function respecting the group and semaphore.
func (s *Group) Go(fn func() error) {
s.ch <- true
s.g.Go(func() error {
defer func() {
<-s.ch
}()
return fn()
})
}
// Release releases one Group permit
func (s *Group) Wait() error {
return s.g.Wait()
}

View File

@ -1,21 +1,17 @@
package semaphore
package semerrgroup
import (
"testing"
"github.com/stretchr/testify/require"
"golang.org/x/sync/errgroup"
)
func TestSemaphore(t *testing.T) {
var sem = New(1)
var g = New(1)
var counter = 0
var g errgroup.Group
for i := 0; i < 10; i++ {
sem.Acquire()
g.Go(func() error {
counter++
sem.Release()
return nil
})
}

View File

@ -10,7 +10,6 @@ import (
"github.com/apex/log"
"github.com/pkg/errors"
"golang.org/x/sync/errgroup"
builders "github.com/goreleaser/goreleaser/build"
"github.com/goreleaser/goreleaser/config"
@ -18,7 +17,7 @@ import (
// langs to init
_ "github.com/goreleaser/goreleaser/internal/builders/golang"
"github.com/goreleaser/goreleaser/internal/semaphore"
"github.com/goreleaser/goreleaser/internal/semerrgroup"
"github.com/goreleaser/goreleaser/internal/tmpl"
)
@ -70,14 +69,11 @@ func runPipeOnBuild(ctx *context.Context, build config.Build) error {
if err := runHook(ctx, build.Env, build.Hooks.Pre); err != nil {
return errors.Wrap(err, "pre hook failed")
}
var sem = semaphore.New(ctx.Parallelism)
var g errgroup.Group
var g = semerrgroup.New(ctx.Parallelism)
for _, target := range build.Targets {
sem.Acquire()
target := target
build := build
g.Go(func() error {
defer sem.Release()
return doBuild(ctx, build, target)
})
}

View File

@ -8,12 +8,11 @@ import (
"path/filepath"
"github.com/apex/log"
"golang.org/x/sync/errgroup"
"github.com/goreleaser/goreleaser/checksum"
"github.com/goreleaser/goreleaser/context"
"github.com/goreleaser/goreleaser/internal/artifact"
"github.com/goreleaser/goreleaser/internal/semaphore"
"github.com/goreleaser/goreleaser/internal/semerrgroup"
"github.com/goreleaser/goreleaser/internal/tmpl"
)
@ -48,8 +47,7 @@ func (Pipe) Run(ctx *context.Context) (err error) {
}
defer file.Close() // nolint: errcheck
var g errgroup.Group
var sem = semaphore.New(ctx.Parallelism)
var g = semerrgroup.New(ctx.Parallelism)
for _, artifact := range ctx.Artifacts.Filter(
artifact.Or(
artifact.ByType(artifact.UploadableArchive),
@ -57,10 +55,8 @@ func (Pipe) Run(ctx *context.Context) (err error) {
artifact.ByType(artifact.LinuxPackage),
),
).List() {
sem.Acquire()
artifact := artifact
g.Go(func() error {
defer sem.Release()
return checksums(file, artifact)
})
}

View File

@ -10,13 +10,12 @@ import (
"github.com/apex/log"
"github.com/pkg/errors"
"golang.org/x/sync/errgroup"
"github.com/goreleaser/goreleaser/config"
"github.com/goreleaser/goreleaser/context"
"github.com/goreleaser/goreleaser/internal/artifact"
"github.com/goreleaser/goreleaser/internal/deprecate"
"github.com/goreleaser/goreleaser/internal/semaphore"
"github.com/goreleaser/goreleaser/internal/semerrgroup"
"github.com/goreleaser/goreleaser/internal/tmpl"
"github.com/goreleaser/goreleaser/pipeline"
)
@ -79,14 +78,11 @@ func (Pipe) Run(ctx *context.Context) error {
}
func doRun(ctx *context.Context) error {
var g errgroup.Group
var sem = semaphore.New(ctx.Parallelism)
var g = semerrgroup.New(ctx.Parallelism)
for i, docker := range ctx.Config.Dockers {
docker := docker
seed := i
sem.Acquire()
g.Go(func() error {
defer sem.Release()
log.WithField("docker", docker).Debug("looking for binaries matching")
var binaries = ctx.Artifacts.Filter(
artifact.And(

View File

@ -5,8 +5,6 @@ import (
"os"
"path/filepath"
"golang.org/x/sync/errgroup"
"github.com/apex/log"
"github.com/goreleaser/nfpm"
"github.com/imdario/mergo"
@ -21,7 +19,7 @@ import (
"github.com/goreleaser/goreleaser/context"
"github.com/goreleaser/goreleaser/internal/artifact"
"github.com/goreleaser/goreleaser/internal/linux"
"github.com/goreleaser/goreleaser/internal/semaphore"
"github.com/goreleaser/goreleaser/internal/semerrgroup"
"github.com/goreleaser/goreleaser/internal/tmpl"
"github.com/goreleaser/goreleaser/pipeline"
)
@ -63,16 +61,13 @@ func doRun(ctx *context.Context) error {
artifact.ByType(artifact.Binary),
artifact.ByGoos("linux"),
)).GroupByPlatform()
var g errgroup.Group
var sem = semaphore.New(ctx.Parallelism)
var g = semerrgroup.New(ctx.Parallelism)
for _, format := range ctx.Config.NFPM.Formats {
for platform, artifacts := range linuxBinaries {
sem.Acquire()
format := format
arch := linux.Arch(platform)
artifacts := artifacts
g.Go(func() error {
defer sem.Release()
return create(ctx, format, arch, artifacts)
})
}

View File

@ -4,12 +4,11 @@ import (
"os"
"github.com/apex/log"
"golang.org/x/sync/errgroup"
"github.com/goreleaser/goreleaser/context"
"github.com/goreleaser/goreleaser/internal/artifact"
"github.com/goreleaser/goreleaser/internal/client"
"github.com/goreleaser/goreleaser/internal/semaphore"
"github.com/goreleaser/goreleaser/internal/semerrgroup"
"github.com/goreleaser/goreleaser/pipeline"
)
@ -66,8 +65,7 @@ func doRun(ctx *context.Context, c client.Client) error {
if err != nil {
return err
}
var g errgroup.Group
var sem = semaphore.New(ctx.Parallelism)
var g = semerrgroup.New(ctx.Parallelism)
for _, artifact := range ctx.Artifacts.Filter(
artifact.Or(
artifact.ByType(artifact.UploadableArchive),
@ -77,10 +75,8 @@ func doRun(ctx *context.Context, c client.Client) error {
artifact.ByType(artifact.LinuxPackage),
),
).List() {
sem.Acquire()
artifact := artifact
g.Go(func() error {
defer sem.Release()
return upload(ctx, c, releaseID, artifact)
})
}

View File

@ -13,9 +13,8 @@ import (
"github.com/goreleaser/goreleaser/config"
"github.com/goreleaser/goreleaser/context"
"github.com/goreleaser/goreleaser/internal/artifact"
"github.com/goreleaser/goreleaser/internal/semaphore"
"github.com/goreleaser/goreleaser/internal/semerrgroup"
"github.com/goreleaser/goreleaser/internal/tmpl"
"golang.org/x/sync/errgroup"
)
// Pipe for Artifactory
@ -45,13 +44,10 @@ func (Pipe) Default(ctx *context.Context) error {
// Run the pipe
func (Pipe) Run(ctx *context.Context) error {
var g errgroup.Group
var sem = semaphore.New(ctx.Parallelism)
var g = semerrgroup.New(ctx.Parallelism)
for _, conf := range ctx.Config.S3 {
conf := conf
sem.Acquire()
g.Go(func() error {
defer sem.Release()
return upload(ctx, conf)
})
}
@ -78,8 +74,7 @@ func upload(ctx *context.Context, conf config.S3) error {
return err
}
var g errgroup.Group
var sem = semaphore.New(ctx.Parallelism)
var g = semerrgroup.New(ctx.Parallelism)
for _, artifact := range ctx.Artifacts.Filter(
artifact.Or(
artifact.ByType(artifact.UploadableArchive),
@ -89,10 +84,8 @@ func upload(ctx *context.Context, conf config.S3) error {
artifact.ByType(artifact.LinuxPackage),
),
).List() {
sem.Acquire()
artifact := artifact
g.Go(func() error {
defer sem.Release()
f, err := os.Open(artifact.Path)
if err != nil {
return err

View File

@ -11,13 +11,12 @@ import (
"strings"
"github.com/apex/log"
"golang.org/x/sync/errgroup"
yaml "gopkg.in/yaml.v2"
"github.com/goreleaser/goreleaser/context"
"github.com/goreleaser/goreleaser/internal/artifact"
"github.com/goreleaser/goreleaser/internal/linux"
"github.com/goreleaser/goreleaser/internal/semaphore"
"github.com/goreleaser/goreleaser/internal/parallelerrgroup"
"github.com/goreleaser/goreleaser/internal/tmpl"
"github.com/goreleaser/goreleaser/pipeline"
)
@ -84,15 +83,13 @@ func (Pipe) Run(ctx *context.Context) error {
return ErrNoSnapcraft
}
var g errgroup.Group
var sem = semaphore.New(ctx.Parallelism)
var g = parallelerrgroup.New(ctx.Parallelism)
for platform, binaries := range ctx.Artifacts.Filter(
artifact.And(
artifact.ByGoos("linux"),
artifact.ByType(artifact.Binary),
),
).GroupByPlatform() {
sem.Acquire()
arch := linux.Arch(platform)
if arch == "armel" {
log.WithField("arch", arch).Warn("ignored unsupported arch")
@ -100,7 +97,6 @@ func (Pipe) Run(ctx *context.Context) error {
}
binaries := binaries
g.Go(func() error {
defer sem.Release()
return create(ctx, arch, binaries)
})
}