diff --git a/cli/setup/setup.go b/cli/setup/setup.go index da9790a8b..292d58805 100644 --- a/cli/setup/setup.go +++ b/cli/setup/setup.go @@ -72,7 +72,7 @@ func InteractiveSetup(conf *util.ConfigType) { askConfirmation("Enable Rocket.Chat alerts?", false, &conf.RocketChatAlert) if conf.RocketChatAlert { askValue("Rocket.Chat Webhook URL", "", &conf.RocketChatUrl) - } + } askConfirmation("Enable Microsoft Team Channel alerts?", false, &conf.MicrosoftTeamsAlert) if conf.MicrosoftTeamsAlert { diff --git a/services/tasks/TaskRunner_logging.go b/services/tasks/TaskRunner_logging.go index 40ad6f0c6..e4924e694 100644 --- a/services/tasks/TaskRunner_logging.go +++ b/services/tasks/TaskRunner_logging.go @@ -105,6 +105,7 @@ func (t *TaskRunner) SetStatus(status task_logger.TaskStatus) { t.sendSlackAlert() t.sendRocketChatAlert() t.sendMicrosoftTeamsAlert() + t.sendDingTalkAlert() } for _, l := range t.statusListeners { diff --git a/services/tasks/alert.go b/services/tasks/alert.go index 509bc47a6..9bb2353b6 100644 --- a/services/tasks/alert.go +++ b/services/tasks/alert.go @@ -359,6 +359,65 @@ func (t *TaskRunner) sendMicrosoftTeamsAlert() { t.Log("Sent successfully microsoft teams alert") } +func (t *TaskRunner) sendDingTalkAlert() { + if !util.Config.DingTalkAlert || !t.alert { + return + } + + if t.Template.SuppressSuccessAlerts && t.Task.Status == task_logger.TaskSuccessStatus { + return + } + + body := bytes.NewBufferString("") + author, version := t.alertInfos() + + alert := Alert{ + Name: t.Template.Name, + Author: author, + Color: t.alertColor("dingtalk"), + Task: alertTask{ + ID: strconv.Itoa(t.Task.ID), + URL: t.taskLink(), + Result: t.Task.Status.Format(), + Version: version, + Desc: t.Task.Message, + }, + } + + tpl, err := template.ParseFS(templates, "templates/dingtalk.tmpl") + + if err != nil { + t.Log("Can't parse dingtalk alert template!") + panic(err) + } + + if err := tpl.Execute(body, alert); err != nil { + t.Log("Can't generate dingtalk alert template!") + panic(err) + } + + if body.Len() == 0 { + t.Log("Buffer for dingtalk alert is empty") + return + } + + t.Log("Attempting to send dingtalk alert") + + resp, err := http.Post( + util.Config.DingTalkUrl, + "application/json", + body, + ) + + if err != nil { + t.Log("Can't send dingtalk alert! Error: " + err.Error()) + } else if resp.StatusCode != 200 { + t.Log("Can't send dingtalk alert! Response code: " + strconv.Itoa(resp.StatusCode)) + } else { + t.Log("Sent successfully dingtalk alert") + } +} + func (t *TaskRunner) alertInfos() (string, string) { version := "" diff --git a/services/tasks/templates/dingtalk.tmpl b/services/tasks/templates/dingtalk.tmpl new file mode 100644 index 000000000..6858baf9c --- /dev/null +++ b/services/tasks/templates/dingtalk.tmpl @@ -0,0 +1,7 @@ +{ + "msgtype": "markdown", + "markdown": { + "title": "Task: {{ .Name }}", + "text": "#### Task: {{ .Name }}\nExecution #: {{ .Task.ID }} \nStatus: {{ .Task.Result }} \nAuthor: {{ .Author }} \n{{ if .Task.Version }}Version: {{ .Task.Version }} \n{{ end }}[Task Link]({{ .Task.URL }})" + } +} \ No newline at end of file diff --git a/util/config.go b/util/config.go index 5c6e9d344..a4b8365b8 100644 --- a/util/config.go +++ b/util/config.go @@ -161,7 +161,7 @@ type ConfigType struct { LdapMappings ldapMappings `json:"ldap_mappings"` LdapNeedTLS bool `json:"ldap_needtls" env:"SEMAPHORE_LDAP_NEEDTLS"` - // Telegram, Slack, Rocket.Chat and Microsoft Teams alerting + // Telegram, Slack, Rocket.Chat, Microsoft Teams and DingTalk alerting TelegramAlert bool `json:"telegram_alert" env:"SEMAPHORE_TELEGRAM_ALERT"` TelegramChat string `json:"telegram_chat" env:"SEMAPHORE_TELEGRAM_CHAT"` TelegramToken string `json:"telegram_token" env:"SEMAPHORE_TELEGRAM_TOKEN"` @@ -171,6 +171,8 @@ type ConfigType struct { RocketChatUrl string `json:"rocketchat_url" env:"SEMAPHORE_ROCKETCHAT_URL"` MicrosoftTeamsAlert bool `json:"microsoft_teams_alert" env:"SEMAPHORE_MICROSOFT_TEAMS_ALERT"` MicrosoftTeamsUrl string `json:"microsoft_teams_url" env:"SEMAPHORE_MICROSOFT_TEAMS_URL"` + DingTalkAlert bool `json:"dingtalk_alert" env:"SEMAPHORE_DINGTALK_ALERT"` + DingTalkUrl string `json:"dingtalk_url" env:"SEMAPHORE_DINGTALK_URL"` // oidc settings OidcProviders map[string]OidcProvider `json:"oidc_providers"`