mirror of
https://github.com/goreleaser/goreleaser.git
synced 2026-06-19 23:24:39 +02:00
feat: announce: teams (#2482)
Signed-off-by: Engin Diri <engin.diri@mail.schwarz>
This commit is contained in:
@@ -4,6 +4,8 @@ package announce
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/goreleaser/goreleaser/internal/pipe/teams"
|
||||
|
||||
"github.com/goreleaser/goreleaser/internal/middleware"
|
||||
"github.com/goreleaser/goreleaser/internal/pipe/discord"
|
||||
"github.com/goreleaser/goreleaser/internal/pipe/reddit"
|
||||
@@ -33,6 +35,7 @@ var announcers = []Announcer{
|
||||
reddit.Pipe{},
|
||||
slack.Pipe{},
|
||||
twitter.Pipe{},
|
||||
teams.Pipe{},
|
||||
}
|
||||
|
||||
// Run the pipe.
|
||||
|
||||
@@ -0,0 +1,89 @@
|
||||
package teams
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
||||
"github.com/apex/log"
|
||||
goteamsnotify "github.com/atc0005/go-teams-notify/v2"
|
||||
"github.com/caarlos0/env/v6"
|
||||
"github.com/goreleaser/goreleaser/internal/pipe"
|
||||
"github.com/goreleaser/goreleaser/internal/tmpl"
|
||||
"github.com/goreleaser/goreleaser/pkg/context"
|
||||
)
|
||||
|
||||
const (
|
||||
defaultColor = "#2D313E"
|
||||
defaultIcon = "https://goreleaser.com/static/avatar.png"
|
||||
defaultMessageTemplate = `{{ .ProjectName }} {{ .Tag }} is out! Check it out at {{ .GitURL }}/releases/tag/{{ .Tag }}`
|
||||
defaultMessageTitle = `{{ .ProjectName }} {{ .Tag }} is out!`
|
||||
)
|
||||
|
||||
type Pipe struct{}
|
||||
|
||||
func (Pipe) String() string { return "teams" }
|
||||
|
||||
type Config struct {
|
||||
Webhook string `env:"TEAMS_WEBHOOK,notEmpty"`
|
||||
}
|
||||
|
||||
func (p Pipe) Default(ctx *context.Context) error {
|
||||
if ctx.Config.Announce.Teams.MessageTemplate == "" {
|
||||
ctx.Config.Announce.Teams.MessageTemplate = defaultMessageTemplate
|
||||
}
|
||||
if ctx.Config.Announce.Teams.TitleTemplate == "" {
|
||||
ctx.Config.Announce.Teams.TitleTemplate = defaultMessageTitle
|
||||
}
|
||||
if ctx.Config.Announce.Teams.IconURL == "" {
|
||||
ctx.Config.Announce.Teams.IconURL = defaultIcon
|
||||
}
|
||||
if ctx.Config.Announce.Teams.Color == "" {
|
||||
ctx.Config.Announce.Teams.Color = defaultColor
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p Pipe) Announce(ctx *context.Context) error {
|
||||
if ctx.SkipAnnounce {
|
||||
return pipe.ErrSkipAnnounceEnabled
|
||||
}
|
||||
if !ctx.Config.Announce.Teams.Enabled {
|
||||
return pipe.ErrSkipDisabledPipe
|
||||
}
|
||||
|
||||
title, err := tmpl.New(ctx).Apply(ctx.Config.Announce.Teams.TitleTemplate)
|
||||
if err != nil {
|
||||
return fmt.Errorf("announce: failed to announce to teams: %w", err)
|
||||
}
|
||||
|
||||
msg, err := tmpl.New(ctx).Apply(ctx.Config.Announce.Teams.MessageTemplate)
|
||||
if err != nil {
|
||||
return fmt.Errorf("announce: failed to announce to teams: %w", err)
|
||||
}
|
||||
|
||||
var cfg Config
|
||||
if err := env.Parse(&cfg); err != nil {
|
||||
return fmt.Errorf("announce: failed to announce to teams: %w", err)
|
||||
}
|
||||
|
||||
log.Infof("posting: '%s'", msg)
|
||||
|
||||
client := goteamsnotify.NewClient()
|
||||
msgCard := goteamsnotify.NewMessageCard()
|
||||
msgCard.Summary = title
|
||||
msgCard.ThemeColor = ctx.Config.Announce.Teams.Color
|
||||
|
||||
messageCardSection := goteamsnotify.NewMessageCardSection()
|
||||
messageCardSection.ActivityTitle = title
|
||||
messageCardSection.ActivityText = msg
|
||||
messageCardSection.Markdown = true
|
||||
messageCardSection.ActivityImage = ctx.Config.Announce.Teams.IconURL
|
||||
err = msgCard.AddSection(messageCardSection)
|
||||
if err != nil {
|
||||
return fmt.Errorf("announce: failed to announce to teams: %w", err)
|
||||
}
|
||||
err = client.Send(cfg.Webhook, msgCard)
|
||||
if err != nil {
|
||||
return fmt.Errorf("announce: failed to announce to teams: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
package teams
|
||||
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/goreleaser/goreleaser/internal/testlib"
|
||||
"github.com/goreleaser/goreleaser/pkg/config"
|
||||
"github.com/goreleaser/goreleaser/pkg/context"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestStringer(t *testing.T) {
|
||||
require.Equal(t, Pipe{}.String(), "teams")
|
||||
}
|
||||
|
||||
func TestDefault(t *testing.T) {
|
||||
ctx := context.New(config.Project{})
|
||||
require.NoError(t, Pipe{}.Default(ctx))
|
||||
require.Equal(t, ctx.Config.Announce.Teams.MessageTemplate, defaultMessageTemplate)
|
||||
}
|
||||
|
||||
func TestAnnounceDisabled(t *testing.T) {
|
||||
ctx := context.New(config.Project{})
|
||||
require.NoError(t, Pipe{}.Default(ctx))
|
||||
testlib.AssertSkipped(t, Pipe{}.Announce(ctx))
|
||||
}
|
||||
|
||||
func TestAnnounceInvalidTemplate(t *testing.T) {
|
||||
ctx := context.New(config.Project{
|
||||
Announce: config.Announce{
|
||||
Teams: config.Teams{
|
||||
Enabled: true,
|
||||
MessageTemplate: "{{ .Foo }",
|
||||
},
|
||||
},
|
||||
})
|
||||
require.EqualError(t, Pipe{}.Announce(ctx), `announce: failed to announce to teams: template: tmpl:1: unexpected "}" in operand`)
|
||||
}
|
||||
|
||||
func TestAnnounceMissingEnv(t *testing.T) {
|
||||
ctx := context.New(config.Project{
|
||||
Announce: config.Announce{
|
||||
Teams: config.Teams{
|
||||
Enabled: true,
|
||||
},
|
||||
},
|
||||
})
|
||||
require.NoError(t, Pipe{}.Default(ctx))
|
||||
require.EqualError(t, Pipe{}.Announce(ctx), `announce: failed to announce to teams: env: environment variable "TEAMS_WEBHOOK" should not be empty`)
|
||||
}
|
||||
|
||||
func TestAnnounceSkipAnnounce(t *testing.T) {
|
||||
ctx := context.New(config.Project{
|
||||
Announce: config.Announce{
|
||||
Teams: config.Teams{
|
||||
Enabled: true,
|
||||
},
|
||||
},
|
||||
})
|
||||
ctx.SkipAnnounce = true
|
||||
testlib.AssertSkipped(t, Pipe{}.Announce(ctx))
|
||||
}
|
||||
Reference in New Issue
Block a user