drone-ntfy/cmd/drone-ntfy/main.go

112 lines
2.6 KiB
Go

package main
import (
"fmt"
"log"
"net/http"
"strings"
"git.parravidales.es/parra/drone-ntfy/cmd/drone-ntfy/config"
"github.com/caarlos0/env/v7"
"github.com/joho/godotenv"
)
type Config struct {
App config.App
Drone config.Drone
Ci config.Ci
}
func main() {
cfg := loadCfg()
updateAppConfig(&cfg)
addTagsBasedOnResult(&cfg)
sendNotification(&cfg)
}
func loadCfg() Config {
envErr := godotenv.Load()
if envErr != nil {
fmt.Printf("unable to load .env file: %e\n", envErr)
}
conf := Config{
App: config.App{},
Drone: config.Drone{},
Ci: config.Ci{},
}
loadConfig(&conf.App)
loadConfig(&conf.Drone)
loadConfig(&conf.Ci)
conf.App.Tags = append(conf.App.DefaultTags, conf.App.Tags...)
return conf
}
func loadConfig(cfg any) {
err := env.Parse(cfg)
if err != nil {
log.Fatalf("unable to parse environment variables: %e", err)
}
}
func updateAppConfig(cfg *Config) {
cfg.App.Title = "Build #" + cfg.Drone.BuildNumber + " " + cfg.Drone.BuildStatus
if strings.Contains(cfg.Ci.CommitRef, "refs/tags/") {
cfg.App.Tags = append(cfg.App.Tags, cfg.Drone.Tag)
cfg.App.Message = "Tag " + cfg.Drone.Tag + " created"
} else {
cfg.App.Tags = append(cfg.App.Tags, cfg.Drone.RepoName+"/"+cfg.Ci.CommitBranch)
cfg.App.Message = "[" + cfg.Ci.CommitSha[0:8] + "] " + cfg.Ci.CommitMessage
}
}
func addTagsBasedOnResult(cfg *Config) {
if cfg.Drone.BuildStatus == "success" {
cfg.App.Tags = append(cfg.App.Tags, "white_check_mark")
} else if cfg.Drone.BuildStatus == "failure" {
cfg.App.Tags = append(cfg.App.Tags, "x")
} else {
cfg.App.Tags = append(cfg.App.Tags, "grey_question")
}
}
func sendNotification(cfg *Config) {
req, _ := http.NewRequest("POST",
cfg.App.BaseUrl+"/"+cfg.App.Topic,
strings.NewReader(cfg.App.Message))
if cfg.App.Token != "" {
req.Header.Add("Authorization", "Bearer "+cfg.App.Token)
} else {
req.SetBasicAuth(cfg.App.Username, cfg.App.Password)
}
req.Header.Set("Title", cfg.App.Title)
req.Header.Set("Priority", cfg.App.Priority)
req.Header.Set("Tags", strings.Join(cfg.App.Tags, ","))
req.Header.Set("Actions", getActions(cfg))
res, err := http.DefaultClient.Do(req)
if err != nil {
log.Fatalf("error trying to notify the result. Error: %+v", err)
}
if res.StatusCode != 200 {
log.Fatalf("error from server. HTTP status: %d. Error: %e", res.StatusCode, err)
}
}
func getActions(cfg *Config) string {
var buildLink = "view, Build, " + cfg.Drone.BuildLink
if strings.Contains(cfg.Ci.CommitRef, "refs/tags/") {
return buildLink
}
return buildLink + "; view, Changes, " + cfg.Drone.CommitLink
}