golang Atlassian JIRA客户端交互插件库go-jira的使用
Golang Atlassian JIRA客户端交互插件库go-jira的使用
概述
go-jira是一个用于与Atlassian JIRA交互的Go客户端库。它提供了多种功能来与JIRA系统进行交互,包括创建和检索问题、管理问题状态转换等。
主要特性
- 认证支持(HTTP Basic、OAuth、Session Cookie、Bearer令牌)
- 创建和检索问题
- 创建和检索问题状态转换
- 调用所有JIRA API端点(即使该端点未在库中直接实现)
安装
使用go get安装:
go get github.com/andygrunwald/go-jira
使用示例
获取单个问题
package main
import (
"fmt"
jira "github.com/andygrunwald/go-jira"
)
func main() {
jiraClient, _ := jira.NewClient(nil, "https://issues.apache.org/jira/")
issue, _, _ := jiraClient.Issue.Get("MESOS-3325", nil)
fmt.Printf("%s: %+v\n", issue.Key, issue.Fields.Summary)
fmt.Printf("Type: %s\n", issue.Fields.Type.Name)
fmt.Printf("Priority: %s\n", issue.Fields.Priority.Name)
// 输出示例:
// MESOS-3325: Running mesos-slave@0.23 in a container causes slave to be lost after a restart
// Type: Bug
// Priority: Critical
}
认证(使用API令牌)
package main
import (
"context"
"fmt"
jira "github.com/andygrunwald/go-jira"
)
func main() {
tp := jira.BasicAuthTransport{
Username: "<username>",
Password: "<api-token>",
}
client, err := jira.NewClient(tp.Client(), "https://my.jira.com")
if err != nil {
panic(err)
}
u, _, err := client.User.GetCurrentUser(context.Background())
if err != nil {
panic(err)
}
fmt.Printf("Email: %v\n", u.EmailAddress)
fmt.Println("Success!")
}
创建问题
package main
import (
"fmt"
"github.com/andygrunwald/go-jira"
)
func main() {
base := "https://my.jira.com"
tp := jira.BasicAuthTransport{
Username: "username",
Password: "token",
}
jiraClient, err := jira.NewClient(tp.Client(), base)
if err != nil {
panic(err)
}
i := jira.Issue{
Fields: &jira.IssueFields{
Assignee: &jira.User{
Name: "myuser",
},
Reporter: &jira.User{
Name: "youruser",
},
Description: "Test Issue",
Type: jira.IssueType{
Name: "Bug",
},
Project: jira.Project{
Key: "PROJ1",
},
Summary: "Just a demo issue",
},
}
issue, _, err := jiraClient.Issue.Create(&i)
if err != nil {
panic(err)
}
fmt.Printf("%s: %+v\n", issue.Key, issue.Fields.Summary)
}
更改问题状态
package main
import (
"fmt"
"github.com/andygrunwald/go-jira"
)
func main() {
testIssueID := "FART-1"
base := "https://my.jira.com"
tp := jira.BasicAuthTransport{
Username: "username",
Password: "token",
}
jiraClient, err := jira.NewClient(tp.Client(), base)
if err != nil {
panic(err)
}
issue, _, _ := jiraClient.Issue.Get(testIssueID, nil)
currentStatus := issue.Fields.Status.Name
fmt.Printf("Current status: %s\n", currentStatus)
var transitionID string
possibleTransitions, _, _ := jiraClient.Issue.GetTransitions(testIssueID)
for _, v := range possibleTransitions {
if v.Name == "In Progress" {
transitionID = v.ID
break
}
}
jiraClient.Issue.DoTransition(testIssueID, transitionID)
issue, _, _ = jiraClient.Issue.Get(testIssueID, nil)
fmt.Printf("Status after transition: %+v\n", issue.Fields.Status.Name)
}
调用未实现的API端点
package main
import (
"fmt"
"github.com/andygrunwald/go-jira"
)
func main() {
base := "https://my.jira.com"
tp := jira.BasicAuthTransport{
Username: "username",
Password: "token",
}
jiraClient, err := jira.NewClient(tp.Client(), base)
if err != nil {
panic(err)
}
req, _ := jiraClient.NewRequest("GET", "rest/api/2/project", nil)
projects := new([]jira.Project)
_, err = jiraClient.Do(req, projects)
if err != nil {
panic(err)
}
for _, project := range *projects {
fmt.Printf("%s: %s\n", project.Key, project.Name)
}
}
注意事项
- 当前v2版本正在开发中,可能会有破坏性变更
- 如需稳定版本,请使用v1.*版本
- 支持Go >= 1.14
- 支持Jira v6.3.4和v7.1.2
更多信息
更多详细API描述请参考GoDoc文档。
更多关于golang Atlassian JIRA客户端交互插件库go-jira的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang Atlassian JIRA客户端交互插件库go-jira的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
go-jira: Golang与Atlassian JIRA交互的客户端库
go-jira是一个用于与Atlassian JIRA API交互的Golang客户端库,它提供了简单易用的接口来执行常见的JIRA操作。下面我将详细介绍如何使用这个库。
安装
首先安装go-jira库:
go get github.com/andygrunwald/go-jira
基本用法
1. 创建客户端
package main
import (
"fmt"
"log"
"net/url"
"github.com/andygrunwald/go-jira"
)
func main() {
// JIRA服务器URL
jiraURL := "https://your-jira-instance.atlassian.net"
// 创建客户端
tp := jira.BasicAuthTransport{
Username: "your-username",
Password: "your-api-token", // 使用API令牌而不是密码更安全
}
client, err := jira.NewClient(tp.Client(), jiraURL)
if err != nil {
log.Fatalf("创建JIRA客户端失败: %v", err)
}
fmt.Println("成功连接到JIRA")
}
2. 获取问题(Issue)
func getIssue(client *jira.Client, issueKey string) {
issue, _, err := client.Issue.Get(issueKey, nil)
if err != nil {
log.Fatalf("获取问题失败: %v", err)
}
fmt.Printf("问题ID: %s\n", issue.Key)
fmt.Printf("摘要: %s\n", issue.Fields.Summary)
fmt.Printf("描述: %s\n", issue.Fields.Description)
fmt.Printf("状态: %s\n", issue.Fields.Status.Name)
}
3. 创建问题
func createIssue(client *jira.Client, projectKey string) {
i := jira.Issue{
Fields: &jira.IssueFields{
Project: jira.Project{
Key: projectKey,
},
Type: jira.IssueType{
Name: "Task",
},
Summary: "使用go-jira创建的问题",
Description: "这是通过go-jira库创建的示例问题",
},
}
issue, _, err := client.Issue.Create(&i)
if err != nil {
log.Fatalf("创建问题失败: %v", err)
}
fmt.Printf("成功创建问题: %s\n", issue.Key)
}
4. 更新问题
func updateIssue(client *jira.Client, issueKey string) {
issue, _, err := client.Issue.Get(issueKey, nil)
if err != nil {
log.Fatalf("获取问题失败: %v", err)
}
issue.Fields.Summary = "更新后的摘要"
issue.Fields.Description = "更新后的描述"
_, err = client.Issue.Update(issue)
if err != nil {
log.Fatalf("更新问题失败: %v", err)
}
fmt.Printf("成功更新问题: %s\n", issueKey)
}
5. 搜索问题
func searchIssues(client *jira.Client, jql string) {
issues, _, err := client.Issue.Search(jql, nil)
if err != nil {
log.Fatalf("搜索问题失败: %v", err)
}
fmt.Printf("找到 %d 个问题:\n", len(issues))
for _, issue := range issues {
fmt.Printf("%s: %s\n", issue.Key, issue.Fields.Summary)
}
}
高级功能
1. 自定义字段处理
func updateCustomField(client *jira.Client, issueKey string) {
// 获取问题
issue, _, err := client.Issue.Get(issueKey, nil)
if err != nil {
log.Fatalf("获取问题失败: %v", err)
}
// 更新自定义字段 (假设customfield_12345是你的自定义字段ID)
update := map[string]interface{}{
"fields": map[string]interface{}{
"customfield_12345": "新的自定义字段值",
},
}
_, err = client.Issue.UpdateIssue(issueKey, update)
if err != nil {
log.Fatalf("更新自定义字段失败: %v", err)
}
fmt.Printf("成功更新问题 %s 的自定义字段\n", issueKey)
}
2. 添加评论
func addComment(client *jira.Client, issueKey string) {
comment := &jira.Comment{
Body: "这是通过go-jira添加的评论",
}
_, _, err := client.Issue.AddComment(issueKey, comment)
if err != nil {
log.Fatalf("添加评论失败: %v", err)
}
fmt.Printf("成功为问题 %s 添加评论\n", issueKey)
}
3. 获取用户信息
func getUser(client *jira.Client, username string) {
user, _, err := client.User.Get(username)
if err != nil {
log.Fatalf("获取用户信息失败: %v", err)
}
fmt.Printf("用户信息:\n")
fmt.Printf("名称: %s\n", user.Name)
fmt.Printf("显示名: %s\n", user.DisplayName)
fmt.Printf("邮箱: %s\n", user.EmailAddress)
}
最佳实践
-
使用API令牌而非密码:在Atlassian Cloud上,建议使用API令牌而不是密码进行认证。
-
错误处理:始终检查返回的错误,JIRA API可能会返回各种错误。
-
分页处理:对于大型结果集,使用
StartAt
和MaxResults
参数实现分页。 -
缓存:考虑缓存频繁访问的数据以减少API调用。
-
超时设置:为HTTP客户端设置合理的超时时间。
总结
go-jira库提供了与JIRA REST API交互的简单接口,涵盖了大多数常见的JIRA操作。通过上述示例,你可以轻松地集成JIRA功能到你的Golang应用中。记得查阅官方文档以获取更详细的信息和最新功能。