golang访问Atlassian云服务(Jira/Confluence/Admin)插件库go-atlassian的使用

Golang访问Atlassian云服务(Jira/Confluence/Admin)插件库go-atlassian的使用

概述

go-atlassian是一个Go库,提供了与各种Atlassian产品REST API交互的简单便捷方式。它支持Jira、Confluence、Jira Service Management等产品。

主要特性

  • 易于使用的函数和数据结构,抽象了API的复杂性
  • 全面支持各种Atlassian产品的API
  • 支持常见操作,如创建、更新和删除Atlassian产品中的实体
  • 社区积极开发和维护,定期更新和修复错误
  • 全面的文档和示例帮助开发者快速上手

安装

如果尚未安装Go,请先安装Go 1.20或更高版本。

使用以下命令获取最新版本的go-atlassian:

go get github.com/ctreminiom/go-atlassian/v2

包导入

可以导入以下包:

模块 路径
Jira v2 github.com/ctreminiom/go-atlassian/v2/jira/v2
Jira v3 github.com/ctreminiom/go-atlassian/v2/jira/v3
Jira Software Agile github.com/ctreminiom/go-atlassian/v2/jira/agile
Jira Service Management github.com/ctreminiom/go-atlassian/v2/jira/sm
Jira Assets github.com/ctreminiom/go-atlassian/v2/assets
Confluence github.com/ctreminiom/go-atlassian/v2/confluence
Confluence v2 github.com/ctreminiom/go-atlassian/v2/confluence/v2
Admin Cloud github.com/ctreminiom/go-atlassian/v2/admin
Bitbucket Cloud (开发中) github.com/ctreminiom/go-atlassian/v2/bitbucket

使用示例

API令牌认证

// 创建Confluence Cloud客户端
instance, err := confluence.New(nil, "INSTANCE_HOST")
if err != nil {
    log.Fatal(err)
}
// 设置基本认证
instance.Auth.SetBasicAuth("YOUR_CLIENT_MAIL", "YOUR_APP_ACCESS_TOKEN")

使用预配置的HTTP客户端

transport := http.Transport{
    Proxy: http.ProxyFromEnvironment,
    Dial: (&net.Dialer{
        Timeout:   1 * time.Second,
        KeepAlive: 30 * time.Second,
    }).Dial,
    TLSHandshakeTimeout: 10 * time.Second,
}
client := http.Client{
    Transport: &transport,
    Timeout:   4 * time.Second,
}

instance, err := confluence.New(&client, "INSTANCE_HOST")
if err != nil {
    log.Fatal(err)
}
instance.Auth.SetBasicAuth("YOUR_CLIENT_MAIL", "YOUR_APP_ACCESS_TOKEN")

OAuth 2.0 (3LO)认证

// 配置OAuth
oauthConfig := &common.OAuth2Config{
    ClientID:     "YOUR_CLIENT_ID",
    ClientSecret: "YOUR_CLIENT_SECRET",
    RedirectURI:  "https://your-app.com/callback",
}

// 创建支持OAuth授权流程的客户端
client, err := jira.New(
    http.DefaultClient,
    "https://api.atlassian.com", // OAuth流程的临时URL
    jira.WithOAuth(oauthConfig),
)
if err != nil {
    log.Fatal(err)
}

// 生成授权URL
scopes := []string{"read:jira-work", "write:jira-work"}
authURL, err := client.OAuth.GetAuthorizationURL(scopes, "state")
if err != nil {
    log.Fatal(err)
}

// 将用户重定向到authURL进行授权
fmt.Printf("Visit this URL to authorize: %s\n", authURL.String())

// 授权后,交换代码获取令牌
ctx := context.Background()
token, err := client.OAuth.ExchangeAuthorizationCode(ctx, "AUTH_CODE")
if err != nil {
    log.Fatal(err)
}

// 选项1:手动令牌管理
client.Auth.SetBearerToken(token.AccessToken)

