1
0
mirror of https://github.com/goreleaser/goreleaser.git synced 2025-06-04 23:37:36 +02:00

refactor: --skip=item (#4272)

Laying the ground work to allow skipping more pipes without adding new
flags et al.

---------

Signed-off-by: Carlos Alexandro Becker <caarlos0@users.noreply.github.com>
This commit is contained in:
Carlos Alexandro Becker 2023-09-16 17:01:20 -03:00 committed by GitHub
parent 85c86d61cf
commit 622c426eb3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
33 changed files with 458 additions and 153 deletions

View File

@ -5,6 +5,7 @@ import (
"os" "os"
"path/filepath" "path/filepath"
"runtime" "runtime"
"sort"
"strings" "strings"
"time" "time"
@ -17,6 +18,7 @@ import (
"github.com/goreleaser/goreleaser/internal/middleware/logging" "github.com/goreleaser/goreleaser/internal/middleware/logging"
"github.com/goreleaser/goreleaser/internal/middleware/skip" "github.com/goreleaser/goreleaser/internal/middleware/skip"
"github.com/goreleaser/goreleaser/internal/pipeline" "github.com/goreleaser/goreleaser/internal/pipeline"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/pkg/config" "github.com/goreleaser/goreleaser/pkg/config"
"github.com/goreleaser/goreleaser/pkg/context" "github.com/goreleaser/goreleaser/pkg/context"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@ -28,21 +30,25 @@ type buildCmd struct {
} }
type buildOpts struct { type buildOpts struct {
config string config string
ids []string ids []string
snapshot bool snapshot bool
skipValidate bool clean bool
skipBefore bool deprecated bool
skipPostHooks bool parallelism int
clean bool timeout time.Duration
deprecated bool singleTarget bool
parallelism int output string
timeout time.Duration skips []string
singleTarget bool
output string
// Deprecated: use clean instead. // Deprecated: use clean instead.
rmDist bool rmDist bool
// Deprecated: use skip instead.
skipValidate bool
// Deprecated: use skip instead.
skipBefore bool
// Deprecated: use skip instead.
skipPostHooks bool
} }
func newBuildCmd() *buildCmd { func newBuildCmd() *buildCmd {
@ -88,7 +94,8 @@ When using ` + "`--single-target`" + `, the ` + "`GOOS`" + ` and ` + "`GOARCH`"
_ = cmd.RegisterFlagCompletionFunc("timeout", cobra.NoFileCompletions) _ = cmd.RegisterFlagCompletionFunc("timeout", cobra.NoFileCompletions)
cmd.Flags().BoolVar(&root.opts.singleTarget, "single-target", false, "Builds only for current GOOS and GOARCH, regardless of what's set in the configuration file") cmd.Flags().BoolVar(&root.opts.singleTarget, "single-target", false, "Builds only for current GOOS and GOARCH, regardless of what's set in the configuration file")
cmd.Flags().StringArrayVar(&root.opts.ids, "id", nil, "Builds only the specified build ids") cmd.Flags().StringArrayVar(&root.opts.ids, "id", nil, "Builds only the specified build ids")
_ = cmd.RegisterFlagCompletionFunc("id", func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) { _ = cmd.RegisterFlagCompletionFunc("id", func(_ *cobra.Command, _ []string, _ string) ([]string, cobra.ShellCompDirective) {
// TODO: improve this
cfg, err := loadConfig(root.opts.config) cfg, err := loadConfig(root.opts.config)
if err != nil { if err != nil {
return nil, cobra.ShellCompDirectiveNoFileComp return nil, cobra.ShellCompDirectiveNoFileComp
@ -105,6 +112,31 @@ When using ` + "`--single-target`" + `, the ` + "`GOOS`" + ` and ` + "`GOARCH`"
_ = cmd.Flags().MarkHidden("rm-dist") _ = cmd.Flags().MarkHidden("rm-dist")
_ = cmd.Flags().MarkHidden("deprecated") _ = cmd.Flags().MarkHidden("deprecated")
for _, f := range []string{
"post-hooks",
"before",
"validate",
} {
_ = cmd.Flags().MarkHidden("skip-" + f)
_ = cmd.Flags().MarkDeprecated("skip-"+f, fmt.Sprintf("please use --skip=%s instead", f))
}
cmd.Flags().StringSliceVar(
&root.opts.skips,
"skip",
nil,
fmt.Sprintf("Skip the given options (valid options are %s)", skips.Build.String()),
)
_ = cmd.RegisterFlagCompletionFunc("skip", func(_ *cobra.Command, _ []string, toComplete string) ([]string, cobra.ShellCompDirective) {
var result []string
for _, k := range skips.Build {
if strings.HasPrefix(string(k), strings.ToLower(toComplete)) {
result = append(result, string(k))
}
}
sort.Strings(result)
return result, cobra.ShellCompDirectiveDefault
})
root.cmd = cmd root.cmd = cmd
return root return root
} }
@ -150,16 +182,34 @@ func setupBuildContext(ctx *context.Context, options buildOpts) error {
} }
log.Debugf("parallelism: %v", ctx.Parallelism) log.Debugf("parallelism: %v", ctx.Parallelism)
ctx.Snapshot = options.snapshot ctx.Snapshot = options.snapshot
ctx.SkipValidate = ctx.Snapshot || options.skipValidate if err := skips.SetBuild(ctx, options.skips...); err != nil {
ctx.SkipBefore = options.skipBefore return err
ctx.SkipPostBuildHooks = options.skipPostHooks }
ctx.SkipTokenCheck = true
ctx.Clean = options.clean || options.rmDist if options.skipValidate {
skips.Set(ctx, skips.Validate)
deprecate.NoticeCustom(ctx, "-skip", "--skip-validate was deprecated in favor of --skip=validate, check {{ .URL }} for more details")
}
if options.skipBefore {
skips.Set(ctx, skips.Before)
deprecate.NoticeCustom(ctx, "-skip", "--skip-before was deprecated in favor of --skip=before, check {{ .URL }} for more details")
}
if options.skipPostHooks {
skips.Set(ctx, skips.PostBuildHooks)
deprecate.NoticeCustom(ctx, "-skip", "--skip-post-hooks was deprecated in favor of --skip=post-hooks, check {{ .URL }} for more details")
}
if options.rmDist { if options.rmDist {
deprecate.NoticeCustom(ctx, "-rm-dist", "--rm-dist was deprecated in favor of --clean, check {{ .URL }} for more details") deprecate.NoticeCustom(ctx, "-rm-dist", "--rm-dist was deprecated in favor of --clean, check {{ .URL }} for more details")
} }
if ctx.Snapshot {
skips.Set(ctx, skips.Validate)
}
ctx.SkipTokenCheck = true
ctx.Clean = options.clean || options.rmDist
if options.singleTarget { if options.singleTarget {
setupBuildSingleTarget(ctx) setupBuildSingleTarget(ctx)
} }

View File

@ -5,6 +5,7 @@ import (
"testing" "testing"
"github.com/goreleaser/goreleaser/internal/pipeline" "github.com/goreleaser/goreleaser/internal/pipeline"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/testctx" "github.com/goreleaser/goreleaser/internal/testctx"
"github.com/goreleaser/goreleaser/pkg/config" "github.com/goreleaser/goreleaser/pkg/config"
"github.com/goreleaser/goreleaser/pkg/context" "github.com/goreleaser/goreleaser/pkg/context"
@ -142,17 +143,27 @@ func TestBuildFlags(t *testing.T) {
snapshot: true, snapshot: true,
}) })
require.True(t, ctx.Snapshot) require.True(t, ctx.Snapshot)
require.True(t, ctx.SkipValidate) requireAll(t, ctx, skips.Validate)
require.True(t, ctx.SkipTokenCheck)
})
t.Run("skips (old)", func(t *testing.T) {
ctx := setup(buildOpts{
skipValidate: true,
skipPostHooks: true,
})
requireAll(t, ctx, skips.Validate, skips.PostBuildHooks)
require.True(t, ctx.SkipTokenCheck) require.True(t, ctx.SkipTokenCheck)
}) })
t.Run("skips", func(t *testing.T) { t.Run("skips", func(t *testing.T) {
ctx := setup(buildOpts{ ctx := setup(buildOpts{
skipValidate: true, skips: []string{
skipPostHooks: true, string(skips.Validate),
string(skips.PostBuildHooks),
},
}) })
require.True(t, ctx.SkipValidate) requireAll(t, ctx, skips.Validate, skips.PostBuildHooks)
require.True(t, ctx.SkipPostBuildHooks)
require.True(t, ctx.SkipTokenCheck) require.True(t, ctx.SkipTokenCheck)
}) })

