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

Merge pull request #341 from goreleaser/skip

skip pipe as an error type and improved output
This commit is contained in:
Carlos Alexandro Becker 2017-08-24 11:11:11 -03:00 committed by GitHub
commit 42446c8079
20 changed files with 123 additions and 48 deletions

View File

@ -53,7 +53,7 @@ func (ctx *Context) AddArtifact(file string) {
defer artifactsLock.Unlock() defer artifactsLock.Unlock()
file = strings.TrimPrefix(file, ctx.Config.Dist+string(filepath.Separator)) file = strings.TrimPrefix(file, ctx.Config.Dist+string(filepath.Separator))
ctx.Artifacts = append(ctx.Artifacts, file) ctx.Artifacts = append(ctx.Artifacts, file)
log.WithField("artifact", file).Info("new artifact") log.WithField("artifact", file).Info("new release artifact")
} }
// AddBinary adds a built binary to the current context // AddBinary adds a built binary to the current context
@ -77,7 +77,7 @@ func (ctx *Context) AddBinary(platform, folder, name, path string) {
WithField("folder", folder). WithField("folder", folder).
WithField("name", name). WithField("name", name).
WithField("path", path). WithField("path", path).
Info("new binary") Debug("new binary")
} }
// New context // New context

View File

@ -84,7 +84,7 @@ func Release(flags Flags) error {
ctx.RmDist = flags.Bool("rm-dist") ctx.RmDist = flags.Bool("rm-dist")
for _, pipe := range pipes { for _, pipe := range pipes {
log.Infof("\033[1m%s\033[0m", strings.ToUpper(pipe.Description())) log.Infof("\033[1m%s\033[0m", strings.ToUpper(pipe.Description()))
if err := pipe.Run(ctx); err != nil { if err := handle(pipe.Run(ctx)); err != nil {
return err return err
} }
} }
@ -92,6 +92,18 @@ func Release(flags Flags) error {
return nil return nil
} }
func handle(err error) error {
if err == nil {
return nil
}
skip, ok := err.(pipeline.ErrSkip)
if ok {
log.WithField("reason", skip.Error()).Warn("skipped")
return nil
}
return err
}
// InitProject creates an example goreleaser.yml in the current directory // InitProject creates an example goreleaser.yml in the current directory
func InitProject(filename string) error { func InitProject(filename string) error {
if _, err := os.Stat(filename); !os.IsNotExist(err) { if _, err := os.Stat(filename); !os.IsNotExist(err) {

View File

@ -10,12 +10,12 @@ func All(build config.Build) (targets []Target) {
for _, target := range allBuildTargets(build) { for _, target := range allBuildTargets(build) {
if !valid(target) { if !valid(target) {
log.WithField("target", target.PrettyString()). log.WithField("target", target.PrettyString()).
Warn("skipped invalid build") Debug("skipped invalid build")
continue continue
} }
if ignored(build, target) { if ignored(build, target) {
log.WithField("target", target.PrettyString()). log.WithField("target", target.PrettyString()).
Warn("skipped ignored build") Debug("skipped ignored build")
continue continue
} }
targets = append(targets, target) targets = append(targets, target)

14
internal/testlib/skip.go Normal file
View File

@ -0,0 +1,14 @@
package testlib
import (
"testing"
"github.com/goreleaser/goreleaser/pipeline"
"github.com/stretchr/testify/assert"
)
// AssertSkipped asserts that a pipe was skipped
func AssertSkipped(t *testing.T, err error) {
_, ok := err.(pipeline.ErrSkip)
assert.True(t, ok)
}

View File

@ -0,0 +1,11 @@
package testlib
import (
"testing"
"github.com/goreleaser/goreleaser/pipeline"
)
func TestAssertSkipped(t *testing.T) {
AssertSkipped(t, pipeline.Skip("skip"))
}

View File

@ -14,6 +14,7 @@ import (
"github.com/goreleaser/goreleaser/context" "github.com/goreleaser/goreleaser/context"
"github.com/goreleaser/goreleaser/internal/archiveformat" "github.com/goreleaser/goreleaser/internal/archiveformat"
"github.com/goreleaser/goreleaser/internal/client" "github.com/goreleaser/goreleaser/internal/client"
"github.com/goreleaser/goreleaser/pipeline"
) )
// ErrNoDarwin64Build when there is no build for darwin_amd64 (goos doesn't // ErrNoDarwin64Build when there is no build for darwin_amd64 (goos doesn't
@ -37,20 +38,16 @@ func (Pipe) Run(ctx *context.Context) error {
func doRun(ctx *context.Context, client client.Client) error { func doRun(ctx *context.Context, client client.Client) error {
if !ctx.Publish { if !ctx.Publish {
log.Warn("skipped because --skip-publish is set") return pipeline.Skip("--skip-publish is set")
return nil
} }
if ctx.Config.Brew.GitHub.Name == "" { if ctx.Config.Brew.GitHub.Name == "" {
log.Warn("skipped because brew section is not configured") return pipeline.Skip("brew section is not configured")
return nil
} }
if ctx.Config.Release.Draft { if ctx.Config.Release.Draft {
log.Warn("skipped because release is marked as draft") return pipeline.Skip("release is marked as draft")
return nil
} }
if ctx.Config.Archive.Format == "binary" { if ctx.Config.Archive.Format == "binary" {
log.Warn("skipped because archive format is binary") return pipeline.Skip("archive format is binary")
return nil
} }
var group = ctx.Binaries["darwinamd64"] var group = ctx.Binaries["darwinamd64"]

View File

@ -9,6 +9,7 @@ import (
"github.com/goreleaser/goreleaser/config" "github.com/goreleaser/goreleaser/config"
"github.com/goreleaser/goreleaser/context" "github.com/goreleaser/goreleaser/context"
"github.com/goreleaser/goreleaser/internal/testlib"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
@ -202,7 +203,7 @@ func TestRunPipeBrewNotSetup(t *testing.T) {
Publish: true, Publish: true,
} }
client := &DummyClient{} client := &DummyClient{}
assert.NoError(doRun(ctx, client)) testlib.AssertSkipped(t, doRun(ctx, client))
assert.False(client.CreatedFile) assert.False(client.CreatedFile)
} }
@ -224,7 +225,7 @@ func TestRunPipeBinaryRelease(t *testing.T) {
} }
ctx.AddBinary("darwinamd64", "foo", "bar", "baz") ctx.AddBinary("darwinamd64", "foo", "bar", "baz")
client := &DummyClient{} client := &DummyClient{}
assert.NoError(doRun(ctx, client)) testlib.AssertSkipped(t, doRun(ctx, client))
assert.False(client.CreatedFile) assert.False(client.CreatedFile)
} }
@ -234,7 +235,7 @@ func TestRunPipeNoPublish(t *testing.T) {
Publish: false, Publish: false,
} }
client := &DummyClient{} client := &DummyClient{}
assert.NoError(doRun(ctx, client)) testlib.AssertSkipped(t, doRun(ctx, client))
assert.False(client.CreatedFile) assert.False(client.CreatedFile)
} }
@ -255,7 +256,7 @@ func TestRunPipeDraftRelease(t *testing.T) {
}, },
} }
client := &DummyClient{} client := &DummyClient{}
assert.NoError(doRun(ctx, client)) testlib.AssertSkipped(t, doRun(ctx, client))
assert.False(client.CreatedFile) assert.False(client.CreatedFile)
} }
@ -269,7 +270,7 @@ func TestRunPipeFormatBinary(t *testing.T) {
}, },
} }
client := &DummyClient{} client := &DummyClient{}
assert.NoError(doRun(ctx, client)) testlib.AssertSkipped(t, doRun(ctx, client))
assert.False(client.CreatedFile) assert.False(client.CreatedFile)
} }

