-
Notifications
You must be signed in to change notification settings - Fork 53
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #1 from hootsuite/slack-webhooks-lkysow
Refactor webhooks
- Loading branch information
Showing
7 changed files
with
167 additions
and
159 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
package webhooks | ||
|
||
import ( | ||
"fmt" | ||
"regexp" | ||
|
||
"github.com/nlopes/slack" | ||
"github.com/pkg/errors" | ||
) | ||
|
||
type SlackWebhook struct { | ||
EnvRegex *regexp.Regexp | ||
Channel string | ||
Token string | ||
Client *slack.Client | ||
} | ||
|
||
func NewSlack(r *regexp.Regexp, channel string, token string) (*SlackWebhook, error) { | ||
slackClient := slack.New(token) | ||
if _, err := slackClient.AuthTest(); err != nil { | ||
return nil, errors.Wrap(err, "testing slack authentication") | ||
} | ||
// todo: test channel exists | ||
|
||
return &SlackWebhook{ | ||
Client: slackClient, | ||
EnvRegex: r, | ||
Channel: channel, | ||
Token: token, | ||
}, nil | ||
} | ||
|
||
func (s *SlackWebhook) Send(result ApplyResult) error { | ||
if !s.EnvRegex.MatchString(result.Environment) { | ||
return nil | ||
} | ||
|
||
params := slack.NewPostMessageParameters() | ||
params.AsUser = true | ||
params.EscapeText = false | ||
text := s.createMessage(result) | ||
_, _, err := s.Client.PostMessage(s.Channel, text, params) | ||
return err | ||
} | ||
|
||
func (s *SlackWebhook) createMessage(result ApplyResult) string { | ||
var status string | ||
if result.Success { | ||
status = ":white_check_mark:" | ||
} else { | ||
status = ":x:" | ||
} | ||
return fmt.Sprintf("%s *%s* %s in <%s|%s>.", | ||
status, | ||
result.User.Username, | ||
"apply", | ||
result.Pull.URL, | ||
result.Repo.FullName) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,77 @@ | ||
package webhooks | ||
|
||
import ( | ||
"errors" | ||
"fmt" | ||
"regexp" | ||
|
||
"github.com/hootsuite/atlantis/server/events/models" | ||
"github.com/hootsuite/atlantis/server/logging" | ||
) | ||
|
||
const SlackKind = "slack" | ||
const ApplyEvent = "apply" | ||
|
||
type WebhooksSender interface { | ||
Send(log *logging.SimpleLogger, result ApplyResult) | ||
} | ||
|
||
type WebhookSender interface { | ||
Send(ApplyResult) error | ||
} | ||
|
||
type ApplyResult struct { | ||
Environment string | ||
Repo models.Repo | ||
Pull models.PullRequest | ||
User models.User | ||
Success bool | ||
} | ||
|
||
type WebhooksManager struct { | ||
Webhooks []WebhookSender | ||
} | ||
|
||
type Config struct { | ||
Event string | ||
WorkspaceRegex string | ||
Kind string | ||
Channel string | ||
} | ||
|
||
func NewWebhooksManager(configs []Config, slackToken string) (*WebhooksManager, error) { | ||
var webhooks []WebhookSender | ||
for _, c := range configs { | ||
r, err := regexp.Compile(c.WorkspaceRegex) | ||
if err != nil { | ||
return nil, err | ||
} | ||
if c.Event != ApplyEvent { | ||
return nil, fmt.Errorf("event: %s not supported. Only event: %s is supported right now", c.Kind, ApplyEvent) | ||
} | ||
if c.Kind != SlackKind { | ||
return nil, fmt.Errorf("kind: %s not supported. Only kind: %s is supported right now", c.Kind, SlackKind) | ||
} | ||
if slackToken == "" { | ||
return nil, errors.New("for slack webhooks, slack-token must be set") | ||
} | ||
|
||
slack, err := NewSlack(r, c.Channel, slackToken) | ||
if err != nil { | ||
return nil, err | ||
} | ||
webhooks = append(webhooks, slack) | ||
} | ||
|
||
return &WebhooksManager{ | ||
Webhooks: webhooks, | ||
}, nil | ||
} | ||
|
||
func (w *WebhooksManager) Send(log *logging.SimpleLogger, result ApplyResult) { | ||
for _, w := range w.Webhooks { | ||
if err := w.Send(result); err != nil { | ||
log.Warn("error sending slack webhook: %s", err) | ||
} | ||
} | ||
} |
Oops, something went wrong.