56 lines
1.4 KiB
Go
56 lines
1.4 KiB
Go
|
package circleci
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"net/http"
|
||
|
"time"
|
||
|
|
||
|
"github.com/mitchellh/mapstructure"
|
||
|
log "github.com/sirupsen/logrus"
|
||
|
|
||
|
"dev.sum7.eu/genofire/logmania/input/webhook"
|
||
|
)
|
||
|
|
||
|
type requestBody struct {
|
||
|
Payload struct {
|
||
|
VCSURL string `mapstructure:"vcs_url"`
|
||
|
Status string `mapstructure:"status"`
|
||
|
BuildNum float64 `mapstructure:"build_num"`
|
||
|
BuildURL string `mapstructure:"build_url"`
|
||
|
BuildTime float64 `mapstructure:"build_time_millis"`
|
||
|
Subject string `mapstructure:"subject"`
|
||
|
} `mapstructure:"payload"`
|
||
|
}
|
||
|
|
||
|
const webhookType = "circleci"
|
||
|
|
||
|
var HookstatusMap = map[string]log.Level{
|
||
|
"failed": log.ErrorLevel,
|
||
|
"success": log.InfoLevel,
|
||
|
}
|
||
|
|
||
|
var logger = log.WithField("input", webhook.InputType).WithField("hook", webhookType)
|
||
|
|
||
|
func handler(_ http.Header, body interface{}) *log.Entry {
|
||
|
var request requestBody
|
||
|
if err := mapstructure.Decode(body, &request); err != nil {
|
||
|
logger.Warnf("not able to decode data: %s", err)
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
if request.Payload.VCSURL == "" {
|
||
|
return nil
|
||
|
}
|
||
|
|
||
|
entry := log.NewEntry(nil)
|
||
|
entry = entry.WithField("hostname", request.Payload.VCSURL)
|
||
|
entry.Time = time.Now()
|
||
|
entry.Level = HookstatusMap[request.Payload.Status]
|
||
|
entry.Message = fmt.Sprintf("#%0.f (%0.fs): %s - %s", request.Payload.BuildNum, request.Payload.BuildTime/1000, request.Payload.Subject, request.Payload.BuildURL)
|
||
|
return entry
|
||
|
}
|
||
|
|
||
|
func init() {
|
||
|
webhook.AddHandler(webhookType, handler)
|
||
|
}
|