Merge pull request #1551 from jeffastorey/deployment-status

#1550 deployment status hooks for github
This commit is contained in:
Brad Rydzewski 2016-03-30 12:29:21 -07:00
commit 04fca52d8d

View file

@ -6,6 +6,7 @@ import (
"fmt" "fmt"
"net/http" "net/http"
"net/url" "net/url"
"regexp"
"strconv" "strconv"
"strings" "strings"
@ -25,6 +26,8 @@ const (
DefaultMergeRef = "merge" DefaultMergeRef = "merge"
) )
var githubDeployRegex = regexp.MustCompile(".+/deployments/(\\d+)")
type Github struct { type Github struct {
URL string URL string
API string API string
@ -236,7 +239,14 @@ func (g *Github) File(u *model.User, r *model.Repo, b *model.Build, f string) ([
// An example would be the GitHub pull request status. // An example would be the GitHub pull request status.
func (g *Github) Status(u *model.User, r *model.Repo, b *model.Build, link string) error { func (g *Github) Status(u *model.User, r *model.Repo, b *model.Build, link string) error {
client := NewClient(g.API, u.Token, g.SkipVerify) client := NewClient(g.API, u.Token, g.SkipVerify)
if b.Event == "deployment" {
return deploymentStatus(client, r, b, link)
} else {
return repoStatus(client, r, b, link)
}
}
func repoStatus(client *github.Client, r *model.Repo, b *model.Build, link string) error {
status := getStatus(b.Status) status := getStatus(b.Status)
desc := getDesc(b.Status) desc := getDesc(b.Status)
data := github.RepoStatus{ data := github.RepoStatus{
@ -249,6 +259,25 @@ func (g *Github) Status(u *model.User, r *model.Repo, b *model.Build, link strin
return err return err
} }
func deploymentStatus(client *github.Client, r *model.Repo, b *model.Build, link string) error {
matches := githubDeployRegex.FindStringSubmatch(b.Link)
// if the deployment was not triggered from github, don't send a deployment status
if len(matches) != 2 {
return nil
}
// the deployment ID is only available in the the link to the build as the last element in the URL
id, _ := strconv.Atoi(matches[1])
status := getStatus(b.Status)
desc := getDesc(b.Status)
data := github.DeploymentStatusRequest{
State: github.String(status),
Description: github.String(desc),
TargetURL: github.String(link),
}
_, _, err := client.Repositories.CreateDeploymentStatus(r.Owner, r.Name, id, &data)
return err
}
// Netrc returns a .netrc file that can be used to clone // Netrc returns a .netrc file that can be used to clone
// private repositories from a remote system. // private repositories from a remote system.
func (g *Github) Netrc(u *model.User, r *model.Repo) (*model.Netrc, error) { func (g *Github) Netrc(u *model.User, r *model.Repo) (*model.Netrc, error) {