Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 4 additions & 5 deletions go.mod
Original file line number Diff line number Diff line change
@@ -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
)
23 changes: 13 additions & 10 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -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=
Expand All @@ -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=
Expand Down Expand Up @@ -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=
Expand Down
128 changes: 70 additions & 58 deletions notify.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
package notify
package p

import (
"context"
"encoding/base64"
"encoding/json"
"errors"
"fmt"
"log"
"os"
Expand All @@ -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
Expand All @@ -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
}
6 changes: 4 additions & 2 deletions terraform/cloudfunction.tf
Original file line number Diff line number Diff line change
Expand Up @@ -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
}
}
21 changes: 15 additions & 6 deletions terraform/terraform.tfvars
Original file line number Diff line number Diff line change
@@ -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 = ""
12 changes: 10 additions & 2 deletions terraform/variable.tf
Original file line number Diff line number Diff line change
Expand Up @@ -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"
}