View File

@ -27,7 +27,7 @@ func (Pipe) Run(ctx *context.Context) (err error) {
return nil return nil
} }
if ctx.RmDist { if ctx.RmDist {
log.Warn("rm-dist is set, removing ./dist") log.Info("--rm-dist is set, removing ./dist")
return os.RemoveAll(ctx.Config.Dist) return os.RemoveAll(ctx.Config.Dist)
} }
files, err := ioutil.ReadDir(ctx.Config.Dist) files, err := ioutil.ReadDir(ctx.Config.Dist)

8
pipeline/env/env.go vendored
View File

@ -6,8 +6,8 @@ import (
"errors" "errors"
"os" "os"
"github.com/apex/log"
"github.com/goreleaser/goreleaser/context" "github.com/goreleaser/goreleaser/context"
"github.com/goreleaser/goreleaser/pipeline"
) )
// ErrMissingToken indicates an error when GITHUB_TOKEN is missing in the environment // ErrMissingToken indicates an error when GITHUB_TOKEN is missing in the environment
@ -25,12 +25,10 @@ func (Pipe) Description() string {
func (Pipe) Run(ctx *context.Context) (err error) { func (Pipe) Run(ctx *context.Context) (err error) {
ctx.Token = os.Getenv("GITHUB_TOKEN") ctx.Token = os.Getenv("GITHUB_TOKEN")
if !ctx.Publish { if !ctx.Publish {
log.Warn("github token not validated because publishing has been disabled") return pipeline.Skip("publishing is disabled")
return nil
} }
if !ctx.Validate { if !ctx.Validate {
log.Warn("skipped validations because --skip-validate is set") return pipeline.Skip("--skip-validate is set")
return nil
} }
if ctx.Token == "" { if ctx.Token == "" {
return ErrMissingToken return ErrMissingToken

View File

@ -7,6 +7,7 @@ import (
"github.com/goreleaser/goreleaser/config" "github.com/goreleaser/goreleaser/config"
"github.com/goreleaser/goreleaser/context" "github.com/goreleaser/goreleaser/context"
"github.com/goreleaser/goreleaser/internal/testlib"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
@ -61,7 +62,7 @@ func TestInvalidEnvChecksSkipped(t *testing.T) {
Publish: flag.Publish, Publish: flag.Publish,
Snapshot: flag.Snapshot, Snapshot: flag.Snapshot,
} }
assert.NoError(Pipe{}.Run(ctx)) testlib.AssertSkipped(t, Pipe{}.Run(ctx))
}) })
} }
} }

