项目集成整合 github.com/xanzy/go-gitlab

概要

github.com/xanzy/go-gitlab 项目集成应用

Go-GitLab是一个开源项目,由Xanzy维护。这个库的目标是提供一个完整的、类型安全的、易于使用的GitLab API接口。通过这个库,你可以执行几乎所有的GitLab操作,包括创建和管理仓库、用户、分支、标签、合并请求等。

技术分析
完全覆盖GitLab API:Go-GitLab几乎实现了GitLab REST API的所有功能,让你可以无拘无束地探索并利用GitLab的强大特性。

类型安全:由于是用静态类型的Golang编写,每个API调用都有明确的输入和输出类型,这减少了运行时错误的可能性,并提高了代码的可读性。

易于使用:设计优雅的API使得集成到你的项目中变得简单,只需几行代码就能完成复杂操作。

并发支持:Golang的并发模型(goroutines和channels)被充分利用,让你可以在多个操作之间无缝切换,提高性能。

响应解码:库自动解析GitLab的JSON响应,将数据转换为Go结构体,方便进一步处理。

以下是项目集成代码,直接上代码


package gitlaboperation

import (
	"crypto/tls"
	"fmt"
	"net/http"

	gitlab "github.com/xanzy/go-gitlab"
)

var (
	git *gitlab.Client
)

type GitLabClient struct {
	gitLabClient *gitlab.Client
}

func NewGitLabController() *GitLabClient {
	if git != nil {
		return &GitLabClient{git}
	}

	// 创建一个自定义的http.Client  忽略证书
	httpClient := &http.Client{
		Transport: &http.Transport{
			TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
		},
	}

	var err error
	git, err = gitlab.NewClient(conf.Options.GitLabAccessToken, gitlab.WithBaseURL(conf.Options.GitLabApiHost), gitlab.WithHTTPClient(httpClient))
	if err != nil {
		fmt.Printf("Gitlab初始化失败:%v\n", err)
	} else {
		fmt.Println("Gitlab初始化完成")
	}
	return &GitLabClient{git}
}

// 查询所有项目
func (g *GitLabClient) GetAllProject() ([]*gitlab.Project, error) {
	lbo := &gitlab.ListProjectsOptions{ListOptions: gitlab.ListOptions{Page: 1, PerPage: 50}}
	var pro []*gitlab.Project
	for {
		p, _, err := g.gitLabClient.Projects.ListProjects(lbo)
		if err != nil {
			fmt.Printf("list projects failed:%v\n", err)
			return nil, err
		}
		pro = append(pro, p...)
		if len(p) < 50 {
			break
		}
		lbo.ListOptions.Page++
	}
	return pro, nil
}

// 创建项目
func (g *GitLabClient) CreateProject(opt *gitlab.CreateProjectOptions) (*gitlab.Project, *gitlab.Response, error) {
	return g.gitLabClient.Projects.CreateProject(opt)
}

// 删除项目
func (g *GitLabClient) DeleteProject(projectId int) (*gitlab.Response, error) {
	return g.gitLabClient.Projects.DeleteProject(projectId)
}

// 更新项目
func (g *GitLabClient) UpdateProject(projectId int, opt *gitlab.EditProjectOptions) (*gitlab.Project, *gitlab.Response, error) {
	return g.gitLabClient.Projects.EditProject(projectId, opt)
}

// fork项目
func (g *GitLabClient) ForkProject(projectId int, opt *gitlab.ForkProjectOptions) (*gitlab.Project, *gitlab.Response, error) {
	return g.gitLabClient.Projects.ForkProject(projectId, opt)
}

// 归档项目Archive
func (g *GitLabClient) ArchiveProject(projectId int) (*gitlab.Project, *gitlab.Response, error) {
	return g.gitLabClient.Projects.ArchiveProject(projectId)
}

// 创建SSH密钥
func (g *GitLabClient) CreateSSHKey(opt *gitlab.AddSSHKeyOptions) (*gitlab.SSHKey, *gitlab.Response, error) {
	return g.gitLabClient.Users.AddSSHKey(opt)
}

// 删除SSH密钥
func (g *GitLabClient) DeleteSSHKey(keyId int) (*gitlab.Response, error) {
	return g.gitLabClient.Users.DeleteSSHKey(keyId)
}

