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

1 回复

更多关于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)
}

最佳实践

  1. 使用API令牌而非密码:在Atlassian Cloud上,建议使用API令牌而不是密码进行认证。

  2. 错误处理:始终检查返回的错误,JIRA API可能会返回各种错误。

  3. 分页处理:对于大型结果集,使用StartAtMaxResults参数实现分页。

  4. 缓存:考虑缓存频繁访问的数据以减少API调用。

  5. 超时设置:为HTTP客户端设置合理的超时时间。

总结

go-jira库提供了与JIRA REST API交互的简单接口,涵盖了大多数常见的JIRA操作。通过上述示例,你可以轻松地集成JIRA功能到你的Golang应用中。记得查阅官方文档以获取更详细的信息和最新功能。

回到顶部