diff --git a/cmd/main.go b/cmd/main.go index c691777..a2b9271 100644 --- a/cmd/main.go +++ b/cmd/main.go @@ -60,8 +60,8 @@ func main() { type pubSubHTTPMessage struct { Message struct { - Data []byte `json:"data,omitempty"` - Attributes map[string]string `json:"attributes,omitempty"` + Data []byte `json:"data,omitempty"` + Attributes map[string]string `json:"attributes,omitempty"` } `json:"message"` Subscription string `json:"subscription"` } @@ -80,9 +80,9 @@ func httpHandler(n cloudbuildnotifier.Notifier, c *cloudbuild.CloudbuildClient) } m := &pubsub.Message{ - ID: pubsubHttp.Message.Attributes["buildId"], + ID: pubsubHttp.Message.Attributes["buildId"], Attributes: pubsubHttp.Message.Attributes, - Data: pubsubHttp.Message.Data, + Data: pubsubHttp.Message.Data, } if err := handleMessage(m, n, c); err != nil { @@ -108,7 +108,7 @@ func handleMessage(msg *pubsub.Message, notifier cloudbuildnotifier.Notifier, cl return fmt.Errorf("failed unmarshaling json from cloudbuild response: %s", err) } - buildParams, err := cloudbuild.GetBuildParameterss(msg.Attributes["buildId"]) + buildParams, err := cloudbuild.GetBuildParameters(msg.Attributes["buildId"]) if err != nil { return fmt.Errorf("Failed getting build parameters from cloudbuild for build %s: %s", msg.Attributes["buildId"], err) diff --git a/pkg/cloudbuild/cloudbuild.go b/pkg/cloudbuild/cloudbuild.go index 7a65d52..843afe7 100644 --- a/pkg/cloudbuild/cloudbuild.go +++ b/pkg/cloudbuild/cloudbuild.go @@ -4,7 +4,8 @@ import ( "context" "fmt" "github.com/fatih/structs" - cloudbuild "google.golang.org/api/cloudbuild/v1" + "google.golang.org/api/cloudbuild/v1" + "log" ) type CloudbuildClient struct { @@ -26,23 +27,27 @@ func New(projectId string) (*CloudbuildClient, error) { } type BuildParameters struct { - Id string - REPO_NAME string - BRANCH_NAME string - COMMIT_SHA string - REVISION_ID string - TRIGGER_NAME string + Id string + REPO_NAME string + BRANCH_NAME string + COMMIT_SHA string + REVISION_ID string + TRIGGER_NAME string + HEAD_REPO_URL string } -func (c *CloudbuildClient) GetBuildParameterss(buildId string) (BuildParameters, error) { +func (c *CloudbuildClient) GetBuildParameters(buildId string) (BuildParameters, error) { buildParams := &BuildParameters{ Id: buildId, } b := structs.New(buildParams) result, err := c.client.Get(c.ProjectID, buildId).Do() + log.Println("source:", result.Source) if err != nil { + log.Printf("error getting build parameters: %s\n", err) return *buildParams, err } + for k, v := range result.Substitutions { if f, ok := b.FieldOk(k); ok { f.Set(v) diff --git a/pkg/notifier/slack/slack.go b/pkg/notifier/slack/slack.go index 9561aa2..5796852 100644 --- a/pkg/notifier/slack/slack.go +++ b/pkg/notifier/slack/slack.go @@ -3,6 +3,9 @@ package slack import ( "fmt" "log" + "net/url" + "path" + "strings" cloudbuildnotifier "github.com/cloudkite-io/cloudbuild-notifier" "github.com/cloudkite-io/cloudbuild-notifier/pkg/cloudbuild" @@ -34,11 +37,16 @@ func (n notifier) Send(cloudbuildResponse cloudbuildnotifier.CloudbuildResponse, return nil } + commitShaURL, err := buildGitSourceURL(buildParams) + if err != nil { + return fmt.Errorf("failed posting to webhook %s: %s", n.webhookURL, err) + } + attachment := slack.Attachment{ Title: fmt.Sprintf("Cloudbuild: %s", cloudbuildResponse.Status), Color: color, Text: fmt.Sprintf("Repo: %s\nBranch: %s\nCommit SHA: %s\nTrigger: %s\n", - buildParams.REPO_NAME, buildParams.BRANCH_NAME, buildParams.COMMIT_SHA, buildParams.TRIGGER_NAME), + buildParams.REPO_NAME, buildParams.BRANCH_NAME, commitShaURL, buildParams.TRIGGER_NAME), Actions: []slack.AttachmentAction{ { Text: "View Logs", @@ -52,7 +60,7 @@ func (n notifier) Send(cloudbuildResponse cloudbuildnotifier.CloudbuildResponse, Attachments: []slack.Attachment{attachment}, } - err := slack.PostWebhook(n.webhookURL, &msg) + err = slack.PostWebhook(n.webhookURL, &msg) if err != nil { return fmt.Errorf("failed posting to webhook %s: %s", n.webhookURL, err) } @@ -62,6 +70,16 @@ func (n notifier) Send(cloudbuildResponse cloudbuildnotifier.CloudbuildResponse, return nil } +func buildGitSourceURL(buildParams cloudbuild.BuildParameters) (string, error) { + u, err := url.Parse(buildParams.HEAD_REPO_URL) + if err != nil { + return "", err + } + u.Path = strings.Trim(u.Path, ".git") + u.Path = path.Join(u.Path, "commit", buildParams.COMMIT_SHA) + return u.String(), nil +} + func stringInSlice(needle string, haystack []string) bool { for _, b := range haystack { if b == needle {