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  }