16
cmd/helper_test.go Normal file
View File

@ -0,0 +1,16 @@
package cmd
import (
"testing"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/pkg/context"
"github.com/stretchr/testify/require"
)
func requireAll(tb testing.TB, ctx *context.Context, keys ...skips.Key) {
tb.Helper()
for _, key := range keys {
require.True(tb, ctx.Skips[string(key)], "expected %q to be true, but was false", key)
}
}

View File

@ -1,7 +1,10 @@
package cmd package cmd
import ( import (
"fmt"
"runtime" "runtime"
"sort"
"strings"
"time" "time"
"github.com/caarlos0/ctrlc" "github.com/caarlos0/ctrlc"
@ -12,6 +15,7 @@ import (
"github.com/goreleaser/goreleaser/internal/middleware/skip" "github.com/goreleaser/goreleaser/internal/middleware/skip"
"github.com/goreleaser/goreleaser/internal/pipe/git" "github.com/goreleaser/goreleaser/internal/pipe/git"
"github.com/goreleaser/goreleaser/internal/pipeline" "github.com/goreleaser/goreleaser/internal/pipeline"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/pkg/context" "github.com/goreleaser/goreleaser/pkg/context"
"github.com/spf13/cobra" "github.com/spf13/cobra"
) )
@ -22,31 +26,40 @@ type releaseCmd struct {
} }
type releaseOpts struct { type releaseOpts struct {
config string config string
releaseNotesFile string releaseNotesFile string
releaseNotesTmpl string releaseNotesTmpl string
releaseHeaderFile string releaseHeaderFile string
releaseHeaderTmpl string releaseHeaderTmpl string
releaseFooterFile string releaseFooterFile string
releaseFooterTmpl string releaseFooterTmpl string
autoSnapshot bool autoSnapshot bool
snapshot bool snapshot bool
failFast bool failFast bool
skipPublish bool clean bool
skipSign bool deprecated bool
skipValidate bool parallelism int
skipAnnounce bool timeout time.Duration
skipSBOMCataloging bool skips []string
skipDocker bool
skipKo bool
skipBefore bool
clean bool
deprecated bool
parallelism int
timeout time.Duration
// Deprecated: use clean instead. // Deprecated: use clean instead.
rmDist bool rmDist bool
// Deprecated: use skips instead.
skipPublish bool
// Deprecated: use skips instead.
skipSign bool
// Deprecated: use skips instead.
skipValidate bool
// Deprecated: use skips instead.
skipAnnounce bool
// Deprecated: use skips instead.
skipSBOMCataloging bool
// Deprecated: use skips instead.
skipDocker bool
// Deprecated: use skips instead.
skipKo bool
// Deprecated: use skips instead.
skipBefore bool
} }
func newReleaseCmd() *releaseCmd { func newReleaseCmd() *releaseCmd {
@ -60,7 +73,7 @@ func newReleaseCmd() *releaseCmd {
SilenceErrors: true, SilenceErrors: true,
Args: cobra.NoArgs, Args: cobra.NoArgs,
ValidArgsFunction: cobra.NoFileCompletions, ValidArgsFunction: cobra.NoFileCompletions,
RunE: timedRunE("release", func(cmd *cobra.Command, args []string) error { RunE: timedRunE("release", func(_ *cobra.Command, _ []string) error {
ctx, err := releaseProject(root.opts) ctx, err := releaseProject(root.opts)
if err != nil { if err != nil {
return err return err
@ -85,10 +98,10 @@ func newReleaseCmd() *releaseCmd {
cmd.Flags().StringVar(&root.opts.releaseFooterTmpl, "release-footer-tmpl", "", "Load custom release notes footer from a templated markdown file (overrides --release-footer)") cmd.Flags().StringVar(&root.opts.releaseFooterTmpl, "release-footer-tmpl", "", "Load custom release notes footer from a templated markdown file (overrides --release-footer)")
_ = cmd.MarkFlagFilename("release-footer-tmpl", "md", "mkd", "markdown") _ = cmd.MarkFlagFilename("release-footer-tmpl", "md", "mkd", "markdown")
cmd.Flags().BoolVar(&root.opts.autoSnapshot, "auto-snapshot", false, "Automatically sets --snapshot if the repository is dirty") cmd.Flags().BoolVar(&root.opts.autoSnapshot, "auto-snapshot", false, "Automatically sets --snapshot if the repository is dirty")
cmd.Flags().BoolVar(&root.opts.snapshot, "snapshot", false, "Generate an unversioned snapshot release, skipping all validations and without publishing any artifacts (implies --skip-publish, --skip-announce and --skip-validate)") cmd.Flags().BoolVar(&root.opts.snapshot, "snapshot", false, "Generate an unversioned snapshot release, skipping all validations and without publishing any artifacts (implies --skip=announce,publish,validate)")
cmd.Flags().BoolVar(&root.opts.failFast, "fail-fast", false, "Whether to abort the release publishing on the first error") cmd.Flags().BoolVar(&root.opts.failFast, "fail-fast", false, "Whether to abort the release publishing on the first error")
cmd.Flags().BoolVar(&root.opts.skipPublish, "skip-publish", false, "Skips publishing artifacts (implies --skip-announce)") cmd.Flags().BoolVar(&root.opts.skipPublish, "skip-publish", false, "Skips publishing artifacts (implies --skip=announce)")
cmd.Flags().BoolVar(&root.opts.skipAnnounce, "skip-announce", false, "Skips announcing releases (implies --skip-validate)") cmd.Flags().BoolVar(&root.opts.skipAnnounce, "skip-announce", false, "Skips announcing releases (implies --skip=validate)")
cmd.Flags().BoolVar(&root.opts.skipSign, "skip-sign", false, "Skips signing artifacts") cmd.Flags().BoolVar(&root.opts.skipSign, "skip-sign", false, "Skips signing artifacts")
cmd.Flags().BoolVar(&root.opts.skipSBOMCataloging, "skip-sbom", false, "Skips cataloging artifacts") cmd.Flags().BoolVar(&root.opts.skipSBOMCataloging, "skip-sbom", false, "Skips cataloging artifacts")
cmd.Flags().BoolVar(&root.opts.skipDocker, "skip-docker", false, "Skips Docker Images/Manifests builds") cmd.Flags().BoolVar(&root.opts.skipDocker, "skip-docker", false, "Skips Docker Images/Manifests builds")
@ -105,6 +118,35 @@ func newReleaseCmd() *releaseCmd {
_ = cmd.Flags().MarkHidden("deprecated") _ = cmd.Flags().MarkHidden("deprecated")
_ = cmd.Flags().MarkHidden("rm-dist") _ = cmd.Flags().MarkHidden("rm-dist")
_ = cmd.Flags().MarkDeprecated("rm-dist", "please use --clean instead") _ = cmd.Flags().MarkDeprecated("rm-dist", "please use --clean instead")
for _, f := range []string{
"publish",
"announce",
"sign",
"sbom",
"docker",
"ko",
"before",
"validate",
} {
_ = cmd.Flags().MarkHidden("skip-" + f)
_ = cmd.Flags().MarkDeprecated("skip"+f, fmt.Sprintf("please use --skip=%s instead", f))
}
cmd.Flags().StringSliceVar(
&root.opts.skips,
"skip",
nil,
fmt.Sprintf("Skip the given options (valid options are %s)", skips.Release.String()),
)
_ = cmd.RegisterFlagCompletionFunc("skip", func(_ *cobra.Command, _ []string, toComplete string) ([]string, cobra.ShellCompDirective) {
var result []string
for _, k := range skips.Release {
if strings.HasPrefix(string(k), strings.ToLower(toComplete)) {
result = append(result, string(k))
}
}
sort.Strings(result)
return result, cobra.ShellCompDirectiveDefault
})
root.cmd = cmd root.cmd = cmd
return root return root
@ -117,7 +159,9 @@ func releaseProject(options releaseOpts) (*context.Context, error) {
} }
ctx, cancel := context.NewWithTimeout(cfg, options.timeout) ctx, cancel := context.NewWithTimeout(cfg, options.timeout)
defer cancel() defer cancel()
setupReleaseContext(ctx, options) if err := setupReleaseContext(ctx, options); err != nil {
return nil, err
}
return ctx, ctrlc.Default.Run(ctx, func() error { return ctx, ctrlc.Default.Run(ctx, func() error {
for _, pipe := range pipeline.Pipeline { for _, pipe := range pipeline.Pipeline {
if err := skip.Maybe( if err := skip.Maybe(
@ -134,7 +178,7 @@ func releaseProject(options releaseOpts) (*context.Context, error) {
}) })
} }
func setupReleaseContext(ctx *context.Context, options releaseOpts) { func setupReleaseContext(ctx *context.Context, options releaseOpts) error {
ctx.Deprecated = options.deprecated // test only ctx.Deprecated = options.deprecated // test only
ctx.Parallelism = runtime.GOMAXPROCS(0) ctx.Parallelism = runtime.GOMAXPROCS(0)
if options.parallelism > 0 { if options.parallelism > 0 {
@ -149,21 +193,59 @@ func setupReleaseContext(ctx *context.Context, options releaseOpts) {
ctx.ReleaseFooterTmpl = options.releaseFooterTmpl ctx.ReleaseFooterTmpl = options.releaseFooterTmpl
ctx.Snapshot = options.snapshot ctx.Snapshot = options.snapshot
ctx.FailFast = options.failFast ctx.FailFast = options.failFast
ctx.Clean = options.clean || options.rmDist
if options.autoSnapshot && git.CheckDirty(ctx) != nil { if options.autoSnapshot && git.CheckDirty(ctx) != nil {
log.Info("git repository is dirty and --auto-snapshot is set, implying --snapshot") log.Info("git repository is dirty and --auto-snapshot is set, implying --snapshot")
ctx.Snapshot = true ctx.Snapshot = true
} }
ctx.SkipPublish = ctx.Snapshot || options.skipPublish
ctx.SkipAnnounce = ctx.Snapshot || options.skipPublish || options.skipAnnounce
ctx.SkipValidate = ctx.Snapshot || options.skipValidate
ctx.SkipSign = options.skipSign
ctx.SkipSBOMCataloging = options.skipSBOMCataloging
ctx.SkipDocker = options.skipDocker
ctx.SkipKo = options.skipKo
ctx.SkipBefore = options.skipBefore
ctx.Clean = options.clean || options.rmDist
if err := skips.SetRelease(ctx, options.skips...); err != nil {
return err
}
// wire deprecated options
// XXX: remove soon
if options.skipPublish {
skips.Set(ctx, skips.Publish)
deprecate.NoticeCustom(ctx, "-skip", "--skip-publish was deprecated in favor of --skip=publish, check {{ .URL }} for more details")
}
if options.skipSign {
skips.Set(ctx, skips.Sign)
deprecate.NoticeCustom(ctx, "-skip", "--skip-sign was deprecated in favor of --skip=sign, check {{ .URL }} for more details")
}
if options.skipValidate {
skips.Set(ctx, skips.Validate)
deprecate.NoticeCustom(ctx, "-skip", "--skip-validate was deprecated in favor of --skip=validate, check {{ .URL }} for more details")
}
if options.skipAnnounce {
skips.Set(ctx, skips.Announce)
deprecate.NoticeCustom(ctx, "-skip", "--skip-announce was deprecated in favor of --skip=announce, check {{ .URL }} for more details")
}
if options.skipSBOMCataloging {
skips.Set(ctx, skips.SBOM)
deprecate.NoticeCustom(ctx, "-skip", "--skip-sbom was deprecated in favor of --skip=sbom, check {{ .URL }} for more details")
}
if options.skipDocker {
skips.Set(ctx, skips.Docker)
deprecate.NoticeCustom(ctx, "-skip", "--skip-docker was deprecated in favor of --skip=docker, check {{ .URL }} for more details")
}
if options.skipKo {
skips.Set(ctx, skips.Ko)
deprecate.NoticeCustom(ctx, "-skip", "--skip-ko was deprecated in favor of --skip=ko, check {{ .URL }} for more details")
}
if options.skipBefore {
skips.Set(ctx, skips.Before)
deprecate.NoticeCustom(ctx, "-skip", "--skip-before was deprecated in favor of --skip=before, check {{ .URL }} for more details")
}
if options.rmDist { if options.rmDist {
deprecate.NoticeCustom(ctx, "-rm-dist", "--rm-dist was deprecated in favor of --clean, check {{ .URL }} for more details") deprecate.NoticeCustom(ctx, "-rm-dist", "--rm-dist was deprecated in favor of --clean, check {{ .URL }} for more details")
} }
if ctx.Snapshot {
skips.Set(ctx, skips.Publish, skips.Announce, skips.Validate)
}
if skips.Any(ctx, skips.Publish) {
skips.Set(ctx, skips.Announce)
}
return nil
} }

View File

@ -4,6 +4,7 @@ import (
"path/filepath" "path/filepath"
"testing" "testing"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/testctx" "github.com/goreleaser/goreleaser/internal/testctx"
"github.com/goreleaser/goreleaser/pkg/context" "github.com/goreleaser/goreleaser/pkg/context"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
@ -66,21 +67,29 @@ func TestReleaseFlags(t *testing.T) {
snapshot: true, snapshot: true,
}) })
require.True(t, ctx.Snapshot) require.True(t, ctx.Snapshot)
require.True(t, ctx.SkipPublish) requireAll(t, ctx, skips.Publish, skips.Validate, skips.Announce)
require.True(t, ctx.SkipValidate)
require.True(t, ctx.SkipAnnounce)
}) })
t.Run("skips", func(t *testing.T) { t.Run("skips (old)", func(t *testing.T) {
ctx := setup(t, releaseOpts{ ctx := setup(t, releaseOpts{
skipPublish: true, skipPublish: true,
skipSign: true, skipSign: true,
skipValidate: true, skipValidate: true,
}) })
require.True(t, ctx.SkipSign)
require.True(t, ctx.SkipPublish) requireAll(t, ctx, skips.Sign, skips.Publish, skips.Validate, skips.Announce)
require.True(t, ctx.SkipValidate) })
require.True(t, ctx.SkipAnnounce)
t.Run("skips", func(t *testing.T) {
ctx := setup(t, releaseOpts{
skips: []string{
string(skips.Publish),
string(skips.Sign),
string(skips.Validate),
},
})
requireAll(t, ctx, skips.Sign, skips.Publish, skips.Validate, skips.Announce)
}) })
t.Run("parallelism", func(t *testing.T) { t.Run("parallelism", func(t *testing.T) {

View File

@ -19,6 +19,7 @@ import (
"github.com/goreleaser/goreleaser/internal/pipe/telegram" "github.com/goreleaser/goreleaser/internal/pipe/telegram"
"github.com/goreleaser/goreleaser/internal/pipe/twitter" "github.com/goreleaser/goreleaser/internal/pipe/twitter"
"github.com/goreleaser/goreleaser/internal/pipe/webhook" "github.com/goreleaser/goreleaser/internal/pipe/webhook"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/tmpl" "github.com/goreleaser/goreleaser/internal/tmpl"
"github.com/goreleaser/goreleaser/pkg/context" "github.com/goreleaser/goreleaser/pkg/context"
) )
@ -52,7 +53,7 @@ type Pipe struct{}
func (Pipe) String() string { return "announcing" } func (Pipe) String() string { return "announcing" }
func (Pipe) Skip(ctx *context.Context) (bool, error) { func (Pipe) Skip(ctx *context.Context) (bool, error) {
if ctx.SkipAnnounce { if skips.Any(ctx, skips.Announce) {
return true, nil return true, nil
} }
return tmpl.New(ctx).Bool(ctx.Config.Announce.Skip) return tmpl.New(ctx).Bool(ctx.Config.Announce.Skip)

View File

@ -4,6 +4,7 @@ import (
"errors" "errors"
"testing" "testing"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/testctx" "github.com/goreleaser/goreleaser/internal/testctx"
"github.com/goreleaser/goreleaser/pkg/config" "github.com/goreleaser/goreleaser/pkg/config"
"github.com/hashicorp/go-multierror" "github.com/hashicorp/go-multierror"
@ -40,7 +41,7 @@ func TestAnnounceAllDisabled(t *testing.T) {
func TestSkip(t *testing.T) { func TestSkip(t *testing.T) {
t.Run("skip", func(t *testing.T) { t.Run("skip", func(t *testing.T) {
ctx := testctx.New(testctx.SkipAnnounce) ctx := testctx.New(testctx.Skip(skips.Announce))
b, err := Pipe{}.Skip(ctx) b, err := Pipe{}.Skip(ctx)
require.NoError(t, err) require.NoError(t, err)
require.True(t, b) require.True(t, b)

View File

@ -11,6 +11,7 @@ import (
"github.com/caarlos0/log" "github.com/caarlos0/log"
"github.com/goreleaser/goreleaser/internal/gio" "github.com/goreleaser/goreleaser/internal/gio"
"github.com/goreleaser/goreleaser/internal/logext" "github.com/goreleaser/goreleaser/internal/logext"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/tmpl" "github.com/goreleaser/goreleaser/internal/tmpl"
"github.com/goreleaser/goreleaser/pkg/context" "github.com/goreleaser/goreleaser/pkg/context"
) )
@ -19,8 +20,9 @@ import (
type Pipe struct{} type Pipe struct{}
func (Pipe) String() string { return "running before hooks" } func (Pipe) String() string { return "running before hooks" }
func (Pipe) Skip(ctx *context.Context) bool { func (Pipe) Skip(ctx *context.Context) bool {
return len(ctx.Config.Before.Hooks) == 0 || ctx.SkipBefore return len(ctx.Config.Before.Hooks) == 0 || skips.Any(ctx, skips.Before)
} }
// Run executes the hooks. // Run executes the hooks.

View File

@ -6,6 +6,7 @@ import (
"testing" "testing"
"github.com/caarlos0/log" "github.com/caarlos0/log"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/testctx" "github.com/goreleaser/goreleaser/internal/testctx"
"github.com/goreleaser/goreleaser/internal/testlib" "github.com/goreleaser/goreleaser/internal/testlib"
"github.com/goreleaser/goreleaser/pkg/config" "github.com/goreleaser/goreleaser/pkg/config"
@ -103,8 +104,7 @@ func TestSkip(t *testing.T) {
Before: config.Before{ Before: config.Before{
Hooks: []string{""}, Hooks: []string{""},
}, },
}) }, testctx.Skip(skips.Before))
ctx.SkipBefore = true
require.True(t, Pipe{}.Skip(ctx)) require.True(t, Pipe{}.Skip(ctx))
}) })

View File

@ -15,6 +15,7 @@ import (
"github.com/goreleaser/goreleaser/internal/ids" "github.com/goreleaser/goreleaser/internal/ids"
"github.com/goreleaser/goreleaser/internal/semerrgroup" "github.com/goreleaser/goreleaser/internal/semerrgroup"
"github.com/goreleaser/goreleaser/internal/shell" "github.com/goreleaser/goreleaser/internal/shell"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/tmpl" "github.com/goreleaser/goreleaser/internal/tmpl"
builders "github.com/goreleaser/goreleaser/pkg/build" builders "github.com/goreleaser/goreleaser/pkg/build"
"github.com/goreleaser/goreleaser/pkg/config" "github.com/goreleaser/goreleaser/pkg/config"
@ -102,7 +103,7 @@ func runPipeOnBuild(ctx *context.Context, g semerrgroup.Group, build config.Buil
if err := doBuild(ctx, build, *opts); err != nil { if err := doBuild(ctx, build, *opts); err != nil {
return err return err
} }
if !ctx.SkipPostBuildHooks { if !skips.Any(ctx, skips.PostBuildHooks) {
if err := runHook(ctx, *opts, build.Env, build.Hooks.Post); err != nil { if err := runHook(ctx, *opts, build.Env, build.Hooks.Post); err != nil {
return fmt.Errorf("post hook failed: %w", err) return fmt.Errorf("post hook failed: %w", err)
} }

View File

@ -16,6 +16,7 @@ import (
"github.com/goreleaser/goreleaser/internal/ids" "github.com/goreleaser/goreleaser/internal/ids"
"github.com/goreleaser/goreleaser/internal/pipe" "github.com/goreleaser/goreleaser/internal/pipe"
"github.com/goreleaser/goreleaser/internal/semerrgroup" "github.com/goreleaser/goreleaser/internal/semerrgroup"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/tmpl" "github.com/goreleaser/goreleaser/internal/tmpl"
"github.com/goreleaser/goreleaser/pkg/config" "github.com/goreleaser/goreleaser/pkg/config"
"github.com/goreleaser/goreleaser/pkg/context" "github.com/goreleaser/goreleaser/pkg/context"
@ -31,8 +32,11 @@ const (
// Pipe for docker. // Pipe for docker.
type Pipe struct{} type Pipe struct{}
func (Pipe) String() string { return "docker images" } func (Pipe) String() string { return "docker images" }
func (Pipe) Skip(ctx *context.Context) bool { return len(ctx.Config.Dockers) == 0 || ctx.SkipDocker }
func (Pipe) Skip(ctx *context.Context) bool {
return len(ctx.Config.Dockers) == 0 || skips.Any(ctx, skips.Docker)
}
func (Pipe) Dependencies(ctx *context.Context) []string { func (Pipe) Dependencies(ctx *context.Context) []string {
var cmds []string var cmds []string

View File

@ -10,6 +10,7 @@ import (
"github.com/goreleaser/goreleaser/internal/artifact" "github.com/goreleaser/goreleaser/internal/artifact"
"github.com/goreleaser/goreleaser/internal/pipe" "github.com/goreleaser/goreleaser/internal/pipe"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/testctx" "github.com/goreleaser/goreleaser/internal/testctx"
"github.com/goreleaser/goreleaser/internal/testlib" "github.com/goreleaser/goreleaser/internal/testlib"
"github.com/goreleaser/goreleaser/pkg/config" "github.com/goreleaser/goreleaser/pkg/config"
@ -1343,8 +1344,7 @@ func TestSkip(t *testing.T) {
t.Run("skip docker", func(t *testing.T) { t.Run("skip docker", func(t *testing.T) {
ctx := testctx.NewWithCfg(config.Project{ ctx := testctx.NewWithCfg(config.Project{
Dockers: []config.Docker{{}}, Dockers: []config.Docker{{}},
}) }, testctx.Skip(skips.Docker))
ctx.SkipDocker = true
require.True(t, Pipe{}.Skip(ctx)) require.True(t, Pipe{}.Skip(ctx))
}) })
@ -1364,7 +1364,7 @@ func TestSkip(t *testing.T) {
t.Run("skip docker", func(t *testing.T) { t.Run("skip docker", func(t *testing.T) {
ctx := testctx.NewWithCfg(config.Project{ ctx := testctx.NewWithCfg(config.Project{
DockerManifests: []config.DockerManifest{{}}, DockerManifests: []config.DockerManifest{{}},
}, testctx.SkipDocker) }, testctx.Skip(skips.Docker))
require.True(t, ManifestPipe{}.Skip(ctx)) require.True(t, ManifestPipe{}.Skip(ctx))
}) })

View File

@ -10,6 +10,7 @@ import (
"github.com/goreleaser/goreleaser/internal/ids" "github.com/goreleaser/goreleaser/internal/ids"
"github.com/goreleaser/goreleaser/internal/pipe" "github.com/goreleaser/goreleaser/internal/pipe"
"github.com/goreleaser/goreleaser/internal/semerrgroup" "github.com/goreleaser/goreleaser/internal/semerrgroup"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/tmpl" "github.com/goreleaser/goreleaser/internal/tmpl"
"github.com/goreleaser/goreleaser/pkg/config" "github.com/goreleaser/goreleaser/pkg/config"
"github.com/goreleaser/goreleaser/pkg/context" "github.com/goreleaser/goreleaser/pkg/context"
@ -20,8 +21,9 @@ import (
type ManifestPipe struct{} type ManifestPipe struct{}
func (ManifestPipe) String() string { return "docker manifests" } func (ManifestPipe) String() string { return "docker manifests" }
func (ManifestPipe) Skip(ctx *context.Context) bool { func (ManifestPipe) Skip(ctx *context.Context) bool {
return len(ctx.Config.DockerManifests) == 0 || ctx.SkipDocker return len(ctx.Config.DockerManifests) == 0 || skips.Any(ctx, skips.Docker)
} }
func (ManifestPipe) Dependencies(ctx *context.Context) []string { func (ManifestPipe) Dependencies(ctx *context.Context) []string {

View File

@ -12,6 +12,7 @@ import (
"github.com/caarlos0/log" "github.com/caarlos0/log"
"github.com/goreleaser/goreleaser/internal/logext" "github.com/goreleaser/goreleaser/internal/logext"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/tmpl" "github.com/goreleaser/goreleaser/internal/tmpl"
"github.com/goreleaser/goreleaser/pkg/context" "github.com/goreleaser/goreleaser/pkg/context"
homedir "github.com/mitchellh/go-homedir" homedir "github.com/mitchellh/go-homedir"
@ -132,7 +133,7 @@ func (Pipe) Run(ctx *context.Context) error {
} }
func checkErrors(ctx *context.Context, noTokens, noTokenErrs bool, gitlabTokenErr, githubTokenErr, giteaTokenErr error) error { func checkErrors(ctx *context.Context, noTokens, noTokenErrs bool, gitlabTokenErr, githubTokenErr, giteaTokenErr error) error {
if ctx.SkipTokenCheck || ctx.SkipPublish { if ctx.SkipTokenCheck || skips.Any(ctx, skips.Publish) {
return nil return nil
} }
if b, err := tmpl.New(ctx).Bool(ctx.Config.Release.Disable); err != nil || b { if b, err := tmpl.New(ctx).Bool(ctx.Config.Release.Disable); err != nil || b {

View File

@ -6,6 +6,7 @@ import (
"syscall" "syscall"
"testing" "testing"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/testctx" "github.com/goreleaser/goreleaser/internal/testctx"
"github.com/goreleaser/goreleaser/internal/testlib" "github.com/goreleaser/goreleaser/internal/testlib"
"github.com/goreleaser/goreleaser/pkg/config" "github.com/goreleaser/goreleaser/pkg/config"
@ -220,7 +221,7 @@ func TestEmptyGiteaEnvFile(t *testing.T) {
} }
func TestInvalidEnvChecksSkipped(t *testing.T) { func TestInvalidEnvChecksSkipped(t *testing.T) {
ctx := testctx.New(testctx.SkipPublish) ctx := testctx.New(testctx.Skip(skips.Publish))
require.NoError(t, Pipe{}.Run(ctx)) require.NoError(t, Pipe{}.Run(ctx))
} }

View File

@ -13,6 +13,7 @@ import (
"github.com/caarlos0/log" "github.com/caarlos0/log"
"github.com/goreleaser/goreleaser/internal/git" "github.com/goreleaser/goreleaser/internal/git"
"github.com/goreleaser/goreleaser/internal/pipe" "github.com/goreleaser/goreleaser/internal/pipe"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/tmpl" "github.com/goreleaser/goreleaser/internal/tmpl"
"github.com/goreleaser/goreleaser/pkg/context" "github.com/goreleaser/goreleaser/pkg/context"
) )
@ -191,7 +192,7 @@ func validate(ctx *context.Context) error {
if ctx.Snapshot { if ctx.Snapshot {
return pipe.ErrSnapshotEnabled return pipe.ErrSnapshotEnabled
} }
if ctx.SkipValidate { if skips.Any(ctx, skips.Validate) {
return pipe.ErrSkipValidateEnabled return pipe.ErrSkipValidateEnabled
} }
if _, err := os.Stat(".git/shallow"); err == nil { if _, err := os.Stat(".git/shallow"); err == nil {

View File

@ -6,6 +6,7 @@ import (
"path/filepath" "path/filepath"
"testing" "testing"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/testctx" "github.com/goreleaser/goreleaser/internal/testctx"
"github.com/goreleaser/goreleaser/internal/testlib" "github.com/goreleaser/goreleaser/internal/testlib"
"github.com/goreleaser/goreleaser/pkg/config" "github.com/goreleaser/goreleaser/pkg/config"
@ -112,7 +113,7 @@ func TestDirty(t *testing.T) {
require.Contains(t, err.Error(), "git is in a dirty state") require.Contains(t, err.Error(), "git is in a dirty state")
}) })
t.Run("skip validate is set", func(t *testing.T) { t.Run("skip validate is set", func(t *testing.T) {
ctx := testctx.New(testctx.SkipValidate) ctx := testctx.New(testctx.Skip(skips.Validate))
testlib.AssertSkipped(t, Pipe{}.Run(ctx)) testlib.AssertSkipped(t, Pipe{}.Run(ctx))
require.True(t, ctx.Git.Dirty) require.True(t, ctx.Git.Dirty)
}) })
@ -162,7 +163,7 @@ func TestShallowClone(t *testing.T) {
require.NoError(t, Pipe{}.Run(testctx.New())) require.NoError(t, Pipe{}.Run(testctx.New()))
}) })
t.Run("skip validate is set", func(t *testing.T) { t.Run("skip validate is set", func(t *testing.T) {
ctx := testctx.New(testctx.SkipValidate) ctx := testctx.New(testctx.Skip(skips.Validate))
testlib.AssertSkipped(t, Pipe{}.Run(ctx)) testlib.AssertSkipped(t, Pipe{}.Run(ctx))
}) })
t.Run("snapshot", func(t *testing.T) { t.Run("snapshot", func(t *testing.T) {

View File

@ -27,6 +27,7 @@ import (
"github.com/goreleaser/goreleaser/internal/artifact" "github.com/goreleaser/goreleaser/internal/artifact"
"github.com/goreleaser/goreleaser/internal/ids" "github.com/goreleaser/goreleaser/internal/ids"
"github.com/goreleaser/goreleaser/internal/semerrgroup" "github.com/goreleaser/goreleaser/internal/semerrgroup"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/tmpl" "github.com/goreleaser/goreleaser/internal/tmpl"
"github.com/goreleaser/goreleaser/pkg/config" "github.com/goreleaser/goreleaser/pkg/config"
"github.com/goreleaser/goreleaser/pkg/context" "github.com/goreleaser/goreleaser/pkg/context"
@ -55,7 +56,7 @@ type Pipe struct{}
func (Pipe) String() string { return "ko" } func (Pipe) String() string { return "ko" }
func (Pipe) Skip(ctx *context.Context) bool { func (Pipe) Skip(ctx *context.Context) bool {
return ctx.SkipKo || len(ctx.Config.Kos) == 0 return skips.Any(ctx, skips.Ko) || len(ctx.Config.Kos) == 0
} }
// Default sets the Pipes defaults. // Default sets the Pipes defaults.

View File

@ -12,6 +12,7 @@ import (
"github.com/google/go-containerregistry/pkg/name" "github.com/google/go-containerregistry/pkg/name"
"github.com/google/go-containerregistry/pkg/v1/remote" "github.com/google/go-containerregistry/pkg/v1/remote"
"github.com/goreleaser/goreleaser/internal/artifact" "github.com/goreleaser/goreleaser/internal/artifact"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/testctx" "github.com/goreleaser/goreleaser/internal/testctx"
"github.com/goreleaser/goreleaser/internal/testlib" "github.com/goreleaser/goreleaser/internal/testlib"
"github.com/goreleaser/goreleaser/pkg/config" "github.com/goreleaser/goreleaser/pkg/config"
@ -88,8 +89,7 @@ func TestSkip(t *testing.T) {
t.Run("skip ko set", func(t *testing.T) { t.Run("skip ko set", func(t *testing.T) {
ctx := testctx.NewWithCfg(config.Project{ ctx := testctx.NewWithCfg(config.Project{
Kos: []config.Ko{{}}, Kos: []config.Ko{{}},
}) }, testctx.Skip(skips.Ko))
ctx.SkipKo = true
require.True(t, Pipe{}.Skip(ctx)) require.True(t, Pipe{}.Skip(ctx))
}) })
t.Run("skip no kos", func(t *testing.T) { t.Run("skip no kos", func(t *testing.T) {

View File

@ -15,6 +15,7 @@ import (
"github.com/goreleaser/goreleaser/internal/ids" "github.com/goreleaser/goreleaser/internal/ids"
"github.com/goreleaser/goreleaser/internal/pipe" "github.com/goreleaser/goreleaser/internal/pipe"
"github.com/goreleaser/goreleaser/internal/semerrgroup" "github.com/goreleaser/goreleaser/internal/semerrgroup"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/tmpl" "github.com/goreleaser/goreleaser/internal/tmpl"
"github.com/goreleaser/goreleaser/pkg/config" "github.com/goreleaser/goreleaser/pkg/config"
"github.com/goreleaser/goreleaser/pkg/context" "github.com/goreleaser/goreleaser/pkg/context"
@ -364,7 +365,7 @@ func create(ctx *context.Context, fpm config.NFPM, format string, binaries []*ar
}, },
} }
if ctx.SkipSign { if skips.Any(ctx, skips.Sign) {
info.APK.Signature = nfpm.APKSignature{} info.APK.Signature = nfpm.APKSignature{}
info.RPM.Signature = nfpm.RPMSignature{} info.RPM.Signature = nfpm.RPMSignature{}
info.Deb.Signature = nfpm.DebSignature{} info.Deb.Signature = nfpm.DebSignature{}

View File

@ -6,6 +6,7 @@ import (
"testing" "testing"
"github.com/goreleaser/goreleaser/internal/artifact" "github.com/goreleaser/goreleaser/internal/artifact"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/testctx" "github.com/goreleaser/goreleaser/internal/testctx"
"github.com/goreleaser/goreleaser/internal/testlib" "github.com/goreleaser/goreleaser/internal/testlib"
"github.com/goreleaser/goreleaser/pkg/config" "github.com/goreleaser/goreleaser/pkg/config"
@ -1327,7 +1328,7 @@ func TestSkipSign(t *testing.T) {
}) })
t.Run("skip sign set", func(t *testing.T) { t.Run("skip sign set", func(t *testing.T) {
ctx.SkipSign = true skips.Set(ctx, skips.Sign)
require.NoError(t, Pipe{}.Run(ctx)) require.NoError(t, Pipe{}.Run(ctx))
}) })
} }

View File

@ -24,6 +24,7 @@ import (
"github.com/goreleaser/goreleaser/internal/pipe/snapcraft" "github.com/goreleaser/goreleaser/internal/pipe/snapcraft"
"github.com/goreleaser/goreleaser/internal/pipe/upload" "github.com/goreleaser/goreleaser/internal/pipe/upload"
"github.com/goreleaser/goreleaser/internal/pipe/winget" "github.com/goreleaser/goreleaser/internal/pipe/winget"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/pkg/context" "github.com/goreleaser/goreleaser/pkg/context"
) )
@ -69,7 +70,7 @@ type Pipe struct {
} }
func (Pipe) String() string { return "publishing" } func (Pipe) String() string { return "publishing" }
func (Pipe) Skip(ctx *context.Context) bool { return ctx.SkipPublish } func (Pipe) Skip(ctx *context.Context) bool { return skips.Any(ctx, skips.Publish) }
func (p Pipe) Run(ctx *context.Context) error { func (p Pipe) Run(ctx *context.Context) error {
memo := errhandler.Memo{} memo := errhandler.Memo{}

View File

@ -5,6 +5,7 @@ import (
"testing" "testing"
"github.com/goreleaser/goreleaser/internal/pipe" "github.com/goreleaser/goreleaser/internal/pipe"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/testctx" "github.com/goreleaser/goreleaser/internal/testctx"
"github.com/goreleaser/goreleaser/pkg/config" "github.com/goreleaser/goreleaser/pkg/config"
"github.com/goreleaser/goreleaser/pkg/context" "github.com/goreleaser/goreleaser/pkg/context"
@ -72,7 +73,7 @@ func TestPublishError(t *testing.T) {
func TestSkip(t *testing.T) { func TestSkip(t *testing.T) {
t.Run("skip", func(t *testing.T) { t.Run("skip", func(t *testing.T) {
ctx := testctx.New(testctx.SkipPublish) ctx := testctx.New(testctx.Skip(skips.Publish))
require.True(t, Pipe{}.Skip(ctx)) require.True(t, Pipe{}.Skip(ctx))
}) })

View File

@ -15,6 +15,7 @@ import (
"github.com/goreleaser/goreleaser/internal/ids" "github.com/goreleaser/goreleaser/internal/ids"
"github.com/goreleaser/goreleaser/internal/logext" "github.com/goreleaser/goreleaser/internal/logext"
"github.com/goreleaser/goreleaser/internal/semerrgroup" "github.com/goreleaser/goreleaser/internal/semerrgroup"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/tmpl" "github.com/goreleaser/goreleaser/internal/tmpl"
"github.com/goreleaser/goreleaser/pkg/config" "github.com/goreleaser/goreleaser/pkg/config"
"github.com/goreleaser/goreleaser/pkg/context" "github.com/goreleaser/goreleaser/pkg/context"
@ -28,7 +29,7 @@ type Pipe struct{}
func (Pipe) String() string { return "cataloging artifacts" } func (Pipe) String() string { return "cataloging artifacts" }
func (Pipe) Skip(ctx *context.Context) bool { func (Pipe) Skip(ctx *context.Context) bool {
return ctx.SkipSBOMCataloging || len(ctx.Config.SBOMs) == 0 return skips.Any(ctx, skips.SBOM) || len(ctx.Config.SBOMs) == 0
} }
func (Pipe) Dependencies(ctx *context.Context) []string { func (Pipe) Dependencies(ctx *context.Context) []string {

View File

@ -9,6 +9,7 @@ import (
"testing" "testing"
"github.com/goreleaser/goreleaser/internal/artifact" "github.com/goreleaser/goreleaser/internal/artifact"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/testctx" "github.com/goreleaser/goreleaser/internal/testctx"
"github.com/goreleaser/goreleaser/internal/testlib" "github.com/goreleaser/goreleaser/internal/testlib"
"github.com/goreleaser/goreleaser/internal/tmpl" "github.com/goreleaser/goreleaser/internal/tmpl"
@ -199,8 +200,7 @@ func TestSkipCataloging(t *testing.T) {
Artifacts: "all", Artifacts: "all",
}, },
}, },
}) }, testctx.Skip(skips.SBOM))
ctx.SkipSBOMCataloging = true
require.True(t, Pipe{}.Skip(ctx)) require.True(t, Pipe{}.Skip(ctx))
}) })

View File

@ -17,6 +17,7 @@ import (
"github.com/goreleaser/goreleaser/internal/logext" "github.com/goreleaser/goreleaser/internal/logext"
"github.com/goreleaser/goreleaser/internal/pipe" "github.com/goreleaser/goreleaser/internal/pipe"
"github.com/goreleaser/goreleaser/internal/semerrgroup" "github.com/goreleaser/goreleaser/internal/semerrgroup"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/tmpl" "github.com/goreleaser/goreleaser/internal/tmpl"
"github.com/goreleaser/goreleaser/pkg/config" "github.com/goreleaser/goreleaser/pkg/config"
"github.com/goreleaser/goreleaser/pkg/context" "github.com/goreleaser/goreleaser/pkg/context"
@ -25,8 +26,11 @@ import (
// Pipe that signs common artifacts. // Pipe that signs common artifacts.
type Pipe struct{} type Pipe struct{}
func (Pipe) String() string { return "signing artifacts" } func (Pipe) String() string { return "signing artifacts" }
func (Pipe) Skip(ctx *context.Context) bool { return ctx.SkipSign || len(ctx.Config.Signs) == 0 }
func (Pipe) Skip(ctx *context.Context) bool {
return skips.Any(ctx, skips.Sign) || len(ctx.Config.Signs) == 0
}
func (Pipe) Dependencies(ctx *context.Context) []string { func (Pipe) Dependencies(ctx *context.Context) []string {
var cmds []string var cmds []string

View File

@ -7,6 +7,7 @@ import (
"github.com/goreleaser/goreleaser/internal/ids" "github.com/goreleaser/goreleaser/internal/ids"
"github.com/goreleaser/goreleaser/internal/pipe" "github.com/goreleaser/goreleaser/internal/pipe"
"github.com/goreleaser/goreleaser/internal/semerrgroup" "github.com/goreleaser/goreleaser/internal/semerrgroup"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/pkg/context" "github.com/goreleaser/goreleaser/pkg/context"
) )
@ -16,7 +17,7 @@ type DockerPipe struct{}
func (DockerPipe) String() string { return "signing docker images" } func (DockerPipe) String() string { return "signing docker images" }
func (DockerPipe) Skip(ctx *context.Context) bool { func (DockerPipe) Skip(ctx *context.Context) bool {
return ctx.SkipSign || len(ctx.Config.DockerSigns) == 0 return skips.Any(ctx, skips.Sign) || len(ctx.Config.DockerSigns) == 0
} }
func (DockerPipe) Dependencies(ctx *context.Context) []string { func (DockerPipe) Dependencies(ctx *context.Context) []string {

View File

@ -8,6 +8,7 @@ import (
"github.com/goreleaser/goreleaser/internal/artifact" "github.com/goreleaser/goreleaser/internal/artifact"
"github.com/goreleaser/goreleaser/internal/gio" "github.com/goreleaser/goreleaser/internal/gio"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/testctx" "github.com/goreleaser/goreleaser/internal/testctx"
"github.com/goreleaser/goreleaser/internal/testlib" "github.com/goreleaser/goreleaser/internal/testlib"
"github.com/goreleaser/goreleaser/pkg/config" "github.com/goreleaser/goreleaser/pkg/config"
@ -215,7 +216,7 @@ func TestDockerSkip(t *testing.T) {
}) })
t.Run("skip sign", func(t *testing.T) { t.Run("skip sign", func(t *testing.T) {
ctx := testctx.New(testctx.SkipSign) ctx := testctx.New(testctx.Skip(skips.Sign))
require.True(t, DockerPipe{}.Skip(ctx)) require.True(t, DockerPipe{}.Skip(ctx))
}) })

View File

@ -16,6 +16,7 @@ import (
"github.com/goreleaser/goreleaser/internal/artifact" "github.com/goreleaser/goreleaser/internal/artifact"
"github.com/goreleaser/goreleaser/internal/git" "github.com/goreleaser/goreleaser/internal/git"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/internal/testctx" "github.com/goreleaser/goreleaser/internal/testctx"
"github.com/goreleaser/goreleaser/internal/testlib" "github.com/goreleaser/goreleaser/internal/testlib"
"github.com/goreleaser/goreleaser/internal/tmpl" "github.com/goreleaser/goreleaser/internal/tmpl"
@ -760,7 +761,7 @@ func TestSkip(t *testing.T) {
}) })
t.Run("skip sign", func(t *testing.T) { t.Run("skip sign", func(t *testing.T) {
ctx := testctx.New(testctx.SkipSign) ctx := testctx.New(testctx.Skip(skips.Sign))
require.True(t, Pipe{}.Skip(ctx)) require.True(t, Pipe{}.Skip(ctx))
}) })

83
internal/skips/skips.go Normal file
View File

@ -0,0 +1,83 @@
package skips
import (
"fmt"
"strings"
"github.com/goreleaser/goreleaser/pkg/context"
"golang.org/x/exp/slices"
)
type Key string
const (
PostBuildHooks Key = "post-hooks"
Publish Key = "publish"
Announce Key = "announce"
Sign Key = "sign"
Validate Key = "validate"
SBOM Key = "sbom"
Ko Key = "ko"
Docker Key = "docker"
Before Key = "before"
)
func Any(ctx *context.Context, keys ...Key) bool {
for _, key := range keys {
if ctx.Skips[string(key)] {
return true
}
}
return false
}
func Set(ctx *context.Context, keys ...Key) {
for _, key := range keys {
ctx.Skips[string(key)] = true
}
}
var (
SetRelease = set(Release)
SetBuild = set(Build)
)
func set(allowed Keys) func(ctx *context.Context, keys ...string) error {
return func(ctx *context.Context, keys ...string) error {
for _, key := range keys {
if !slices.Contains(allowed, Key(key)) {
return fmt.Errorf("--skip=%s is not allowed. Valid options for skip are [%s]", key, allowed)
}
ctx.Skips[key] = true
}
return nil
}
}
type Keys []Key
func (keys Keys) String() string {
ss := make([]string, len(keys))
for i, key := range keys {
ss[i] = string(key)
}
slices.Sort(ss)
return strings.Join(ss, ", ")
}
var Release = Keys{
Publish,
Announce,
Sign,
Validate,
SBOM,
Ko,
Docker,
Before,
}
var Build = Keys{
PostBuildHooks,
Validate,
Before,
}

View File

@ -4,6 +4,7 @@ package testctx
import ( import (
"time" "time"
"github.com/goreleaser/goreleaser/internal/skips"
"github.com/goreleaser/goreleaser/pkg/config" "github.com/goreleaser/goreleaser/pkg/config"
"github.com/goreleaser/goreleaser/pkg/context" "github.com/goreleaser/goreleaser/pkg/context"
) )
@ -105,30 +106,16 @@ func WithFakeRuntime(ctx *context.Context) {
} }
} }
func SkipPublish(ctx *context.Context) { func Skip(keys ...skips.Key) Opt {
ctx.SkipPublish = true return func(ctx *context.Context) {
} skips.Set(ctx, keys...)
}
func SkipAnnounce(ctx *context.Context) {
ctx.SkipAnnounce = true
}
func SkipDocker(ctx *context.Context) {
ctx.SkipDocker = true
}
func SkipValidate(ctx *context.Context) {
ctx.SkipValidate = true
} }
func Snapshot(ctx *context.Context) { func Snapshot(ctx *context.Context) {
ctx.Snapshot = true ctx.Snapshot = true
} }
func SkipSign(ctx *context.Context) {
ctx.SkipSign = true
}
func NewWithCfg(c config.Project, opts ...Opt) *context.Context { func NewWithCfg(c config.Project, opts ...Opt) *context.Context {
ctx := context.New(c) ctx := context.New(c)
for _, opt := range opts { for _, opt := range opts {

View File

@ -72,41 +72,33 @@ const (
// Context carries along some data through the pipes. // Context carries along some data through the pipes.
type Context struct { type Context struct {
stdctx.Context stdctx.Context
Config config.Project Config config.Project
Env Env Env Env
SkipTokenCheck bool Token string
Token string TokenType TokenType
TokenType TokenType Git GitInfo
Git GitInfo Date time.Time
Date time.Time Artifacts *artifact.Artifacts
Artifacts *artifact.Artifacts ReleaseURL string
ReleaseURL string ReleaseNotes string
ReleaseNotes string ReleaseNotesFile string
ReleaseNotesFile string ReleaseNotesTmpl string
ReleaseNotesTmpl string ReleaseHeaderFile string
ReleaseHeaderFile string ReleaseHeaderTmpl string
ReleaseHeaderTmpl string ReleaseFooterFile string
ReleaseFooterFile string ReleaseFooterTmpl string
ReleaseFooterTmpl string Version string
Version string ModulePath string
ModulePath string Snapshot bool
Snapshot bool FailFast bool
FailFast bool SkipTokenCheck bool
SkipPostBuildHooks bool Clean bool
SkipPublish bool PreRelease bool
SkipAnnounce bool Deprecated bool
SkipSign bool Parallelism int
SkipValidate bool Semver Semver
SkipSBOMCataloging bool Runtime Runtime
SkipKo bool Skips map[string]bool
SkipDocker bool
SkipBefore bool
Clean bool
PreRelease bool
Deprecated bool
Parallelism int
Semver Semver
Runtime Runtime
} }
type Runtime struct { type Runtime struct {
@ -142,6 +134,7 @@ func Wrap(ctx stdctx.Context, config config.Project) *Context {
Parallelism: 4, Parallelism: 4,
Artifacts: artifact.New(), Artifacts: artifact.New(),
Date: time.Now(), Date: time.Now(),
Skips: map[string]bool{},
Runtime: Runtime{ Runtime: Runtime{
Goos: runtime.GOOS, Goos: runtime.GOOS,
Goarch: runtime.GOARCH, Goarch: runtime.GOARCH,

View File

@ -37,6 +37,52 @@ Description.
--> -->
### `--skip`
> since 2023-09-14
The following `goreleaser release` flags were deprecated:
- `--skip-announce`
- `--skip-before`
- `--skip-docker`
- `--skip-ko`
- `--skip-publish`
- `--skip-sbom`
- `--skip-sign`
- `--skip-validate`
By the same token, the following `goreleaser build` flags were deprecated:
- `--skip-before`
- `--skip-post-hooks`
- `--skip-validate`
All these flags are now under a single `--skip` flag, that accepts multiple
values.
=== "Before"
```sh
goreleaser build --skip-before --skip-validate
goreleaser release --skip-validate --skip-publish
```
=== "After"
```sh
goreleaser build --skip=before,validate
goreleaser release --skip=validate,publish
# or
goreleaser build --skip=before --skip=validate
goreleaser release --skip=validate --skip=publish
```
You can check `goreleaser build --help` and `goreleaser release --help` to see
the valid options, and shell autocompletion should work properly as well.
### scoops.bucket ### scoops.bucket
> since 2023-06-13 (v1.19.0) > since 2023-06-13 (v1.19.0)