github.com/ahmet2mir/goreleaser@v0.180.3-0.20210927151101-8e5ee5a9b8c5/internal/pipe/slack/slack.go (about)

     1  package slack
     2  
     3  import (
     4  	"fmt"
     5  
     6  	"github.com/apex/log"
     7  	"github.com/caarlos0/env/v6"
     8  	"github.com/goreleaser/goreleaser/internal/tmpl"
     9  	"github.com/goreleaser/goreleaser/pkg/context"
    10  	"github.com/slack-go/slack"
    11  )
    12  
    13  const (
    14  	defaultUsername        = `GoReleaser`
    15  	defaultMessageTemplate = `{{ .ProjectName }} {{ .Tag }} is out! Check it out at {{ .GitURL }}/releases/tag/{{ .Tag }}`
    16  )
    17  
    18  type Pipe struct{}
    19  
    20  func (Pipe) String() string                 { return "slack" }
    21  func (Pipe) Skip(ctx *context.Context) bool { return !ctx.Config.Announce.Slack.Enabled }
    22  
    23  type Config struct {
    24  	Webhook string `env:"SLACK_WEBHOOK,notEmpty"`
    25  }
    26  
    27  func (Pipe) Default(ctx *context.Context) error {
    28  	if ctx.Config.Announce.Slack.MessageTemplate == "" {
    29  		ctx.Config.Announce.Slack.MessageTemplate = defaultMessageTemplate
    30  	}
    31  	if ctx.Config.Announce.Slack.Username == "" {
    32  		ctx.Config.Announce.Slack.Username = defaultUsername
    33  	}
    34  	return nil
    35  }
    36  
    37  func (Pipe) Announce(ctx *context.Context) error {
    38  	msg, err := tmpl.New(ctx).Apply(ctx.Config.Announce.Slack.MessageTemplate)
    39  	if err != nil {
    40  		return fmt.Errorf("announce: failed to announce to slack: %w", err)
    41  	}
    42  
    43  	var cfg Config
    44  	if err := env.Parse(&cfg); err != nil {
    45  		return fmt.Errorf("announce: failed to announce to slack: %w", err)
    46  	}
    47  
    48  	log.Infof("posting: '%s'", msg)
    49  
    50  	wm := &slack.WebhookMessage{
    51  		Username:  ctx.Config.Announce.Slack.Username,
    52  		IconEmoji: ctx.Config.Announce.Slack.IconEmoji,
    53  		IconURL:   ctx.Config.Announce.Slack.IconURL,
    54  		Channel:   ctx.Config.Announce.Slack.Channel,
    55  		Text:      msg,
    56  	}
    57  
    58  	err = slack.PostWebhook(cfg.Webhook, wm)
    59  	if err != nil {
    60  		return fmt.Errorf("announce: failed to announce to slack: %w", err)
    61  	}
    62  
    63  	return nil
    64  }