golang与CircleCI API交互的客户端插件库circleci的使用

Golang与CircleCI API交互的客户端插件库circleci的使用

go-circleci简介

go-circleci是一个用于与CircleCI API交互的Go语言库。它支持所有当前的API端点,允许您执行以下操作:

  • 查询最近的构建
  • 获取构建详情
  • 重试构建
  • 操作项目的检出密钥、环境变量和其他设置

注意:CircleCI HTTP API响应模式文档不够完善,如果您遇到不匹配的情况,请提交问题。

安装

使用以下命令安装go-circleci库:

go get github.com/jszwedko/go-circleci

基本使用示例

下面是一个基本的使用示例,展示如何列出项目的最近构建:

package main

import (
    "fmt"
    "github.com/jszwedko/go-circleci"
)

func main() {
    // 创建客户端,查询公开项目可以不提供Token
    client := &circleci.Client{Token: "YOUR TOKEN"} 

    // 获取指定项目的构建列表
    builds, err := client.ListRecentBuildsForProject("jszwedko", "circleci-cli", "master", "", -1, 0)
    if err != nil {
        panic(err)
    }

    // 打印构建编号和状态
    for _, build := range builds {
        fmt.Printf("%d: %s\n", build.BuildNum, build.Status)
    }
}

完整功能示例

下面是一个更完整的示例,展示更多API功能:

package main

import (
    "fmt"
    "log"
    "github.com/jszwedko/go-circleci"
)

func main() {
    // 初始化客户端
    client := &circleci.Client{Token: "YOUR_CIRCLECI_TOKEN"}

    // 1. 获取用户信息
    me, err := client.Me()
    if err != nil {
        log.Fatalf("获取用户信息失败: %v", err)
    }
    fmt.Printf("当前用户: %s (%s)\n", me.Name, me.Login)

    // 2. 获取项目列表
    projects, err := client.ListProjects()
    if err != nil {
        log.Fatalf("获取项目列表失败: %v", err)
    }
    fmt.Println("\n我的项目:")
    for _, project := range projects {
        fmt.Printf("- %s/%s\n", project.Username, project.Reponame)
    }

    // 3. 获取特定项目的最近构建
    builds, err := client.ListRecentBuildsForProject("my-org", "my-repo", "main", "", 5, 0)
    if err != nil {
        log.Fatalf("获取构建列表失败: %v", err)
    }
    fmt.Println("\n最近构建:")
    for _, build := range builds {
        fmt.Printf("#%d: %s (%s)\n", build.BuildNum, build.Status, build.Branch)
    }

    // 4. 触发新构建
    if len(builds) > 0 {
        newBuild, err := client.RetryBuild("my-org", "my-repo", builds[0].BuildNum)
        if err != nil {
            log.Fatalf("重试构建失败: %v", err)
        }
        fmt.Printf("\n已触发新构建 #%d\n", newBuild.BuildNum)
    }
}

更多API功能

go-circleci库支持CircleCI API的多种功能,以下是一些常用方法的示例:

// 获取构建详情
build, err := client.GetBuild("org", "repo", 123)

// 获取构建的测试结果
tests, err := client.GetBuildTests("org", "repo", 123)

// 添加环境变量
err := client.AddEnvVar("org", "repo", "KEY", "value")

// 获取项目设置
project, err := client.GetProject("org", "repo")

// 取消构建
err := client.CancelBuild("org", "repo", 123)

注意事项

  1. 对于公开项目,可以不提供Token进行查询
  2. 对于私有项目或需要修改操作,必须提供有效的CircleCI API Token
  3. 建议处理所有API调用可能返回的错误
  4. 由于API响应模式可能变化,建议在实际使用前进行测试

要查看更多示例用法,可以参考circleci-cli项目。

欢迎提交功能请求和问题报告!


更多关于golang与CircleCI API交互的客户端插件库circleci的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang与CircleCI API交互的客户端插件库circleci的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用Go与CircleCI API交互的circleci客户端库

CircleCI是一个流行的持续集成和持续交付(CI/CD)平台,它提供了REST API让开发者可以编程方式与其交互。在Go生态中,circleci是一个常用的客户端库,用于简化与CircleCI API的交互。

安装circleci库

首先,你需要安装circleci库:

go get github.com/grezar/go-circleci

基本使用示例

1. 初始化客户端

package main

import (
	"context"
	"fmt"
	"log"

	"github.com/grezar/go-circleci"
)

