文章目录
概要
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