// 选项2:创建带有自动续订的新客户端(推荐)
client, err = jira.New(
    http.DefaultClient,
    "https://your-domain.atlassian.net",
    jira.WithOAuth(oauthConfig),      // OAuth服务
    jira.WithAutoRenewalToken(token), // 自动续订
)
if err != nil {
    log.Fatal(err)
}

// 进行API调用
myself, _, err := client.MySelf.Details(ctx, nil)
if err != nil {
    log.Fatal(err)
}

调用原始API端点

package main

import (
    "context"
    "fmt"
    "github.com/ctreminiom/go-atlassian/v2/jira/v3"
    "log"
    "net/http"
    "os"
)

type IssueTypeMetadata struct {
    IssueTypes []struct {
        ID          string `json:"id"`
        Name        string `json:"name"`
        Description string `json:"description"`
    } `json:"issueTypes"`
}

func main() {
    var (
        host  = os.Getenv("SITE")
        mail  = os.Getenv("MAIL")
        token = os.Getenv("TOKEN")
    )

    atlassian, err := v3.New(nil, host)
    if err != nil {
        log.Fatal(err)
    }

    atlassian.Auth.SetBasicAuth(mail, token)

    // 定义原始端点
    apiEndpoint := "rest/api/3/issue/createmeta/KP/issuetypes"

    request, err := atlassian.NewRequest(context.Background(), http.MethodGet, apiEndpoint, "", nil)
    if err != nil {
        log.Fatal(err)
    }

    customResponseStruct := new(IssueTypeMetadata)
    response, err := atlassian.Call(request, &customResponseStruct)
    if err != nil {
        log.Fatal(err)
    }

    fmt.Println(response.Status)
}

服务接口

库使用服务接口提供模块化和灵活的方式来与Atlassian产品的REST API交互。每个服务接口包含一组方法,对应于相应API中的可用端点。

例如,IssueService接口包括CreateUpdateGet等方法,对应于Jira Issues API中的POSTPUTGET端点。

实现示例

ctx := context.Background()
issueKey := "KP-2"
expand := []string{"transitions"}
issue, response, err := atlassian.Issue.Get(ctx, issueKey, nil, expand)
if err != nil {
    log.Fatal(err)
}
log.Println(issue.Key)
for _, transition := range issue.Transitions {
    log.Println(transition.Name, transition.ID, transition.To.ID, transition.HasScreen)
}

贡献指南

如果你想为这个项目做贡献,请遵循以下指南:

  1. 提交描述问题的issue
  2. Fork仓库并添加你的贡献
  3. 遵循基本的Go约定
  4. 创建包含更改描述的pull request

许可证

Copyright © 2023 Carlos Treminio。本项目采用MIT许可证。


更多关于golang访问Atlassian云服务(Jira/Confluence/Admin)插件库go-atlassian的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang访问Atlassian云服务(Jira/Confluence/Admin)插件库go-atlassian的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用go-atlassian访问Atlassian云服务

go-atlassian是一个用于与Atlassian产品(Jira、Confluence、Admin等)进行交互的Go语言库。它提供了简洁的API来访问Atlassian的REST接口。

安装

首先安装go-atlassian库:

go get github.com/ctreminiom/go-atlassian

基本使用

1. 初始化客户端

package main

import (
	"fmt"
	"log"
	
	"github.com/ctreminiom/go-atlassian/jira"
)

func main() {
	// 创建Jira客户端
	jiraClient, err := jira.New(nil, "https://your-domain.atlassian.net")
	if err != nil {
		log.Fatal(err)
	}
	
	// 设置认证 (使用基本认证或Bearer token)
	jiraClient.Auth.SetBasicAuth("your-email@example.com", "your-api-token")
	// 或者使用Bearer token
	// jiraClient.Auth.SetBearerToken("your-api-token")
}

2. 获取Jira问题

func getIssue(jiraClient *jira.Client) {
	issue, response, err := jiraClient.Issue.Get("PROJECT-123", nil)
	if err != nil {
		log.Fatal(err)
	}
	
	fmt.Printf("Response Status: %v\n", response.Status)
	fmt.Printf("Issue Key: %v\n", issue.Key)
	fmt.Printf("Issue Summary: %v\n", issue.Fields.Summary)
}