func main() {
	// 使用你的CircleCI API token初始化客户端
	// 可以在CircleCI网站的用户设置中获取API token
	token := "your-circleci-api-token"
	client := circleci.NewClient(token, nil)
	
	// 测试连接
	ctx := context.Background()
	user, err := client.Me.Get(ctx)
	if err != nil {
		log.Fatalf("Failed to get user info: %v", err)
	}
	
	fmt.Printf("Logged in as: %s (ID: %s)\n", user.Name, user.ID)
}

2. 获取项目列表

func listProjects(client *circleci.Client) {
	ctx := context.Background()
	projects, err := client.Projects.List(ctx)
	if err != nil {
		log.Fatalf("Failed to list projects: %v", err)
	}

	fmt.Println("Your projects:")
	for _, project := range projects {
		fmt.Printf("- %s (vcs: %s/%s)\n", 
			project.Name, 
			project.VcsType, 
			project.Username)
	}
}

3. 触发新的构建

func triggerBuild(client *circleci.Client, projectSlug string, branch string) {
	ctx := context.Background()
	
	// 项目slug格式为: vcs-type/org-name/repo-name
	// 例如: github/grezar/go-circleci
	
	build, err := client.Builds.TriggerPipeline(ctx, projectSlug, branch, nil)
	if err != nil {
		log.Fatalf("Failed to trigger build: %v", err)
	}
	
	fmt.Printf("Build triggered! ID: %s, Number: %d\n", 
		build.ID, 
		build.Number)
}

4. 获取构建状态

func getBuildStatus(client *circleci.Client, projectSlug string, buildNumber int) {
	ctx := context.Background()
	
	build, err := client.Builds.Get(ctx, projectSlug, buildNumber)
	if err != nil {
		log.Fatalf("Failed to get build info: %v", err)
	}
	
	fmt.Printf("Build #%d status: %s\n", build.Number, build.Status)
	fmt.Printf("Started at: %s, Duration: %d seconds\n", 
		build.StartTime, 
		build.BuildTimeMillis/1000)
}

高级功能

1. 使用环境变量

func manageEnvVars(client *circleci.Client, projectSlug string) {
	ctx := context.Background()
	
	// 列出环境变量
	envVars, err := client.Project.ListEnvVars(ctx, projectSlug)
	if err != nil {
		log.Fatalf("Failed to list env vars: %v", err)
	}
	
	fmt.Println("Environment variables:")
	for _, envVar := range envVars {
		fmt.Printf("- %s\n", envVar.Name)
	}
	
	// 添加新的环境变量
	newVar := &circleci.ProjectEnvVar{
		Name:  "SECRET_KEY",
		Value: "my-secret-value",
	}
	
	_, err = client.Project.AddEnvVar(ctx, projectSlug, newVar)
	if err != nil {
		log.Fatalf("Failed to add env var: %v", err)
	}
	fmt.Println("Added new environment variable")
}

2. 处理工作流

func getWorkflowInfo(client *circleci.Client, projectSlug string, workflowID string) {
	ctx := context.Background()
	
	workflow, err := client.Workflows.Get(ctx, workflowID)
	if err != nil {
		log.Fatalf("Failed to get workflow: %v", err)
	}
	
	fmt.Printf("Workflow %s status: %s\n", workflow.ID, workflow.Status)
	
	// 获取工作流中的任务
	jobs, err := client.Workflows.ListJobs(ctx, workflowID)
	if err != nil {
		log.Fatalf("Failed to list jobs: %v", err)
	}
	
	for _, job := range jobs {
		fmt.Printf("- Job %s: %s\n", job.Name, job.Status)
	}
}

错误处理

CircleCI API可能会返回各种错误,良好的错误处理很重要:

func handleErrors(client *circleci.Client, projectSlug string) {
	ctx := context.Background()
	
	_, err := client.Projects.Get(ctx, "nonexistent/project")
	if err != nil {
		if circleci.IsNotFound(err) {
			fmt.Println("Project not found")
		} else if circleci.IsUnauthorized(err) {
			fmt.Println("Unauthorized - check your API token")
		} else {
			fmt.Printf("Unexpected error: %v\n", err)
		}
		return
	}
}

总结

circleci Go客户端库提供了对CircleCI API的全面访问,使得从Go程序管理CI/CD流程变得简单。通过这个库,你可以:

  1. 获取用户和项目信息
  2. 触发和管理构建
  3. 处理工作流和任务
  4. 管理环境变量
  5. 监控构建状态

记住始终妥善保管你的CircleCI API token,不要在代码中硬编码敏感信息,考虑使用环境变量或秘密管理工具来存储它们。

完整的API文档可以参考官方CircleCI API文档go-circleci库文档

回到顶部