前回GitLabへのPushをトリガーにして、CloudBuildを実行して、GAEへデプロイする流れは作ったので、これを少し拡張して
CloudBuildの結果をSlackへ通知する仕組みを実装して見ました。
前回の記事
Cloud Functionsの実装
Cloud Founctionsの利用方法で環境変数を利用する方法も一緒に調べたので、SLACK_WEBHOOK_URL、CHANNEL、USERNAME
は環境変数で外からDIするような仕組みで対応。
CloudBuildを生成する際に対象となるPub/Subのトピックも作成されているようでした!
package slack
import (
"context"
"encoding/json"
"log"
"net/http"
"fmt"
"bytes"
"os"
)
type PubSubMessage struct {
Data []byte `json:"data"`
}
func sendMsgForSlack(data *map[string]interface{}) {
log.Printf("%v", data)
slack_webhook_url := os.Getenv("SLACK_WEBHOOK_URL")
channel := os.Getenv("CHANNEL")
username := os.Getenv("USERNAME")
log.Printf("%v, %v, %v", slack_webhook_url, channel, username)
dat := *data
ignore_status := []string { "QUEUED", "WORKING" }
status := dat["status"].(string)
for _, value := range ignore_status {
if status == value {
return
}
}
text := "ビルド結果\n"
text += "プロジェクトID:" + dat["projectId"].(string) + "\n"
text += "ID:" + dat["id"].(string) + "\n"
text += "結果:" + status + "\n"
text += "ログ出力先:<" + dat["logUrl"].(string) + "|Click here>"
jsonStr := `{"channel":"` + channel + `","username":"` + username + `","text":"` + text + `"}`
req, err := http.NewRequest(
"POST",
slack_webhook_url,
bytes.NewBuffer([]byte(jsonStr)),
)
if err != nil {
fmt.Print(err)
}
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
fmt.Print(err)
}
fmt.Print(resp)
defer resp.Body.Close()
}
func ReciveFromPubSub(ctx context.Context, m PubSubMessage) error {
var dat map[string]interface{}
json.Unmarshal([]byte(m.Data), &dat)
sendMsgForSlack(&dat)
return nil
}
Cloud Functionsから環境変数を利用する
yamlファイルを指定してデプロイが出来るので下記ファイルを作成する。
.env.yaml
SLACK_WEBHOOK_URL: "https://hooks.slack.com/services/hogehoge"
CHANNEL: "hogehoge"
USERNAME: "CloudBuild"
デプロイする。
下記コマンドでデプロイを実行します。
--trigger-resourceは、今回、cloudbuildからの通知を受けるので、cloud-buildsを指定。
gcloud beta functions deploy CloudBuildReport --runtime go111 --trigger-resource cloud-builds --trigger-event google.pubsub.topic.publish --entry-point ReciveFromPubSub --env-vars-file .env.yaml
動作確認
実際に動かして見ると、ビルドが完了したタイミング以外にも、"QUEUED", "WORKING"等の状態でもSlackへ通知が発生していたので、
goの実装の中でstatusを見て、途中の場合は、無視するようにした。
まとめ
GOがCloudFounctionsでサポートされたことを知ってようやく触ってみましたが、色々細かい部分の設定などで悩まむことが多かったです^^;
最近、あまりサーバーサイド書いてないので少し鈍っているなー。。