LoginSignup
0
0

More than 5 years have passed since last update.

CloudBuildのビルド結果をCloudFounctionsを利用してSlackへ通知

Last updated at Posted at 2019-05-01

前回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でサポートされたことを知ってようやく触ってみましたが、色々細かい部分の設定などで悩まむことが多かったです^^;
最近、あまりサーバーサイド書いてないので少し鈍っているなー。。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0