Complete create-jira-ticket command

This commit is contained in:
Miguel de la Cruz 2020-03-01 12:30:49 +01:00
parent fa5f07d3db
commit 5d727b8995
3 changed files with 90 additions and 18 deletions

View file

@ -32,13 +32,17 @@ func CreateJiraTicketStandaloneCmd() *cobra.Command {
RunE: createJiraTicketStandaloneCmdF, RunE: createJiraTicketStandaloneCmdF,
} }
cmd.Flags().StringP("username", "u", "", "the jira username") cmd.Flags().String("epic", "", "the jira epic id to associate the ticket with")
_ = cmd.MarkFlagRequired("epic")
cmd.Flags().String("team", "", "the team for the new ticket")
_ = cmd.MarkFlagRequired("epic")
cmd.Flags().String("username", "", "the jira username")
_ = cmd.MarkFlagRequired("username") _ = cmd.MarkFlagRequired("username")
cmd.Flags().StringP("token", "t", "", "the jira token") cmd.Flags().String("token", "", "the jira token")
_ = cmd.MarkFlagRequired("token") _ = cmd.MarkFlagRequired("token")
cmd.Flags().StringP("summary", "s", "", "the summary of the ticket") cmd.Flags().String("summary", "", "the summary of the ticket")
_ = cmd.MarkFlagRequired("summary") _ = cmd.MarkFlagRequired("summary")
cmd.Flags().StringP("template", "m", "", "the template to render the description of the ticket") cmd.Flags().String("template", "", "the template to render the description of the ticket")
_ = cmd.MarkFlagRequired("template") _ = cmd.MarkFlagRequired("template")
cmd.Flags().StringSliceP("vars", "v", []string{}, "the variables to use in the template") cmd.Flags().StringSliceP("vars", "v", []string{}, "the variables to use in the template")
@ -58,12 +62,14 @@ func getVarMap(vars []string) (map[string]string, error) {
} }
func createJiraTicketStandaloneCmdF(cmd *cobra.Command, _ []string) error { func createJiraTicketStandaloneCmdF(cmd *cobra.Command, _ []string) error {
epicId, _ := cmd.Flags().GetString("epic")
team, _ := cmd.Flags().GetString("team")
username, _ := cmd.Flags().GetString("username") username, _ := cmd.Flags().GetString("username")
token, _ := cmd.Flags().GetString("token") token, _ := cmd.Flags().GetString("token")
summaryTmplStr, _ := cmd.Flags().GetString("summary") summaryTmplStr, _ := cmd.Flags().GetString("summary")
templatePath, _ := cmd.Flags().GetString("template") templatePath, _ := cmd.Flags().GetString("template")
vars, _ := cmd.Flags().GetStringSlice("vars") vars, _ := cmd.Flags().GetStringSlice("vars")
varMap, err := getVarMap(vars) varMap, err := getVarMap(vars)
if err != nil { if err != nil {
return fmt.Errorf("error processing vars: %w") return fmt.Errorf("error processing vars: %w")
@ -79,25 +85,25 @@ func createJiraTicketStandaloneCmdF(cmd *cobra.Command, _ []string) error {
ErrorAndExit(cmd, err) ErrorAndExit(cmd, err)
} }
summary := summaryBytes.String() summary := summaryBytes.String()
descTmpl, err := template.ParseFiles(templatePath) descTmpl, err := template.ParseFiles(templatePath)
if err != nil { if err != nil {
ErrorAndExit(cmd, err) ErrorAndExit(cmd, err)
} }
var descriptionBytes bytes.Buffer var descriptionBytes bytes.Buffer
if err := descTmpl.Execute(&descriptionBytes, varMap); err != nil { if err := descTmpl.Execute(&descriptionBytes, varMap); err != nil {
ErrorAndExit(cmd, err) ErrorAndExit(cmd, err)
} }
description := descriptionBytes.String() description := descriptionBytes.String()
jiraClient := jira.NewClient(username, token) jiraClient := jira.NewClient(username, token)
ticketKey, err := jiraClient.CreateTicket(summary, description) ticketKey, err := jiraClient.CreateTicket(epicId, team, summary, description)
if err != nil { if err != nil {
ErrorAndExit(cmd, err) ErrorAndExit(cmd, err)
} }
cmd.Printf("Ticket %s successfully created in JIRA", ticketKey) cmd.Printf("Ticket %s successfully created in JIRA", ticketKey)
return nil return nil
} }

26
http/http.go Normal file
View file

@ -0,0 +1,26 @@
package http
import (
"bytes"
"net/http"
)
func Do(method, username, token, url string, body []byte) (*http.Response, error) {
req, err := http.NewRequest("POST", url, bytes.NewBuffer(body))
if err != nil {
return nil, err
}
req.SetBasicAuth(username, token)
req.Header.Add("Content-Type", "application/json")
client := http.Client{}
return client.Do(req)
}
func DoGet(username, token, url string) (*http.Response, error) {
return Do("GET", username, token, url, []byte{})
}
func DoPost(username, token, url string, body []byte) (*http.Response, error) {
return Do("POST", username, token, url, body)
}

View file

@ -1,22 +1,62 @@
package jira package jira
import ( import (
"fmt" "encoding/json"
"io/ioutil"
"git.ctrlz.es/mgdelacroix/campaigner/http"
) )
type JiraClient struct { type JiraClient struct {
Username string Username string
Token string Token string
Url string
}
type JiraIssue struct {
Key string `json:"key"`
} }
func NewClient(username, token string) *JiraClient { func NewClient(username, token string) *JiraClient {
return &JiraClient{ return &JiraClient{
Username: username, Username: username,
Token: token, Token: token,
Url: "https://mattermost.atlassian.net/rest/api/2",
} }
} }
func (c *JiraClient) CreateTicket(summary, description string) (string, error) { func (c *JiraClient) CreateTicket(epicId, team, summary, description string) (string, error) {
fmt.Printf("Summary: %s\nDescription: %s\n", summary, description) data := map[string]interface{}{
return "", nil "fields": map[string]interface{}{
"project": map[string]interface{}{"key": "MM"},
"summary": summary,
"description": description,
"issuetype": map[string]interface{}{"name": "Story"},
"customfield_10007": epicId,
"customfield_11101": map[string]interface{}{"value": team},
},
}
body, err := json.Marshal(data)
if err != nil {
return "", err
}
res, err := http.DoPost(c.Username, c.Token, c.Url+"/issue/", body)
if err != nil {
return "", err
}
defer res.Body.Close()
respBody, err := ioutil.ReadAll(res.Body)
if err != nil {
return "", err
}
var issue JiraIssue
if err := json.Unmarshal(respBody, &issue); err != nil {
return "", err
}
return issue.Key, nil
} }