github.com/triarius/goreleaser@v1.12.5/internal/pipe/announce/announce.go (about) 1 // Package announce contains the announcing pipe. 2 package announce 3 4 import ( 5 "fmt" 6 7 "github.com/caarlos0/log" 8 "github.com/triarius/goreleaser/internal/middleware/errhandler" 9 "github.com/triarius/goreleaser/internal/middleware/logging" 10 "github.com/triarius/goreleaser/internal/middleware/skip" 11 "github.com/triarius/goreleaser/internal/pipe/discord" 12 "github.com/triarius/goreleaser/internal/pipe/linkedin" 13 "github.com/triarius/goreleaser/internal/pipe/mattermost" 14 "github.com/triarius/goreleaser/internal/pipe/reddit" 15 "github.com/triarius/goreleaser/internal/pipe/slack" 16 "github.com/triarius/goreleaser/internal/pipe/smtp" 17 "github.com/triarius/goreleaser/internal/pipe/teams" 18 "github.com/triarius/goreleaser/internal/pipe/telegram" 19 "github.com/triarius/goreleaser/internal/pipe/twitter" 20 "github.com/triarius/goreleaser/internal/pipe/webhook" 21 "github.com/triarius/goreleaser/internal/tmpl" 22 "github.com/triarius/goreleaser/pkg/context" 23 ) 24 25 // Announcer should be implemented by pipes that want to announce releases. 26 type Announcer interface { 27 fmt.Stringer 28 Announce(ctx *context.Context) error 29 } 30 31 // nolint: gochecknoglobals 32 var announcers = []Announcer{ 33 // XXX: keep asc sorting 34 discord.Pipe{}, 35 linkedin.Pipe{}, 36 mattermost.Pipe{}, 37 reddit.Pipe{}, 38 slack.Pipe{}, 39 smtp.Pipe{}, 40 teams.Pipe{}, 41 telegram.Pipe{}, 42 twitter.Pipe{}, 43 webhook.Pipe{}, 44 } 45 46 // Pipe that announces releases. 47 type Pipe struct{} 48 49 func (Pipe) String() string { return "announcing" } 50 51 func (Pipe) Skip(ctx *context.Context) bool { 52 if ctx.SkipAnnounce { 53 return true 54 } 55 if ctx.Config.Announce.Skip == "" { 56 return false 57 } 58 skip, err := tmpl.New(ctx).Apply(ctx.Config.Announce.Skip) 59 if err != nil { 60 log.Error("invalid announce.skip template, will skip the announcing step") 61 return true 62 } 63 log.Debugf("announce.skip evaluated from %q to %q", ctx.Config.Announce.Skip, skip) 64 return skip == "true" 65 } 66 67 // Run the pipe. 68 func (Pipe) Run(ctx *context.Context) error { 69 for _, announcer := range announcers { 70 if err := skip.Maybe( 71 announcer, 72 logging.PadLog( 73 announcer.String(), 74 errhandler.Handle(announcer.Announce), 75 ), 76 )(ctx); err != nil { 77 return fmt.Errorf("%s: failed to announce release: %w", announcer.String(), err) 78 } 79 } 80 return nil 81 }