起因
因为要获取Jira信息,所以有了前一个文章:GitLab和Jira集成,本来打算能集成后方便获取的jira信息的,万万没想到,没成功😂。
本来还尝试了手动去获取jira登录等方式,但是试来试去还是感觉太麻烦,就直接去github上找了。
go-jira
逛了下github,发现了这个包:go-jira,看着好像是那么回事,就尝试了下。此处给出官方文档:go-jira相关文档
相关的源码就直接github看吧,上面也有用法示例,入门很简单。我就直接给出我相关代码了,也欢迎大佬们给出意见(或许很多部分可以简化等)
⚠️注意点🐷
- 1、连接部分可看官方文档,我用的是用户名密码的形式
- 2、jql直接在jira issue的筛选部分选择“高级筛选”,就会展示jql了,copy过来即可,无需转义
- 3、看了jira api的官方文档可知,通过jql方式查看的issue,最大只返回50条,所以要传一个最大值,也就是getIssueNotCloseDays()方法中option.MaxResults,只要比筛选得到的issue数大就行
package main
import (
"fmt"
"time"
jira "gopkg.in/andygrunwald/go-jira.v1"
)
var client *jira.Client
func jiraClient() {
tp := jira.BasicAuthTransport{
Username: "xxx", // 此处为jira对应的用户名
Password: "xxx", // 此处为jira对应的密码
}
client, _ = jira.NewClient(tp.Client(), "https://jira.xxx.io") // 对应要登录的jira地址
}
func getIssueTotal() int {
jql := "project = xxx AND issuetype = 故障 ORDER BY key DESC, priority DESC, updated DESC"
fmt.Printf("Usecase: Running a JQL query '%s'\n", jql)
_, resp, err := client.Issue.Search(jql, nil)
if err != nil {
fmt.Println(err)
}
total := resp.Total
return total
}
func getIssueNotCloseDays() int64{
option := &jira.SearchOptions{
StartAt: 0,
MaxResults: 500,
Expand: "",
Fields: nil, // []string
ValidateQuery: "",
}
jql := "project = xxx AND issuetype = 故障 AND status in (进行中, \"To Do\") ORDER BY key DESC, priority DESC, updated DESC"
fmt.Printf("Usecase: Running a JQL query '%s'\n", jql)
issue, resp, err := client.Issue.Search(jql, option)
if err != nil {
fmt.Println(err)
}
// 获取到符合jql的issue总数
issueNotCloseTotal := resp.Total
var sum int64
for _, v := range issue {
// 获取每一个issue的创建时间
created := v.Fields.Created
t := time.Time(created).Unix()
now := time.Now().Unix()
// 与当前时间相减,计算时间差,并逐个累加至sum
reverseTime := now - t
sum += reverseTime
}
// 计算得出平均时间(以day来计算)
averageTime := sum/int64(issueNotCloseTotal)/86400
return averageTime
}
func main() {
jiraClient()
total := getIssueTotal()
fmt.Println("Bug总数:",total)
avg := getIssueNotCloseDays()
fmt.Println("平均天数:",avg)
}