View File

@ -10,6 +10,7 @@ import (
"github.com/apex/log" "github.com/apex/log"
"github.com/goreleaser/goreleaser/context" "github.com/goreleaser/goreleaser/context"
"github.com/goreleaser/goreleaser/pipeline"
"golang.org/x/sync/errgroup" "golang.org/x/sync/errgroup"
) )
@ -27,8 +28,7 @@ func (Pipe) Description() string {
// Run the pipe // Run the pipe
func (Pipe) Run(ctx *context.Context) error { func (Pipe) Run(ctx *context.Context) error {
if len(ctx.Config.FPM.Formats) == 0 { if len(ctx.Config.FPM.Formats) == 0 {
log.Warn("skipping because no output formats configured") return pipeline.Skip("no output formats configured")
return nil
} }
_, err := exec.LookPath("fpm") _, err := exec.LookPath("fpm")
if err != nil { if err != nil {

View File

@ -8,6 +8,7 @@ import (
"github.com/goreleaser/goreleaser/config" "github.com/goreleaser/goreleaser/config"
"github.com/goreleaser/goreleaser/context" "github.com/goreleaser/goreleaser/context"
"github.com/goreleaser/goreleaser/internal/testlib"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
@ -16,12 +17,11 @@ func TestDescription(t *testing.T) {
} }
func TestRunPipeNoFormats(t *testing.T) { func TestRunPipeNoFormats(t *testing.T) {
var assert = assert.New(t)
var ctx = &context.Context{ var ctx = &context.Context{
Version: "1.0.0", Version: "1.0.0",
Config: config.Project{}, Config: config.Project{},
} }
assert.NoError(Pipe{}.Run(ctx)) testlib.AssertSkipped(t, Pipe{}.Run(ctx))
} }
func TestRunPipe(t *testing.T) { func TestRunPipe(t *testing.T) {

View File

@ -13,6 +13,7 @@ import (
"github.com/apex/log" "github.com/apex/log"
"github.com/goreleaser/goreleaser/context" "github.com/goreleaser/goreleaser/context"
"github.com/goreleaser/goreleaser/internal/git" "github.com/goreleaser/goreleaser/internal/git"
"github.com/goreleaser/goreleaser/pipeline"
) )
// Pipe for brew deployment // Pipe for brew deployment
@ -43,8 +44,7 @@ func (Pipe) Run(ctx *context.Context) (err error) {
return return
} }
if !ctx.Validate { if !ctx.Validate {
log.Warn("skipped validations because --skip-validate is set") return pipeline.Skip("--skip-validate is set")
return nil
} }
return validate(ctx, commit, tag) return validate(ctx, commit, tag)
} }

View File

@ -37,7 +37,7 @@ func TestSingleCommit(t *testing.T) {
var ctx = &context.Context{ var ctx = &context.Context{
Config: config.Project{}, Config: config.Project{},
} }
assert.NoError(Pipe{}.Run(ctx)) testlib.AssertSkipped(t, Pipe{}.Run(ctx))
assert.Equal("v0.0.1", ctx.Git.CurrentTag) assert.Equal("v0.0.1", ctx.Git.CurrentTag)
} }
@ -67,7 +67,7 @@ func TestNoTagsSnapshot(t *testing.T) {
Snapshot: true, Snapshot: true,
Publish: false, Publish: false,
} }
assert.NoError(Pipe{}.Run(ctx)) testlib.AssertSkipped(t, Pipe{}.Run(ctx))
assert.Contains(ctx.Version, "SNAPSHOT-") assert.Contains(ctx.Version, "SNAPSHOT-")
} }
@ -182,7 +182,6 @@ func TestValidState(t *testing.T) {
} }
func TestNoValidate(t *testing.T) { func TestNoValidate(t *testing.T) {
var assert = assert.New(t)
_, back := testlib.Mktmp(t) _, back := testlib.Mktmp(t)
defer back() defer back()
testlib.GitInit(t) testlib.GitInit(t)
@ -194,7 +193,7 @@ func TestNoValidate(t *testing.T) {
Config: config.Project{}, Config: config.Project{},
Validate: false, Validate: false,
} }
assert.NoError(Pipe{}.Run(ctx)) testlib.AssertSkipped(t, Pipe{}.Run(ctx))
} }
func TestChangelog(t *testing.T) { func TestChangelog(t *testing.T) {
@ -210,7 +209,7 @@ func TestChangelog(t *testing.T) {
var ctx = &context.Context{ var ctx = &context.Context{
Config: config.Project{}, Config: config.Project{},
} }
assert.NoError(Pipe{}.Run(ctx)) testlib.AssertSkipped(t, Pipe{}.Run(ctx))
assert.Equal("v0.0.2", ctx.Git.CurrentTag) assert.Equal("v0.0.2", ctx.Git.CurrentTag)
assert.Contains(ctx.ReleaseNotes, "## Changelog") assert.Contains(ctx.ReleaseNotes, "## Changelog")
assert.NotContains(ctx.ReleaseNotes, "first") assert.NotContains(ctx.ReleaseNotes, "first")
@ -236,7 +235,7 @@ func TestChangelogOfFirstRelease(t *testing.T) {
var ctx = &context.Context{ var ctx = &context.Context{
Config: config.Project{}, Config: config.Project{},
} }
assert.NoError(Pipe{}.Run(ctx)) testlib.AssertSkipped(t, Pipe{}.Run(ctx))
assert.Equal("v0.0.1", ctx.Git.CurrentTag) assert.Equal("v0.0.1", ctx.Git.CurrentTag)
assert.Contains(ctx.ReleaseNotes, "## Changelog") assert.Contains(ctx.ReleaseNotes, "## Changelog")
for _, msg := range msgs { for _, msg := range msgs {
@ -255,7 +254,7 @@ func TestCustomReleaseNotes(t *testing.T) {
Config: config.Project{}, Config: config.Project{},
ReleaseNotes: "custom", ReleaseNotes: "custom",
} }
assert.NoError(Pipe{}.Run(ctx)) testlib.AssertSkipped(t, Pipe{}.Run(ctx))
assert.Equal("v0.0.1", ctx.Git.CurrentTag) assert.Equal("v0.0.1", ctx.Git.CurrentTag)
assert.Equal(ctx.ReleaseNotes, "custom") assert.Equal(ctx.ReleaseNotes, "custom")
} }

View File

@ -11,3 +11,18 @@ type Pipe interface {
// Run the pipe // Run the pipe
Run(ctx *context.Context) error Run(ctx *context.Context) error
} }
// ErrSkip occurs when a pipe is skipped for some reason
type ErrSkip struct {
reason string
}
// Error implements the error interface. returns the reason the pipe was skipped
func (e ErrSkip) Error() string {
return e.reason
}
// Skip skips this pipe with the given reason
func Skip(reason string) ErrSkip {
return ErrSkip{reason}
}

15
pipeline/pipe_test.go Normal file
View File

@ -0,0 +1,15 @@
package pipeline
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestSkipPipe(t *testing.T) {
var assert = assert.New(t)
var reason = "this is a test"
var err = Skip(reason)
assert.Error(err)
assert.Equal(reason, err.Error())
}

View File

@ -9,6 +9,7 @@ import (
"github.com/apex/log" "github.com/apex/log"
"github.com/goreleaser/goreleaser/context" "github.com/goreleaser/goreleaser/context"
"github.com/goreleaser/goreleaser/internal/client" "github.com/goreleaser/goreleaser/internal/client"
"github.com/goreleaser/goreleaser/pipeline"
"golang.org/x/sync/errgroup" "golang.org/x/sync/errgroup"
) )
@ -27,8 +28,7 @@ func (Pipe) Run(ctx *context.Context) error {
func doRun(ctx *context.Context, client client.Client) error { func doRun(ctx *context.Context, client client.Client) error {
if !ctx.Publish { if !ctx.Publish {
log.Warn("skipped because --skip-publish is set") return pipeline.Skip("--skip-publish is set")
return nil
} }
log.WithField("tag", ctx.Git.CurrentTag). log.WithField("tag", ctx.Git.CurrentTag).
WithField("repo", ctx.Config.Release.GitHub.String()). WithField("repo", ctx.Config.Release.GitHub.String()).

View File

@ -10,6 +10,7 @@ import (
"github.com/goreleaser/goreleaser/config" "github.com/goreleaser/goreleaser/config"
"github.com/goreleaser/goreleaser/context" "github.com/goreleaser/goreleaser/context"
"github.com/goreleaser/goreleaser/internal/testlib"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
@ -121,7 +122,7 @@ func TestSkipPublish(t *testing.T) {
Parallelism: 1, Parallelism: 1,
} }
client := &DummyClient{} client := &DummyClient{}
assert.NoError(doRun(ctx, client)) testlib.AssertSkipped(t, doRun(ctx, client))
assert.False(client.CreatedRelease) assert.False(client.CreatedRelease)
assert.False(client.UploadedFile) assert.False(client.UploadedFile)
} }

View File

@ -12,6 +12,7 @@ import (
"github.com/apex/log" "github.com/apex/log"
"github.com/goreleaser/goreleaser/context" "github.com/goreleaser/goreleaser/context"
"github.com/goreleaser/goreleaser/pipeline"
"golang.org/x/sync/errgroup" "golang.org/x/sync/errgroup"
yaml "gopkg.in/yaml.v2" yaml "gopkg.in/yaml.v2"
) )
@ -55,8 +56,7 @@ func (Pipe) Description() string {
// Run the pipe // Run the pipe
func (Pipe) Run(ctx *context.Context) error { func (Pipe) Run(ctx *context.Context) error {
if ctx.Config.Snapcraft.Summary == "" && ctx.Config.Snapcraft.Description == "" { if ctx.Config.Snapcraft.Summary == "" && ctx.Config.Snapcraft.Description == "" {
log.Warn("skipping because no summary nor description were provided") return pipeline.Skip("no summary nor description were provided")
return nil
} }
if ctx.Config.Snapcraft.Summary == "" { if ctx.Config.Snapcraft.Summary == "" {
return ErrNoSummary return ErrNoSummary
@ -100,6 +100,7 @@ func archFor(key string) string {
} }
func create(ctx *context.Context, folder, arch string, binaries []context.Binary) error { func create(ctx *context.Context, folder, arch string, binaries []context.Binary) error {
var log = log.WithField("arch", arch)
// prime is the directory that then will be compressed to make the .snap package. // prime is the directory that then will be compressed to make the .snap package.
folderDir := filepath.Join(ctx.Config.Dist, folder) folderDir := filepath.Join(ctx.Config.Dist, folder)
primeDir := filepath.Join(folderDir, "prime") primeDir := filepath.Join(folderDir, "prime")
@ -109,7 +110,7 @@ func create(ctx *context.Context, folder, arch string, binaries []context.Binary
} }
var file = filepath.Join(primeDir, "meta", "snap.yaml") var file = filepath.Join(primeDir, "meta", "snap.yaml")
log.WithField("file", file).Info("creating snap metadata") log.WithField("file", file).Debug("creating snap metadata")
var metadata = &SnapcraftMetadata{ var metadata = &SnapcraftMetadata{
Version: ctx.Version, Version: ctx.Version,
@ -129,8 +130,10 @@ func create(ctx *context.Context, folder, arch string, binaries []context.Binary
for _, binary := range binaries { for _, binary := range binaries {
log.WithField("path", binary.Path). log.WithField("path", binary.Path).
WithField("name", binary.Name). WithField("name", binary.Name).
Info("passed binary to snapcraft") Debug("passed binary to snapcraft")
appMetadata := AppMetadata{Command: binary.Name} appMetadata := AppMetadata{
Command: binary.Name,
}
if configAppMetadata, ok := ctx.Config.Snapcraft.Apps[binary.Name]; ok { if configAppMetadata, ok := ctx.Config.Snapcraft.Apps[binary.Name]; ok {
appMetadata.Plugs = configAppMetadata.Plugs appMetadata.Plugs = configAppMetadata.Plugs
appMetadata.Daemon = configAppMetadata.Daemon appMetadata.Daemon = configAppMetadata.Daemon

View File

@ -9,6 +9,7 @@ import (
"github.com/goreleaser/goreleaser/config" "github.com/goreleaser/goreleaser/config"
"github.com/goreleaser/goreleaser/context" "github.com/goreleaser/goreleaser/context"
"github.com/goreleaser/goreleaser/pipeline"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
yaml "gopkg.in/yaml.v2" yaml "gopkg.in/yaml.v2"
) )
@ -25,7 +26,7 @@ func TestRunPipeMissingInfo(t *testing.T) {
ErrNoDescription: { ErrNoDescription: {
Summary: "dummy summary", Summary: "dummy summary",
}, },
nil: {}, // should skip instead of error pipeline.Skip("no summary nor description were provided"): {},
} { } {
t.Run(fmt.Sprintf("testing if %v happens", eerr), func(t *testing.T) { t.Run(fmt.Sprintf("testing if %v happens", eerr), func(t *testing.T) {
var assert = assert.New(t) var assert = assert.New(t)
@ -145,7 +146,14 @@ func TestNoSnapcraftInPath(t *testing.T) {
func addBinaries(t *testing.T, ctx *context.Context, name, dist string) { func addBinaries(t *testing.T, ctx *context.Context, name, dist string) {
var assert = assert.New(t) var assert = assert.New(t)
for _, plat := range []string{"linuxamd64", "linux386", "darwinamd64", "linuxarm64", "linuxarmhf"} { for _, plat := range []string{
"linuxamd64",
"linux386",
"darwinamd64",
"linuxarm64",
"linuxarm6",
"linuxwtf",
} {
var folder = name + "_" + plat var folder = name + "_" + plat
assert.NoError(os.Mkdir(filepath.Join(dist, folder), 0755)) assert.NoError(os.Mkdir(filepath.Join(dist, folder), 0755))
var binPath = filepath.Join(dist, folder, name) var binPath = filepath.Join(dist, folder, name)