3. 创建Jira问题

func createIssue(jiraClient *jira.Client) {
	issuePayload := &jira.IssueScheme{
		Fields: &jira.IssueFieldsScheme{
			Summary:     "Test issue from Go",
			Description: "This is a test issue created using the go-atlassian library",
			Project:     &jira.ProjectScheme{Key: "PROJECT"},
			Type:        &jira.IssueTypeScheme{Name: "Task"},
		},
	}
	
	issue, response, err := jiraClient.Issue.Create(issuePayload)
	if err != nil {
		log.Fatal(err)
	}
	
	fmt.Printf("Response Status: %v\n", response.Status)
	fmt.Printf("Created Issue Key: %v\n", issue.Key)
}

4. 搜索Jira问题

func searchIssues(jiraClient *jira.Client) {
	jql := "project = PROJECT AND status = Open"
	fields := []string{"summary", "status", "assignee"}
	
	issues, response, err := jiraClient.Issue.Search(jql, fields, 0, 50)
	if err != nil {
		log.Fatal(err)
	}
	
	fmt.Printf("Response Status: %v\n", response.Status)
	fmt.Printf("Total Issues: %v\n", issues.Total)
	
	for _, issue := range issues.Issues {
		fmt.Printf("Key: %v, Summary: %v\n", issue.Key, issue.Fields.Summary)
	}
}

Confluence操作示例

1. 初始化Confluence客户端

confluenceClient, err := confluence.New(nil, "https://your-domain.atlassian.net")
if err != nil {
	log.Fatal(err)
}
confluenceClient.Auth.SetBasicAuth("your-email@example.com", "your-api-token")

2. 获取Confluence页面

func getConfluencePage(confluenceClient *confluence.Client) {
	content, response, err := confluenceClient.Content.GetByID("123456", []string{"body.storage"}, nil)
	if err != nil {
		log.Fatal(err)
	}
	
	fmt.Printf("Response Status: %v\n", response.Status)
	fmt.Printf("Page Title: %v\n", content.Title)
	fmt.Printf("Page Body: %v\n", content.Body.Storage.Value)
}

3. 创建Confluence页面

func createConfluencePage(confluenceClient *confluence.Client) {
	pagePayload := &confluence.ContentScheme{
		Type:  "page",
		Title: "New Page from Go",
		Space: &confluence.SpaceScheme{Key: "SPACEKEY"},
		Body: &confluence.BodyScheme{
			Storage: &confluence.StorageScheme{
				Value:          "<p>This is a new page created with go-atlassian</p>",
				Representation: "storage",
			},
		},
	}
	
	content, response, err := confluenceClient.Content.Create(pagePayload)
	if err != nil {
		log.Fatal(err)
	}
	
	fmt.Printf("Response Status: %v\n", response.Status)
	fmt.Printf("Created Page ID: %v\n", content.ID)
}

管理员API示例

1. 初始化Admin客户端

adminClient, err := admin.New(nil, "https://your-domain.atlassian.net")
if err != nil {
	log.Fatal(err)
}
adminClient.Auth.SetBasicAuth("your-email@example.com", "your-api-token")

2. 获取用户信息

func getUserInfo(adminClient *admin.Client) {
	account, response, err := adminClient.User.Get("user@example.com")
	if err != nil {
		log.Fatal(err)
	}
	
	fmt.Printf("Response Status: %v\n", response.Status)
	fmt.Printf("Account ID: %v\n", account.AccountID)
	fmt.Printf("Account Email: %v\n", account.Email)
}

注意事项

  1. 确保使用正确的API令牌而不是密码
  2. 处理分页时注意API限制
  3. 考虑使用上下文(context)来控制请求超时
  4. 对于生产环境,考虑添加重试逻辑
  5. 注意Atlassian API的速率限制

go-atlassian库提供了丰富的功能,上述示例只是基本用法。更多高级功能可以参考官方文档和库的源代码。

回到顶部