func (s *Slack) Post(event events.Event) error {
	if isCommitStatus(event.Metadata, "update") {
		return nil
	}
	payload := SlackPayload{
		Username: s.Username,
	}
	if s.Channel != "" {
		payload.Channel = s.Channel
	}
	if payload.Username == "" {
		payload.Username = event.ReportingController
	}
	color := "good"
	if event.Severity == events.EventSeverityError {
		color = "danger"
	}
	sfields := make([]SlackField, 0, len(event.Metadata))
	for k, v := range event.Metadata {
		sfields = append(sfields, SlackField{k, v, false})
	}
	a := SlackAttachment{
		Color:      color,
		AuthorName: fmt.Sprintf("%s/%s.%s", strings.ToLower(event.InvolvedObject.Kind), event.InvolvedObject.Name, event.InvolvedObject.Namespace),
		Text:       event.Message,
		MrkdwnIn:   []string{"text"},
		Fields:     sfields,
	}
	payload.Attachments = []SlackAttachment{a}
	err := postMessage(s.URL, s.ProxyURL, s.CertPool, payload)
	if err != nil {
		return fmt.Errorf("postMessage failed: %w", err)
	}
	return nil
}
Post Slack message
package notifier
import (
	"crypto/x509"
	"fmt"
	"net/url"
	"strings"
	"github.com/fluxcd/pkg/runtime/events"
)
type Slack struct {
	URL      string
	ProxyURL string
	Username string
	Channel  string
	CertPool *x509.CertPool
}
type SlackPayload struct {
	Channel     string            `json:"channel"`
	Username    string            `json:"username"`
	IconUrl     string            `json:"icon_url"`
	IconEmoji   string            `json:"icon_emoji"`
	Text        string            `json:"text,omitempty"`
	Attachments []SlackAttachment `json:"attachments,omitempty"`
}
type SlackAttachment struct {
	Color      string       `json:"color"`
	AuthorName string       `json:"author_name"`
	Text       string       `json:"text"`
	MrkdwnIn   []string     `json:"mrkdwn_in"`
	Fields     []SlackField `json:"fields"`
}
type SlackField struct {
	Title string `json:"title"`
	Value string `json:"value"`
	Short bool   `json:"short"`
}
func NewSlack(hookURL string, proxyURL string, certPool *x509.CertPool, username string, channel string) (*Slack, error) {
	_, err := url.ParseRequestURI(hookURL)
	if err != nil {
		return nil, fmt.Errorf("invalid Slack hook URL %s", hookURL)
	}
	return &Slack{
		Channel:  channel,
		Username: username,
		URL:      hookURL,
		ProxyURL: proxyURL,
		CertPool: certPool,
	}, nil
}