github.com/goreleaser/goreleaser@v1.25.1/internal/pipe/publish/publish.go (about) 1 // Package publish contains the publishing pipe. 2 package publish 3 4 import ( 5 "fmt" 6 7 "github.com/goreleaser/goreleaser/internal/middleware/errhandler" 8 "github.com/goreleaser/goreleaser/internal/middleware/logging" 9 "github.com/goreleaser/goreleaser/internal/middleware/skip" 10 "github.com/goreleaser/goreleaser/internal/pipe/artifactory" 11 "github.com/goreleaser/goreleaser/internal/pipe/aur" 12 "github.com/goreleaser/goreleaser/internal/pipe/blob" 13 "github.com/goreleaser/goreleaser/internal/pipe/brew" 14 "github.com/goreleaser/goreleaser/internal/pipe/chocolatey" 15 "github.com/goreleaser/goreleaser/internal/pipe/custompublishers" 16 "github.com/goreleaser/goreleaser/internal/pipe/docker" 17 "github.com/goreleaser/goreleaser/internal/pipe/ko" 18 "github.com/goreleaser/goreleaser/internal/pipe/krew" 19 "github.com/goreleaser/goreleaser/internal/pipe/milestone" 20 "github.com/goreleaser/goreleaser/internal/pipe/nix" 21 "github.com/goreleaser/goreleaser/internal/pipe/release" 22 "github.com/goreleaser/goreleaser/internal/pipe/scoop" 23 "github.com/goreleaser/goreleaser/internal/pipe/sign" 24 "github.com/goreleaser/goreleaser/internal/pipe/snapcraft" 25 "github.com/goreleaser/goreleaser/internal/pipe/upload" 26 "github.com/goreleaser/goreleaser/internal/pipe/winget" 27 "github.com/goreleaser/goreleaser/internal/skips" 28 "github.com/goreleaser/goreleaser/pkg/context" 29 ) 30 31 // Publisher should be implemented by pipes that want to publish artifacts. 32 type Publisher interface { 33 fmt.Stringer 34 35 // Default sets the configuration defaults 36 Publish(ctx *context.Context) error 37 } 38 39 // New publish pipeline. 40 func New() Pipe { 41 return Pipe{ 42 pipeline: []Publisher{ 43 blob.Pipe{}, 44 upload.Pipe{}, 45 artifactory.Pipe{}, 46 custompublishers.Pipe{}, 47 docker.Pipe{}, 48 docker.ManifestPipe{}, 49 ko.Pipe{}, 50 sign.DockerPipe{}, 51 snapcraft.Pipe{}, 52 // This should be one of the last steps 53 release.Pipe{}, 54 // brew et al use the release URL, so, they should be last 55 nix.NewPublish(), 56 winget.Pipe{}, 57 brew.Pipe{}, 58 aur.Pipe{}, 59 krew.Pipe{}, 60 scoop.Pipe{}, 61 chocolatey.Pipe{}, 62 milestone.Pipe{}, 63 }, 64 } 65 } 66 67 // Pipe that publishes artifacts. 68 type Pipe struct { 69 pipeline []Publisher 70 } 71 72 func (Pipe) String() string { return "publishing" } 73 func (Pipe) Skip(ctx *context.Context) bool { return skips.Any(ctx, skips.Publish) } 74 75 func (p Pipe) Run(ctx *context.Context) error { 76 memo := errhandler.Memo{} 77 for _, publisher := range p.pipeline { 78 if err := skip.Maybe( 79 publisher, 80 logging.PadLog( 81 publisher.String(), 82 errhandler.Handle(publisher.Publish), 83 ), 84 )(ctx); err != nil { 85 if ig, ok := publisher.(Continuable); ok && ig.ContinueOnError() && !ctx.FailFast { 86 memo.Memorize(fmt.Errorf("%s: %w", publisher.String(), err)) 87 continue 88 } 89 return fmt.Errorf("%s: failed to publish artifacts: %w", publisher.String(), err) 90 } 91 } 92 return memo.Error() 93 } 94 95 type Continuable interface { 96 ContinueOnError() bool 97 }