do not fail when container could't killed

This commit is contained in:
ubergesundheit 2017-02-07 15:48:38 +01:00
parent 86bd046deb
commit 97d108f415
No known key found for this signature in database
GPG key ID: 5CBA93477A39C06E
2 changed files with 93 additions and 1 deletions

92
actions/notify_slack.go Normal file
View file

@ -0,0 +1,92 @@
package actions
import (
"fmt"
"net/http"
"strings"
"github.com/mozillazg/request"
)
// SlackNotifier is used to make the https requests to a specified slack
// webhook URL
type SlackNotifier struct {
slackURL string
identity string
}
const (
slackMessageStartup = "Watchtower startup"
slackMessageError = "Some errors while checking and redeployment (Please check logs):"
slackMessageSuccess = "Successfully redeployed images:"
)
// NewSlackNotifier instantiates a new SlackNotifier with an URL and an identifier which will
// be prepended to each message it sends
func NewSlackNotifier(slackURL, identity string) *SlackNotifier {
identity = strings.Trim(identity, " ")
if len(identity) != 0 {
identity = fmt.Sprintf("[%s]: ", identity)
}
return &SlackNotifier{
slackURL: slackURL,
identity: identity,
}
}
func (s SlackNotifier) sendNotification(json map[string]interface{}) {
c := new(http.Client)
req := request.NewRequest(c)
req.Json = json
_, err := req.Post(s.slackURL)
if err != nil {
fmt.Println(err)
}
}
// NotifyStartup sends a startup message to slack
func (s SlackNotifier) NotifyStartup() {
s.sendNotification(map[string]interface{}{
"text": fmt.Sprintf("%s%s", s.identity, slackMessageStartup),
})
}
func buildAttachment(items []string, title, color string) map[string]interface{} {
var fields []map[string]string
for _, item := range items {
fields = append(fields, map[string]string{"value": item, "short": "false"})
}
return map[string]interface{}{
"fallback": title + strings.Join(items, ", "),
"color": color,
"title": title,
"fields": fields,
}
}
// NotifyContainerUpdate sends a Message after updating containers which yielded either success or errors or both
func (s SlackNotifier) NotifyContainerUpdate(successfulContainers, errorMessages []string) {
var attachments []map[string]interface{}
if len(successfulContainers) != 0 {
attachments = append(attachments, buildAttachment(successfulContainers, slackMessageSuccess, "good"))
}
if len(errorMessages) != 0 {
attachments = append(attachments, buildAttachment(errorMessages, slackMessageError, "danger"))
}
// add a pretext to the first attachment
attachments[0]["pretext"] = s.identity
s.sendNotification(map[string]interface{}{
"attachments": attachments,
})
}

View file

@ -114,7 +114,7 @@ func (client dockerClient) StopContainer(c Container, timeout time.Duration) err
log.Infof("Stopping %s (%s) with %s", c.Name(), c.ID(), signal)
if err := client.api.ContainerKill(bg, c.ID(), signal); err != nil {
return err
fmt.Errorf("Container %s (%s) could not be killed", c.Name(), c.ID())
}
// Wait for container to exit, but proceed anyway after the timeout elapses