Merge pull request #504 from Bugagazavr/exp-gitter

Gitter notifications
This commit is contained in:
Brad Rydzewski 2014-10-06 22:18:26 -07:00
commit 83aa8de880
3 changed files with 122 additions and 22 deletions

78
plugin/notify/gitter.go Normal file
View file

@ -0,0 +1,78 @@
package notify
import (
"encoding/json"
"fmt"
"github.com/drone/drone/shared/model"
)
const (
gitterEndpoint = "https://api.gitter.im/v1/rooms/%s/chatMessages"
gitterStartedMessage = "*Building* %s, commit [%s](%s), author %s"
gitterSuccessMessage = "*Success* %s, commit [%s](%s), author %s"
gitterFailureMessage = "*Failed* %s, commit [%s](%s), author %s"
)
type Gitter struct {
RoomID string `yaml:"room_id,omitempty"`
Token string `yaml:"token,omitempty"`
Started bool `yaml:"on_started,omitempty"`
Success bool `yaml:"on_success,omitempty"`
Failure bool `yaml:"on_failure,omitempty"`
}
func (g *Gitter) Send(context *model.Request) error {
switch {
case context.Commit.Status == "Started" && g.Started:
return g.sendStarted(context)
case context.Commit.Status == "Success" && g.Success:
return g.sendSuccess(context)
case context.Commit.Status == "Failure" && g.Failure:
return g.sendFailure(context)
}
return nil
}
func (g *Gitter) getMessage(context *model.Request, message string) string {
url := getBuildUrl(context)
return fmt.Sprintf(message, context.Repo.Name, context.Commit.ShaShort(), url, context.Commit.Author)
}
func (g *Gitter) sendStarted(context *model.Request) error {
return g.send(g.getMessage(context, gitterStartedMessage))
}
func (g *Gitter) sendSuccess(context *model.Request) error {
return g.send(g.getMessage(context, gitterSuccessMessage))
}
func (g *Gitter) sendFailure(context *model.Request) error {
return g.send(g.getMessage(context, gitterFailureMessage))
}
// helper function to send HTTP requests
func (g *Gitter) send(msg string) error {
// data will get posted in this format
data := struct {
Text string `json:"text"`
}{msg}
// data json encoded
payload, err := json.Marshal(data)
if err != nil {
return err
}
// send payload
url := fmt.Sprintf(gitterEndpoint, g.RoomID)
// create headers
headers := make(map[string]string)
headers["Authorization"] = fmt.Sprintf("Bearer %s", g.Token)
go sendJson(url, payload, headers)
return nil
}

View file

@ -1,7 +1,10 @@
package notify package notify
import ( import (
"bytes"
"fmt"
"log" "log"
"net/http"
"github.com/drone/drone/plugin/notify/email" "github.com/drone/drone/plugin/notify/email"
"github.com/drone/drone/plugin/notify/github" "github.com/drone/drone/plugin/notify/github"
@ -23,6 +26,7 @@ type Notification struct {
Hipchat *Hipchat `yaml:"hipchat,omitempty"` Hipchat *Hipchat `yaml:"hipchat,omitempty"`
Irc *irc.IRC `yaml:"irc,omitempty"` Irc *irc.IRC `yaml:"irc,omitempty"`
Slack *Slack `yaml:"slack,omitempty"` Slack *Slack `yaml:"slack,omitempty"`
Gitter *Gitter `yaml:"gitter,omitempty"`
GitHub github.GitHub `yaml:"--"` GitHub github.GitHub `yaml:"--"`
} }
@ -68,6 +72,14 @@ func (n *Notification) Send(context *model.Request) error {
} }
} }
// send gitter notifications
if n.Gitter != nil {
err := n.Gitter.Send(context)
if err != nil {
log.Println(err)
}
}
// send email notifications // send email notifications
// TODO (bradrydzewski) need to improve this code // TODO (bradrydzewski) need to improve this code
githubStatus := new(github.GitHub) githubStatus := new(github.GitHub)
@ -77,3 +89,29 @@ func (n *Notification) Send(context *model.Request) error {
return nil return nil
} }
func getBuildUrl(context *model.Request) string {
return fmt.Sprintf("%s/%s/%s/%s/%s/%s", context.Host, context.Repo.Host, context.Repo.Owner, context.Repo.Name, context.Commit.Branch, context.Commit.Sha)
}
// helper fuction to sent HTTP Post requests
// with JSON data as the payload.
func sendJson(url string, payload []byte, headers map[string]string) {
client := &http.Client{}
buf := bytes.NewBuffer(payload)
req, err := http.NewRequest("POST", url, buf)
req.Header.Set("Content-Type", "application/json")
if headers != nil {
for k, v := range headers {
req.Header.Add(k, v)
}
}
resp, err := client.Do(req)
if err != nil {
return
}
resp.Body.Close()
}

View file

@ -1,10 +1,8 @@
package notify package notify
import ( import (
"bytes"
"encoding/json" "encoding/json"
"fmt" "fmt"
"net/http"
"github.com/drone/drone/shared/model" "github.com/drone/drone/shared/model"
) )
@ -39,25 +37,21 @@ func (s *Slack) Send(context *model.Request) error {
return nil return nil
} }
func getBuildUrl(context *model.Request) string { func (s *Slack) getMessage(context *model.Request, message string) string {
return fmt.Sprintf("%s/%s/%s/%s/%s/%s", context.Host, context.Repo.Host, context.Repo.Owner, context.Repo.Name, context.Commit.Branch, context.Commit.Sha)
}
func getMessage(context *model.Request, message string) string {
url := getBuildUrl(context) url := getBuildUrl(context)
return fmt.Sprintf(message, context.Repo.Name, url, context.Commit.ShaShort(), context.Commit.Author) return fmt.Sprintf(message, context.Repo.Name, url, context.Commit.ShaShort(), context.Commit.Author)
} }
func (s *Slack) sendStarted(context *model.Request) error { func (s *Slack) sendStarted(context *model.Request) error {
return s.send(getMessage(context, slackStartedMessage)) return s.send(s.getMessage(context, slackStartedMessage))
} }
func (s *Slack) sendSuccess(context *model.Request) error { func (s *Slack) sendSuccess(context *model.Request) error {
return s.send(getMessage(context, slackSuccessMessage)) return s.send(s.getMessage(context, slackSuccessMessage))
} }
func (s *Slack) sendFailure(context *model.Request) error { func (s *Slack) sendFailure(context *model.Request) error {
return s.send(getMessage(context, slackFailureMessage)) return s.send(s.getMessage(context, slackFailureMessage))
} }
// helper function to send HTTP requests // helper function to send HTTP requests
@ -77,18 +71,8 @@ func (s *Slack) send(msg string) error {
// send payload // send payload
url := fmt.Sprintf(slackEndpoint, s.Team, s.Token) url := fmt.Sprintf(slackEndpoint, s.Team, s.Token)
go sendJson(url, payload)
go sendJson(url, payload, nil)
return nil return nil
} }
// helper fuction to sent HTTP Post requests
// with JSON data as the payload.
func sendJson(url string, payload []byte) {
buf := bytes.NewBuffer(payload)
resp, err := http.Post(url, "application/json", buf)
if err != nil {
return
}
resp.Body.Close()
}