in slackbot/slackbot/notify.go [15:87]
func Notify(b *cloudbuild.Build, webhook string, project string) {
url := fmt.Sprintf("https://console.cloud.google.com/cloud-build/builds/%s", b.Id)
var i string
switch b.Status {
case "WORKING":
i = ":hammer:"
case "SUCCESS":
i = ":white_check_mark:"
case "FAILURE":
i = ":x:"
case "CANCELLED":
i = ":wastebasket:"
case "TIMEOUT":
i = ":hourglass:"
case "STATUS_UNKNOWN", "INTERNAL_ERROR":
i = ":interrobang:"
default:
i = ":question:"
}
// Ensure messages remain the same as before
if project == "unknown" {
project = ""
}
var msg string
if b.Status == "WORKING" {
msgFmt := `{
"text": "%s *%s* build started",
"attachments": [{
"fallback": "Open build details at %s",
"actions": [{
"type": "button",
"text": "Open details",
"url": "%s"
}]
}]
}`
msg = fmt.Sprintf(msgFmt, i, project, url, url)
} else {
startTime, err := time.Parse(time.RFC3339, b.StartTime)
if err != nil {
log.Fatalf("Failed to parse Build.StartTime: %v", err)
}
finishTime, err := time.Parse(time.RFC3339, b.FinishTime)
if err != nil {
log.Fatalf("Failed to parse Build.FinishTime: %v", err)
}
buildDuration := finishTime.Sub(startTime).Truncate(time.Second)
msgFmt := `{
"text": "%s *%s* build _%s_ after _%s_",
"attachments": [{
"fallback": "Open build details at %s",
"actions": [{
"type": "button",
"text": "Open details",
"url": "%s"
}]
}]
}`
msg = fmt.Sprintf(msgFmt, i, project, b.Status, buildDuration, url, url)
}
r := strings.NewReader(msg)
resp, err := http.Post(webhook, "application/json", r)
if err != nil {
log.Fatalf("Failed to post to Slack: %v", err)
}
defer resp.Body.Close()
body, _ := ioutil.ReadAll(resp.Body)
log.Printf("Posted message to Slack: [%v], got response [%s]", msg, body)
}