-
Notifications
You must be signed in to change notification settings - Fork 7
/
notify.go
105 lines (92 loc) · 3.47 KB
/
notify.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package flow
import (
"context"
"regexp"
"github.com/lunarway/release-manager/internal/flux"
"github.com/lunarway/release-manager/internal/http"
"github.com/pkg/errors"
)
func (s *Service) NotifyK8SDeployEvent(ctx context.Context, event *http.ReleaseEvent) error {
span, ctx := s.Tracer.FromCtx(ctx, "flow.NotifyK8SDeployment")
defer span.Finish()
span, _ = s.Tracer.FromCtx(ctx, "post k8s deploy slack message")
err := s.Slack.NotifyK8SDeployEvent(ctx, event)
span.Finish()
if err != nil {
return errors.WithMessage(err, "post k8s deploy slack message")
}
return nil
}
func (s *Service) NotifyK8SPodErrorEvent(ctx context.Context, event *http.PodErrorEvent) error {
span, ctx := s.Tracer.FromCtx(ctx, "flow.NotifyK8SPodErrorEvent")
defer span.Finish()
span, _ = s.Tracer.FromCtx(ctx, "post k8s NotifyK8SPodErrorEvent slack message")
err := s.Slack.NotifyK8SPodErrorEvent(ctx, event)
span.Finish()
if err != nil {
return errors.WithMessage(err, "post k8s NotifyK8SPodErrorEvent slack message")
}
return nil
}
func (s *Service) NotifyFluxEvent(ctx context.Context, event *http.FluxNotifyRequest) error {
span, ctx := s.Tracer.FromCtx(ctx, "flow.NotifyFluxEvent")
defer span.Finish()
fluxCommits := flux.GetCommits(event.FluxEvent.Metadata)
fluxErrors := flux.GetErrors(event.FluxEvent.Metadata)
// If there's no commits, let's just skip
if len(fluxCommits) == 0 {
return nil
}
for _, commit := range fluxCommits {
commitMessage, err := parseCommitMessage(commit.Message)
if err != nil {
return errors.WithMessagef(err, "parse commit message '%s'", commit.Message)
}
email := commitMessage.GitAuthor
// event contains errors, extract and post specific error message
if len(fluxErrors) > 0 {
for _, err := range fluxErrors {
span, ctx := s.Tracer.FromCtx(ctx, "post flux error event slack message")
err := s.Slack.NotifyFluxErrorEvent(ctx, commitMessage.ArtifactID, commitMessage.Environment, email, commitMessage.Service, err.Error, err.Path)
span.Finish()
if err != nil {
return errors.WithMessage(err, "post flux event processed private message")
}
}
return nil
}
// if no errors
span, ctx = s.Tracer.FromCtx(ctx, "post flux event processed slack message")
err = s.Slack.NotifyFluxEventProcessed(ctx, commitMessage.ArtifactID, commitMessage.Environment, email, commitMessage.Service)
span.Finish()
if err != nil {
return errors.WithMessagef(err, "post flux event processed private message; artifact: %s, env: %s, email: %s, service: %s", commitMessage.ArtifactID, commitMessage.Environment, email, commitMessage.Service)
}
}
return nil
}
type FluxReleaseMessage struct {
Environment string
Service string
ArtifactID string
GitAuthor string
GitCommitter string
}
func parseCommitMessage(commitMessage string) (FluxReleaseMessage, error) {
pattern := `^\[(?P<env>.*)/(?P<service>.*)\]\s+release\s+(?P<artifact>.*)\s+by\s+(?P<author>.*)\sArtifact-created-by:\s(?P<authorName>.*)\s<(?P<authorEmail>.*)>\sArtifact-released-by:\s(?P<committerName>.*)\s<(?P<committerEmail>.*)>`
r, err := regexp.Compile(pattern)
if err != nil {
return FluxReleaseMessage{}, errors.WithMessage(err, "regex didn't match")
}
matches := r.FindStringSubmatch(commitMessage)
if len(matches) < 1 {
return FluxReleaseMessage{}, errors.New("not enough matches")
}
return FluxReleaseMessage{
Environment: matches[1],
Service: matches[2],
ArtifactID: matches[3],
GitAuthor: matches[6],
GitCommitter: matches[8],
}, nil
}