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 }