package main import ( "bytes" _ "embed" "fmt" "net/http" "os" "text/template" "github.com/google/uuid" "github.com/sethvargo/go-githubactions" ) const ( defaultColor = "483d8b/6495ed" successColor = "006400/228b22" failedColor = "8b0000/dc143c" ) //go:embed message.tpl var message string type templateData struct { CardID string Title string SubTitle string Author string IconUrl string Project string Commit string Branch string Status string ActionID string GitURL string Color string Add string EventBody string } func main() { data := templateData{} u, err := uuid.NewUUID() if err != nil { githubactions.Fatalf("Error generating UUID: %v", err) os.Exit(1) } data.CardID = u.String() data.Add = "" author := githubactions.GetInput("author") if author == "" { githubactions.Infof("[INFO] Missing input 'author', using default") author = "STACKIT git action" } data.Author = author title := githubactions.GetInput("title") if title == "" { githubactions.Infof("[INFO] Missing input 'title', using default") title = "STACKIT git action" } data.Title = title project := githubactions.GetInput("project") if project == "" { githubactions.Fatalf("Missing input 'project'") os.Exit(1) } data.Project = project commit := githubactions.GetInput("commit") if commit == "" { githubactions.Fatalf("Missing input 'commit'") os.Exit(1) } data.Commit = commit branch := githubactions.GetInput("branch") if branch == "" { githubactions.Fatalf("Missing input 'branch'") os.Exit(1) } data.Branch = branch status := githubactions.GetInput("status") if status == "" { githubactions.Fatalf("Missing input 'status'") os.Exit(1) } data.Status = status actionid := githubactions.GetInput("actionid") if actionid == "" { githubactions.Fatalf("Missing input 'actionid'") os.Exit(1) } data.ActionID = actionid webhook := githubactions.GetInput("webhook") if webhook == "" { githubactions.Fatalf("Missing input 'webhook'") os.Exit(1) } webhook = fmt.Sprintf("%s&threadKey=%s%s&messageReplyOption=REPLY_MESSAGE_FALLBACK_TO_NEW_THREAD", webhook, data.Commit, data.ActionID) giturl := githubactions.GetInput("giturl") if giturl == "" { githubactions.Fatalf("Missing input 'giturl'") os.Exit(1) } data.GitURL = giturl body := githubactions.GetInput("event_body") data.EventBody = body githubactions.Infof("using URL: %s", webhook) // fmt.Println("URL:> ", webhook) // var jsonStr = []byte(fmt.Sprintf(data, project, commit, branch, status, actionid)) jsonStr, err := card(data) if err != nil { githubactions.Fatalf("error %s", err.Error()) os.Exit(1) } // log.Printf("retrieved data: %s", string(jsonStr)) req, err := http.NewRequest("POST", webhook, bytes.NewBuffer(jsonStr)) if err != nil { githubactions.Fatalf("error %s", err.Error()) os.Exit(1) } req.Header.Set("Content-Type", "application/json; charset=UTF-8") client := &http.Client{} resp, err := client.Do(req) if err != nil { githubactions.Fatalf("error %s", err.Error()) os.Exit(1) } defer resp.Body.Close() fmt.Println("response Status:", resp.Status) if resp.StatusCode != http.StatusOK { githubactions.Infof("json: %s", jsonStr) githubactions.Fatalf("response: %+v\n", resp) os.Exit(1) } } func card(d templateData) ([]byte, error) { switch d.Status { case "success": d.Color = successColor case "failure": d.Color = failedColor default: d.Color = defaultColor } if d.IconUrl == "" { d.IconUrl = "https://github.githubassets.com/images/modules/logos_page/Octocat.png" } if d.EventBody == "" { d.EventBody = "Project: {{ .Project }}
Commit-id: {{ .Commit }}
Branch: {{ .Branch }}
Build Status: {{ .Status }}" } if d.Status == "success" { d.Add = ` { "decoratedText": { "startIcon": { "materialIcon": { "name": "check_circle" } }, "text": "SUCCESS" } },` } if d.Status == "failure" { d.Add = ` { "decoratedText": { "startIcon": { "materialIcon": { "name": "stop_circle" } }, "text": "FAILURE" } },` } tmpl, err := template.New("message").Parse(message) if err != nil { return nil, err } buf := new(bytes.Buffer) err = tmpl.Execute(buf, d) if err != nil { return nil, err } return buf.Bytes(), nil }