diff --git a/go.mod b/go.mod index 4a46a25..fa1d878 100644 --- a/go.mod +++ b/go.mod @@ -1,9 +1,8 @@ module github.com/3-shake/cloud-build-notify +go 1.12 + require ( - github.com/cloudflare/cfssl v0.0.0-20190627231140-2001f384ec4f - github.com/gorilla/websocket v1.4.0 // indirect - github.com/nlopes/slack v0.5.0 - github.com/pkg/errors v0.8.1 // indirect - google.golang.org/api v0.7.0 + github.com/nlopes/slack v0.6.0 + google.golang.org/api v0.10.0 ) diff --git a/go.sum b/go.sum index 2e69d91..4cd7b5d 100644 --- a/go.sum +++ b/go.sum @@ -4,8 +4,7 @@ cloud.google.com/go v0.38.0 h1:ROfEUZz+Gh5pa62DJWXSaonyu3StP6EA6lPEXPI6mCo= cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= -github.com/cloudflare/cfssl v0.0.0-20190627231140-2001f384ec4f h1:WjHSb3zr7akq8UlinFY3vwmXvtje6GUMQww0ECAJsqU= -github.com/cloudflare/cfssl v0.0.0-20190627231140-2001f384ec4f/go.mod h1:yMWuSON2oQp+43nFtAV/uvKQIFpSPerB57DCt9t8sSA= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= @@ -18,16 +17,20 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= -github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM= +github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= +github.com/gorilla/websocket v1.2.0 h1:VJtLvh6VQym50czpZzx07z/kw9EgAxI3x1ZB8taTMQQ= +github.com/gorilla/websocket v1.2.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/hashicorp/golang-lru v0.5.1 h1:0hERBMJE1eitiLkihrMvRVBYAkpHzc/J3QdDN+dAcgU= github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= -github.com/nlopes/slack v0.5.0 h1:NbIae8Kd0NpqaEI3iUrsuS0KbcEDhzhc939jLW5fNm0= -github.com/nlopes/slack v0.5.0/go.mod h1:jVI4BBK3lSktibKahxBF74txcK2vyvkza1z/+rRnVAM= -github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= -github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/nlopes/slack v0.6.0 h1:jt0jxVQGhssx1Ib7naAOZEZcGdtIhTzkP0nopK0AsRA= +github.com/nlopes/slack v0.6.0/go.mod h1:JzQ9m3PMAqcpeCam7UaHSuBuupz7CmpjehYMayT6YOk= +github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= go.opencensus.io v0.21.0 h1:mU6zScU4U1YAFPHEHYk+3JC4SY7JxgkqS10ZOSyksNg= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= @@ -68,8 +71,8 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= -google.golang.org/api v0.7.0 h1:9sdfJOzWlkqPltHAuzT2Cp+yrBeY1KRVYgms8soxMwM= -google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M= +google.golang.org/api v0.10.0 h1:7tmAxx3oKE98VMZ+SBZzvYYWRQ9HODBxmC8mXUsraSQ= +google.golang.org/api v0.10.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= diff --git a/notify.go b/notify.go index d2aac7a..5113a33 100644 --- a/notify.go +++ b/notify.go @@ -1,10 +1,9 @@ -package notify +package p import ( "context" "encoding/base64" "encoding/json" - "errors" "fmt" "log" "os" @@ -15,48 +14,59 @@ import ( ) var ( - cloudBuildStatus = map[string]bool{ + slackURL string + channel string + branchName string + repoName string + + // いらないステータスをfalseにしあとでスキップする + useStatus = map[string]bool{ "STATUS_UNKNOWN": false, "QUEUED": false, - "WORKING": false, + "WORKING": true, "SUCCESS": true, "FAILURE": true, "INTERNAL_ERROR": true, "TIMEOUT": true, - "CANCELLED": false, + "CANCELLED": true, + } + colors = map[string]string{ + "GOOD": "good", + "WARNING": "warning", + "DANGER": "danger", + "BLUE": "#439FE0", } ) func init() { - _, err := NewSlack() - if err != nil { - log.Fatal(err) - } + slackURL = os.Getenv("SLACK_URL") + channel = os.Getenv("CHANNEL") + repoName = os.Getenv("REPO_NAME") + branchName = os.Getenv("BRANCH_NAME") } -type Slack struct { - ProjectID string - Token string - ChannelID string -} - -func NotifyCloudBuild(ctx context.Context, m *pubsub.PubsubMessage) error { - build, err := NewCloudBuild(m) +// NotifyGCB2Slack consumes a Pub/Sub message. +func NotifyGCB2Slack(ctx context.Context, m *pubsub.PubsubMessage) error { + build, err := newCloudBuild(m) if err != nil { log.Println(err) return err } - if !cloudBuildStatus[build.Status] { + + // どうでもいいrepositoryとbranchにfileterをかける + if build.Source.RepoSource.RepoName != repoName || build.Source.RepoSource.BranchName != branchName { return nil } - cli, err := NewSlack() - if err != nil { - log.Println(err) - return err + // どうでも良いステータスは無視する + if onStatus, ok := useStatus[build.Status]; !ok || !onStatus { + log.Printf("%s status is skipped\n", build.Status) + return nil } - err = cli.Notify(build.Status) + msg := newWebhookMessage(build) + + err = slack.PostWebhook(slackURL, msg) if err != nil { log.Println(err) return err @@ -65,49 +75,51 @@ func NotifyCloudBuild(ctx context.Context, m *pubsub.PubsubMessage) error { return nil } -func NewCloudBuild(m *pubsub.PubsubMessage) (*cloudbuild.Build, error) { - decoded, err := base64.StdEncoding.DecodeString(m.Data) - if err != nil { - return nil, err - } - build := &cloudbuild.Build{} - err = json.Unmarshal(decoded, build) - if err != nil { - return nil, err - } +func newWebhookMessage(build *cloudbuild.Build) *slack.WebhookMessage { + var msg slack.WebhookMessage + attachment1 := slack.Attachment{} + attachment1.Title = "Build Status: " + build.Status + attachment1.TitleLink = build.LogUrl + attachment1.Text = fmt.Sprintf( + "project_id: *%s*\nrepository: *%s*\nbranch: *%s*", + build.ProjectId, + build.Source.RepoSource.RepoName, + build.Source.RepoSource.BranchName, + ) - return build, nil -} + switch build.Status { + case "WORKING": + attachment1.Color = colors["BLUE"] -func NewSlack() (*Slack, error) { - project := os.Getenv("GCP_PROJECT") - token := os.Getenv("SLACK_TOKEN") - if token == "" { - return nil, errors.New("Required SLACK_TOKEN") - } + case "SUCCESS": + attachment1.Color = colors["GOOD"] - channelID := os.Getenv("SLACK_CHANNEL_ID") - if channelID == "" { - return nil, errors.New("Required SLACK_CHANNEL_ID") - } + case "FAILURE", "TIMEOUT", "CANCELLED": + attachment1.Color = colors["DANGER"] + + default: + attachment1.Color = colors["WARNING"] - return &Slack{ - ProjectID: project, - Token: token, - ChannelID: channelID, - }, nil + } + msg = slack.WebhookMessage{ + Attachments: []slack.Attachment{attachment1}, + Channel: "#" + channel, + } + return &msg } -func (sl *Slack) Notify(msg string) error { - cli := slack.New(sl.Token) - attachment := slack.Attachment{ - Pretext: msg, +func newCloudBuild(m *pubsub.PubsubMessage) (*cloudbuild.Build, error) { + d, err := base64.StdEncoding.DecodeString(m.Data) + if err != nil { + log.Fatalln(err) + return nil, err } - optionTxt := fmt.Sprintf("(%v) Deploy Status", sl.ProjectID) - _, _, err := cli.PostMessage(sl.ChannelID, slack.MsgOptionText(optionTxt, false), slack.MsgOptionAttachments(attachment)) + build := cloudbuild.Build{} + err = json.Unmarshal(d, &build) if err != nil { - return err + log.Fatalln(err) + return nil, err } - return nil + return &build, nil } diff --git a/terraform/cloudfunction.tf b/terraform/cloudfunction.tf index 6cc3217..1acc2aa 100644 --- a/terraform/cloudfunction.tf +++ b/terraform/cloudfunction.tf @@ -17,7 +17,9 @@ resource "google_cloudfunctions_function" "cloud_build_notify" { } environment_variables = { - SLACK_TOKEN = var.slack_token - SLACK_CHANNEL_ID = var.slack_channel_id + SLACK_URL = var.slack_url + CHANNEL = var.channel + REPO_NAME = var.repo_name + BRANCH_NAME = var.branch_name } } diff --git a/terraform/terraform.tfvars b/terraform/terraform.tfvars index a6c84da..b623ac4 100644 --- a/terraform/terraform.tfvars +++ b/terraform/terraform.tfvars @@ -1,6 +1,15 @@ -project_id = "" -project = "" -bucket = "cloud-build-notify-sample" -cloudfunction = "cloud-build-notify-sample" -slack_token = "" -slack_channel_id = "" +project_id = "" + +project = "" + +bucket = "cloud-build-notify-sample" + +cloudfunction = "cloud-build-notify-sample" + +slack_url = "" + +channel = "" + +repo_name = "" + +branch_name = "" diff --git a/terraform/variable.tf b/terraform/variable.tf index 2806454..dcdf00a 100644 --- a/terraform/variable.tf +++ b/terraform/variable.tf @@ -27,10 +27,18 @@ variable "region" { default = "asia-east1" } -variable "slack_token" { +variable "slack_url" { default = "" } -variable "slack_channel_id" { +variable "channel" { default = "" } + +variable "repo_name" { + default = "asia-east1" +} + +variable "branch_name" { + default = "asia-east1" +}