-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhandle_jira.go
141 lines (119 loc) · 3.56 KB
/
handle_jira.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package main
import (
"bytes"
"encoding/json"
"errors"
"io/ioutil"
"log"
"net/http"
"strconv"
"strings"
"time"
)
func parseJiraIssueIDFromBranchName(branchName string) (jProjID string, jIssueID string, err error) {
branchNamePrepared := strings.ReplaceAll(branchName, "_", "-")
branchNameArray := strings.Split(branchNamePrepared, "-")
if len(branchNameArray) < 2 {
err = errors.New("error parsing issue ID from '" + branchName + "'")
} else {
jProjID = branchNameArray[0]
jIssueID = branchNameArray[1]
}
return
}
func jiraSendRequest(requestMethod string, requestURL string, payload []byte) {
// prepare http client
jiraReq, _ := http.NewRequest(requestMethod, requestURL, bytes.NewBuffer(payload))
jiraReq.Header.Set("Content-Type", "application/json")
jiraReq.SetBasicAuth(cfg.JiraSettings.User, cfg.JiraSettings.Password)
var netClient = &http.Client{
Timeout: time.Second * 10,
}
// multiple attempts to send data
for i := 0; i < maxAttempts; i++ {
resp, err := netClient.Do(jiraReq)
if err == nil {
log.Println(resp)
break
} else {
log.Println(err)
// increasing delays for request
time.Sleep(time.Duration(i*5) * time.Second)
}
}
}
func getJiraIssueSettings(proj string, issueID string) (issueSettings jiraIssue, err error) {
// get issue settings
url := cfg.JiraSettings.URL + jiraRestBaseIssueURI + "/" + proj + "-" + issueID
client := &http.Client{}
req, err := http.NewRequest("GET", url, nil)
req.SetBasicAuth(cfg.JiraSettings.User, cfg.JiraSettings.Password)
resp, err := client.Do(req)
if err != nil {
return
}
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return
}
err = json.Unmarshal(body, &issueSettings)
return
}
// function sends "POST" queries to create a new RemoteLink in Jira
func sendJiraRemoteLink(action string, project string, issueID string, gitLabURL string) (err error) {
url := cfg.JiraSettings.URL + jiraRestBaseIssueURI + "/" + project + "-" +
issueID + jiraRestSuffixRemoteLink
// struct of POST request body to Jira
var obj jiraRemoteLink
// set default values
obj = jiraRemoteLink{
Relationship: "GitLab",
Application: jiraRemoteLinkApplication{
Type: "com.gitlab",
Name: "GitLab",
},
Object: jiraRemoteLinkObject{
Title: action,
URL: gitLabURL,
Icon: jiraRemoteLinkObjectIcon{
URL: cfg.Domain + gitLabLogo,
Title: "gitlab logo",
},
},
}
switch action {
case "approved":
obj.GlobalID = "system=" + cfg.JiraSettings.URL + gitLabBranchPrefix +
"/" + project + "-" + issueID + "&id=" + jiraRemoteLinkApprovedID
obj.Object.Summary = "Merge request was approved"
case "branch created":
obj.GlobalID = "system=" + cfg.JiraSettings.URL + gitLabBranchPrefix +
"/" + project + "-" + issueID + "&id=" + jiraRemoteLinkCreatedID
// obj.Object.Summary = gitLabURL
case "merge request":
obj.GlobalID = "system=" + cfg.JiraSettings.URL + gitLabBranchPrefix +
"/" + project + "-" + issueID + "&id=" + jiraRemoteLinkMergedRequestID
obj.Object.Summary = "created"
default:
err = errors.New("unknown action " + action + " to create Jira exrenal link")
return
}
payload, err := json.Marshal(obj)
if err != nil {
return
}
go jiraSendRequest("POST", url, payload)
return
}
func sendJiraTransition(id int, project string, issueID string) (err error) {
url := cfg.JiraSettings.URL + jiraRestBaseIssueURI + "/" + project + "-" +
issueID + jiraRestSuffixTransitions
var obj jiraTransition
obj.Transition.ID = strconv.Itoa(id)
payload, err := json.Marshal(obj)
if err != nil {
return
}
go jiraSendRequest("POST", url, payload)
return
}