// 根据key名称查询SSH密钥
func (g *GitLabClient) GetSSHKeyByName(keyName string) (*gitlab.SSHKey, error) {
	lbo := &gitlab.ListSSHKeysOptions{Page: 1, PerPage: 50}
	for {
		p, _, err := g.gitLabClient.Users.ListSSHKeys(lbo)
		if err != nil {
			fmt.Printf("list projects failed:%v\n", err)
			return nil, err
		}
		for _, v := range p {
			if v.Title == keyName {
				return v, nil
			}
		}
		if len(p) < 50 {
			break
		}
		lbo.Page++
	}
	return nil, fmt.Errorf("key not found")
}

// 设置用户权限到gitlab项目中
func (g *GitLabClient) SetUserPermission(userId int, projectId int, accessLevel int) error {
	accessLevelValue := gitlab.AccessLevelValue(accessLevel)
	opt := &gitlab.AddProjectMemberOptions{
		UserID:      &userId,
		AccessLevel: &accessLevelValue,
	}
	_, _, err := g.gitLabClient.ProjectMembers.AddProjectMember(projectId, opt)
	return err
}

// 创建group
func (g *GitLabClient) CreateGroup(opt *gitlab.CreateGroupOptions) (*gitlab.Group, *gitlab.Response, error) {
	return g.gitLabClient.Groups.CreateGroup(opt)
}

// 修改group
func (g *GitLabClient) UpdateGroup(groupID int, opt *gitlab.UpdateGroupOptions) (*gitlab.Group, *gitlab.Response, error) {
	return g.gitLabClient.Groups.UpdateGroup(groupID, opt)
}

// 删除group
func (g *GitLabClient) DeleteGroup(groupID int, opt *gitlab.DeleteGroupOptions) (*gitlab.Response, error) {
	return g.gitLabClient.Groups.DeleteGroup(groupID, opt)
}

// group添加用户
func (g *GitLabClient) AddGroupMember(groupID int, opt *gitlab.AddGroupMemberOptions) (*gitlab.GroupMember, *gitlab.Response, error) {
	return g.gitLabClient.GroupMembers.AddGroupMember(groupID, opt)
}

// 根据用户账号获取用户id
func (g *GitLabClient) GetUserIdByUsername(username string) (int, error) {
	opt := &gitlab.ListUsersOptions{
		Username: &username,
	}
	users, _, err := g.gitLabClient.Users.ListUsers(opt)
	if err != nil {
		return 0, err
	}
	if len(users) == 0 {
		return 0, fmt.Errorf("用户不存在")
	}
	return users[0].ID, nil
}

// 获取工作组下的所有的项目
func (g *GitLabClient) GetProjectsByGroupId(groupId int) ([]*gitlab.Project, error) {
	var pro []*gitlab.Project
	opt := &gitlab.ListGroupProjectsOptions{
		ListOptions: gitlab.ListOptions{Page: 1, PerPage: 50},
	}
	for {
		projects, _, err := g.gitLabClient.Groups.ListGroupProjects(groupId, opt)
		if err != nil {
			return nil, err
		}
		pro = append(pro, projects...)
		if len(projects) < 50 {
			break
		}
		opt.Page++
	}

	return pro, nil
}

// 查询所有工作组,包括子分组
func (g *GitLabClient) GetAllGroup(name string) ([]*gitlab.Group, error) {
	var groups []*gitlab.Group
	opt := &gitlab.ListGroupsOptions{
		ListOptions: gitlab.ListOptions{Page: 1, PerPage: 50, OrderBy: "id"},
		Search:      &name,
	}
	for {
		group, _, err := g.gitLabClient.Groups.ListGroups(opt)
		if err != nil {
			return nil, err
		}
		groups = append(groups, group...)
		if len(groups) == 0 {
			break
		}
		if len(group) < opt.PerPage {
			break
		}
		opt.Page++
	}
	return groups, nil
}

小结

提示:NewGitLabController()内已配置忽略https证书校验,直接替换GitLabAccessToken和GitLabApiHost即可使用,封装的api不太完善,可按需引入其他api接口

gitlab官方api doc文档:https://docs.gitlab.com/ee/api/api_resources.html

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值