mirror of
https://github.com/containrrr/watchtower.git
synced 2025-09-22 05:40:50 +02:00
feat(shoutrrr): update to v0.5 (#1055)
* feat(shoutrrr): update to v0.5 * fix slack URL and tests * add tests for slack icon override * bump shoutrrr to v0.5.1
This commit is contained in:
parent
bd74c05614
commit
fc31c6eb26
6 changed files with 67 additions and 28 deletions
|
@ -180,7 +180,7 @@ To send notifications via shoutrrr, the following command-line options, or their
|
||||||
|
|
||||||
- `--notification-url` (env. `WATCHTOWER_NOTIFICATION_URL`): The shoutrrr service URL to be used.
|
- `--notification-url` (env. `WATCHTOWER_NOTIFICATION_URL`): The shoutrrr service URL to be used.
|
||||||
|
|
||||||
Go to [containrrr.dev/shoutrrr/v0.4/services/overview](https://containrrr.dev/shoutrrr/v0.4/services/overview) to
|
Go to [containrrr.dev/shoutrrr/v0.5/services/overview](https://containrrr.dev/shoutrrr/v0.5/services/overview) to
|
||||||
learn more about the different service URLs you can use. You can define multiple services by space separating the
|
learn more about the different service URLs you can use. You can define multiple services by space separating the
|
||||||
URLs. (See example below)
|
URLs. (See example below)
|
||||||
|
|
||||||
|
|
2
go.mod
2
go.mod
|
@ -17,7 +17,7 @@ require (
|
||||||
github.com/cenkalti/backoff v2.2.1+incompatible // indirect
|
github.com/cenkalti/backoff v2.2.1+incompatible // indirect
|
||||||
github.com/cloudflare/cfssl v0.0.0-20190911221928-1a911ca1b1d6 // indirect
|
github.com/cloudflare/cfssl v0.0.0-20190911221928-1a911ca1b1d6 // indirect
|
||||||
github.com/containerd/continuity v0.0.0-20181203112020-004b46473808 // indirect
|
github.com/containerd/continuity v0.0.0-20181203112020-004b46473808 // indirect
|
||||||
github.com/containrrr/shoutrrr v0.4.4
|
github.com/containrrr/shoutrrr v0.5.1
|
||||||
github.com/docker/cli v0.0.0-20190327152802-57b27434ea29
|
github.com/docker/cli v0.0.0-20190327152802-57b27434ea29
|
||||||
github.com/docker/distribution v2.7.1+incompatible
|
github.com/docker/distribution v2.7.1+incompatible
|
||||||
github.com/docker/docker v0.0.0-20190404075923-dbe4a30928d4
|
github.com/docker/docker v0.0.0-20190404075923-dbe4a30928d4
|
||||||
|
|
4
go.sum
4
go.sum
|
@ -52,6 +52,10 @@ github.com/containerd/continuity v0.0.0-20181203112020-004b46473808 h1:4BX8f882b
|
||||||
github.com/containerd/continuity v0.0.0-20181203112020-004b46473808/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
|
github.com/containerd/continuity v0.0.0-20181203112020-004b46473808/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y=
|
||||||
github.com/containrrr/shoutrrr v0.4.4 h1:vHZ4E/76pKVY+Jyn/qhBz3X540Bn8NI5ppPHK4PyILY=
|
github.com/containrrr/shoutrrr v0.4.4 h1:vHZ4E/76pKVY+Jyn/qhBz3X540Bn8NI5ppPHK4PyILY=
|
||||||
github.com/containrrr/shoutrrr v0.4.4/go.mod h1:zqL2BvfC1W4FujrT4b3/ZCLxvD+uoeEpBL7rg9Dqpbg=
|
github.com/containrrr/shoutrrr v0.4.4/go.mod h1:zqL2BvfC1W4FujrT4b3/ZCLxvD+uoeEpBL7rg9Dqpbg=
|
||||||
|
github.com/containrrr/shoutrrr v0.5.0 h1:befKPRMqSvEsHYgxYJq4nuGmSWYvjbhVvb0nNk5OR5Q=
|
||||||
|
github.com/containrrr/shoutrrr v0.5.0/go.mod h1:XSU8tOIZ1JG8m6OuPozfGLpj6Ed+S8ZrRJaEodQhbzw=
|
||||||
|
github.com/containrrr/shoutrrr v0.5.1 h1:who87ACg0spQdbImaFMsOSh3g2FWyeN5nmO8tCg3llQ=
|
||||||
|
github.com/containrrr/shoutrrr v0.5.1/go.mod h1:XSU8tOIZ1JG8m6OuPozfGLpj6Ed+S8ZrRJaEodQhbzw=
|
||||||
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
|
||||||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||||
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||||
|
|
|
@ -40,7 +40,7 @@ var _ = Describe("notifications", func() {
|
||||||
token := "abvsihdbau"
|
token := "abvsihdbau"
|
||||||
color := notifications.ColorInt
|
color := notifications.ColorInt
|
||||||
title := url.QueryEscape(notifications.GetTitle(command))
|
title := url.QueryEscape(notifications.GetTitle(command))
|
||||||
expected := fmt.Sprintf("discord://%s@%s?color=0x%x&colordebug=0x0&colorerror=0x0&colorinfo=0x0&colorwarn=0x0&splitlines=Yes&title=%s&username=watchtower", token, channel, color, title)
|
expected := fmt.Sprintf("discord://%s@%s?color=0x%x&colordebug=0x0&colorerror=0x0&colorinfo=0x0&colorwarn=0x0&title=%s&username=watchtower", token, channel, color, title)
|
||||||
buildArgs := func(url string) []string {
|
buildArgs := func(url string) []string {
|
||||||
return []string{
|
return []string{
|
||||||
"--notifications",
|
"--notifications",
|
||||||
|
@ -60,20 +60,22 @@ var _ = Describe("notifications", func() {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
When("converting a slack service config into a shoutrrr url", func() {
|
When("converting a slack service config into a shoutrrr url", func() {
|
||||||
|
|
||||||
It("should return the expected URL", func() {
|
|
||||||
command := cmd.NewRootCommand()
|
command := cmd.NewRootCommand()
|
||||||
flags.RegisterNotificationFlags(command)
|
flags.RegisterNotificationFlags(command)
|
||||||
|
|
||||||
username := "containrrrbot"
|
username := "containrrrbot"
|
||||||
tokenA := "aaa"
|
tokenA := "AAAAAAAAA"
|
||||||
tokenB := "bbb"
|
tokenB := "BBBBBBBBB"
|
||||||
tokenC := "ccc"
|
tokenC := "123456789123456789123456"
|
||||||
color := url.QueryEscape(notifications.ColorHex)
|
color := url.QueryEscape(notifications.ColorHex)
|
||||||
title := url.QueryEscape(notifications.GetTitle(command))
|
title := url.QueryEscape(notifications.GetTitle(command))
|
||||||
|
iconURL := "https://containrrr.dev/watchtower-sq180.png"
|
||||||
|
iconEmoji := "whale"
|
||||||
|
|
||||||
|
When("icon URL is specified", func() {
|
||||||
|
It("should return the expected URL", func() {
|
||||||
|
|
||||||
hookURL := fmt.Sprintf("https://hooks.slack.com/services/%s/%s/%s", tokenA, tokenB, tokenC)
|
hookURL := fmt.Sprintf("https://hooks.slack.com/services/%s/%s/%s", tokenA, tokenB, tokenC)
|
||||||
expectedOutput := fmt.Sprintf("slack://%s@%s/%s/%s?color=%s&title=%s", username, tokenA, tokenB, tokenC, color, title)
|
expectedOutput := fmt.Sprintf("slack://hook:%s-%s-%s@webhook?botname=%s&color=%s&icon=%s&title=%s", tokenA, tokenB, tokenC, username, color, url.QueryEscape(iconURL), title)
|
||||||
|
|
||||||
args := []string{
|
args := []string{
|
||||||
"--notifications",
|
"--notifications",
|
||||||
|
@ -82,11 +84,34 @@ var _ = Describe("notifications", func() {
|
||||||
hookURL,
|
hookURL,
|
||||||
"--notification-slack-identifier",
|
"--notification-slack-identifier",
|
||||||
username,
|
username,
|
||||||
|
"--notification-slack-icon-url",
|
||||||
|
iconURL,
|
||||||
}
|
}
|
||||||
|
|
||||||
testURL(args, expectedOutput)
|
testURL(args, expectedOutput)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
When("icon emoji is specified", func() {
|
||||||
|
It("should return the expected URL", func() {
|
||||||
|
hookURL := fmt.Sprintf("https://hooks.slack.com/services/%s/%s/%s", tokenA, tokenB, tokenC)
|
||||||
|
expectedOutput := fmt.Sprintf("slack://hook:%s-%s-%s@webhook?botname=%s&color=%s&icon=%s&title=%s", tokenA, tokenB, tokenC, username, color, iconEmoji, title)
|
||||||
|
|
||||||
|
args := []string{
|
||||||
|
"--notifications",
|
||||||
|
"slack",
|
||||||
|
"--notification-slack-hook-url",
|
||||||
|
hookURL,
|
||||||
|
"--notification-slack-identifier",
|
||||||
|
username,
|
||||||
|
"--notification-slack-icon-emoji",
|
||||||
|
iconEmoji,
|
||||||
|
}
|
||||||
|
|
||||||
|
testURL(args, expectedOutput)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
Describe("the gotify notifier", func() {
|
Describe("the gotify notifier", func() {
|
||||||
|
@ -208,6 +233,7 @@ func buildExpectedURL(username string, password string, host string, port int, f
|
||||||
}
|
}
|
||||||
|
|
||||||
func testURL(args []string, expectedURL string) {
|
func testURL(args []string, expectedURL string) {
|
||||||
|
defer GinkgoRecover()
|
||||||
|
|
||||||
command := cmd.NewRootCommand()
|
command := cmd.NewRootCommand()
|
||||||
flags.RegisterNotificationFlags(command)
|
flags.RegisterNotificationFlags(command)
|
||||||
|
|
|
@ -49,7 +49,7 @@ func (s *slackTypeNotifier) GetURL(c *cobra.Command) (string, error) {
|
||||||
if parts[0] == "discord.com" || parts[0] == "discordapp.com" {
|
if parts[0] == "discord.com" || parts[0] == "discordapp.com" {
|
||||||
log.Debug("Detected a discord slack wrapper URL, using shoutrrr discord service")
|
log.Debug("Detected a discord slack wrapper URL, using shoutrrr discord service")
|
||||||
conf := &shoutrrrDisco.Config{
|
conf := &shoutrrrDisco.Config{
|
||||||
Channel: parts[len(parts)-3],
|
WebhookID: parts[len(parts)-3],
|
||||||
Token: parts[len(parts)-2],
|
Token: parts[len(parts)-2],
|
||||||
Color: ColorInt,
|
Color: ColorInt,
|
||||||
Title: GetTitle(c),
|
Title: GetTitle(c),
|
||||||
|
@ -59,15 +59,24 @@ func (s *slackTypeNotifier) GetURL(c *cobra.Command) (string, error) {
|
||||||
return conf.GetURL().String(), nil
|
return conf.GetURL().String(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
rawTokens := strings.Replace(s.HookURL, "https://hooks.slack.com/services/", "", 1)
|
webhookToken := strings.Replace(s.HookURL, "https://hooks.slack.com/services/", "", 1)
|
||||||
tokens := strings.Split(rawTokens, "/")
|
|
||||||
|
|
||||||
conf := &shoutrrrSlack.Config{
|
conf := &shoutrrrSlack.Config{
|
||||||
BotName: s.Username,
|
BotName: s.Username,
|
||||||
Token: tokens,
|
|
||||||
Color: ColorHex,
|
Color: ColorHex,
|
||||||
|
Channel: "webhook",
|
||||||
Title: GetTitle(c),
|
Title: GetTitle(c),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if s.IconURL != "" {
|
||||||
|
conf.Icon = s.IconURL
|
||||||
|
} else if s.IconEmoji != "" {
|
||||||
|
conf.Icon = s.IconEmoji
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := conf.Token.SetFromProp(webhookToken); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
return conf.GetURL().String(), nil
|
return conf.GetURL().String(), nil
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue