114 lines
2.1 KiB
Go
114 lines
2.1 KiB
Go
package notifier
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"net/url"
|
|
"strings"
|
|
|
|
eventv1 "github.com/fluxcd/pkg/apis/event/v1beta1"
|
|
)
|
|
|
|
type Lark struct {
|
|
URL string
|
|
}
|
|
|
|
type LarkPayload struct {
|
|
MsgType string `json:"msg_type"`
|
|
Card LarkCard `json:"card"`
|
|
}
|
|
|
|
type LarkCard struct {
|
|
Config LarkConfig `json:"config"`
|
|
|
|
Header LarkHeader `json:"header"`
|
|
|
|
Elements []LarkElement `json:"elements"`
|
|
}
|
|
|
|
type LarkConfig struct {
|
|
WideScreenMode bool `json:"wide_screen_mode"`
|
|
}
|
|
|
|
type LarkHeader struct {
|
|
Title LarkTitle `json:"title"`
|
|
Template string `json:"template"`
|
|
}
|
|
|
|
type LarkTitle struct {
|
|
Tag string `json:"tag"`
|
|
Content string `json:"content"`
|
|
}
|
|
|
|
type LarkElement struct {
|
|
Tag string `json:"tag"`
|
|
Text LarkText `json:"text"`
|
|
}
|
|
|
|
type LarkText struct {
|
|
Tag string `json:"tag"`
|
|
Content string `json:"content"`
|
|
}
|
|
|
|
func NewLark(address string) (*Lark, error) {
|
|
_, err := url.ParseRequestURI(address)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("invalid Slack hook URL %s", address)
|
|
}
|
|
|
|
return &Lark{
|
|
URL: address,
|
|
}, nil
|
|
}
|
|
|
|
func (l *Lark) Post(ctx context.Context, event eventv1.Event) error {
|
|
// Skip Git commit status update event.
|
|
if event.HasMetadata(eventv1.MetaCommitStatusKey, eventv1.MetaCommitStatusUpdateValue) {
|
|
return nil
|
|
}
|
|
|
|
emoji := "💫"
|
|
color := "turquoise"
|
|
if event.Severity == eventv1.EventSeverityError {
|
|
emoji = "🚨"
|
|
color = "red"
|
|
}
|
|
|
|
message := fmt.Sprintf("**%s**\n\n", event.Message)
|
|
for k, v := range event.Metadata {
|
|
message = message + fmt.Sprintf("%s: %s\n", k, v)
|
|
}
|
|
|
|
element := LarkElement{
|
|
Tag: "div",
|
|
Text: LarkText{
|
|
Tag: "lark_md",
|
|
Content: message,
|
|
},
|
|
}
|
|
|
|
card := LarkCard{
|
|
Config: LarkConfig{
|
|
WideScreenMode: true,
|
|
},
|
|
Header: LarkHeader{
|
|
Title: LarkTitle{
|
|
Tag: "plain_text",
|
|
Content: fmt.Sprintf("%s %s/%s.%s", emoji, strings.ToLower(event.InvolvedObject.Kind),
|
|
event.InvolvedObject.Name, event.InvolvedObject.Namespace),
|
|
},
|
|
Template: color,
|
|
},
|
|
Elements: []LarkElement{
|
|
element,
|
|
},
|
|
}
|
|
|
|
payload := LarkPayload{
|
|
MsgType: "interactive",
|
|
Card: card,
|
|
}
|
|
|
|
return postMessage(ctx, l.URL, "", nil, payload)
|
|
}
|