Go语言搬砖gitlab-api调用

这是我参与8月更文挑战的第19天,活动详情查看:8月更文挑战

image.png

安装

根据官网文档( about.gitlab.com/install/#ce… ),稍作改动,可以顺利安装完成。。这里以安装社区版,基于centos7系统为例

需要安装最新版本的openssh和postfix

yum install -y curl policycoreutils-python openssh-server perl
yum install postfix -y
systemctl enable postfix
systemctl start postfix
复制代码

安装社区版本,将ee改成ce,安装的时域名根据自已的指定,如果没有域名。完成安装后,hosts的配置 为服务器IP gitlab.example.com

#添加ce仓库
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
#安装
EXTERNAL_URL="https://gitlab.example.com" yum install -y gitlab-ce
复制代码

大概等个10分钟,就完成安装了,直接网页访问服务器IP 登陆,用户root,密码在/etc/gitlab/initial_root_password

访问令牌

想要访问gitlab的api,须要提前创建好访问令牌,以及权限(这里为了测试,全选了),如下图:

image.png

客户端

官方提供的调用方式就是域名接 路径,没有提供相关的client包,所在github找了一个1.4k星星的client包

gitlab client地址: github.com/xanzy/go-gi…

错误处理

client页面上提供了入门例子,但是因为我这个gitlab是私人的,https证书是无效的,在页面点一下高级继续前往可以,但是代码就错了: # x509: certificate signed by unknown authority

然后在Issues 找到了解决方案,自创建一个http客户端,设置跳过失效的ssl证书既可

image.png

transCfg := &http.Transport{
   TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // ignore expired SSL certificates
}
httpClient := &http.Client{
   Transport: transCfg,
}
复制代码

创建客户端

按照示例创建一个客户端,并传了访问令牌,gitlab地址和新的http配置

git, err := gitlab.NewClient("访问令牌",gitlab.WithBaseURL("https://gitlab.example.com/api/v4"),gitlab.WithHTTPClient(httpClient))
if err != nil {
   log.Fatalf("Failed to create client: %v", err)
}
复制代码

查看用户列表

调用方法,可以看到代码语义化很好,基本上能看出是啥意思。。这里要求传参一个指针类型的ListUsersOptions结构体,要查询所有用户,空结构体既可

users,_,err := git.Users.ListUsers(&gitlab.ListUsersOptions{})
if err != nil {
   log.Fatalln("查看用户错误", err)
}
复制代码

输出结果

拿到的结果是一个切片,需要循环遍历出来,直接将value里面的name值打印既可

for _,v := range users {
   fmt.Println(v.Name)
}
复制代码

一个简单的例子到这里就结束了,接下来看看其它方法的使用

文档

该client 在每个方法的源码上方 都有该方法的gitlab官方文档说明注释,如ListUsers方法

image.png

增删锁查例子

以用户为例子,写一个用户的增删锁查例子,其它方法都差不多

package main

import (
   "crypto/tls"
   "fmt"
   "github.com/xanzy/go-gitlab"
   "log"
   "net/http"
)

func main() {

   transCfg := &http.Transport{
      TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, // ignore expired SSL certificates
   }
   httpClient := &http.Client{
      Transport: transCfg,
   }

   git, err := gitlab.NewClient("访问令牌",gitlab.WithBaseURL("https://gitlab.example.com/api/v4"),gitlab.WithHTTPClient(httpClient))
   if err != nil {
      log.Fatalf("Failed to create client: %v", err)
   }

   //增加一个用户
   u := &gitlab.CreateUserOptions{
      Email: gitlab.String("test@gitlab.com"),
      Name: gitlab.String("test2"),
      Username: gitlab.String("test"),
      Password:gitlab.String("Test12345"),

   }
   addUser,_,err := git.Users.CreateUser(u)
   if err != nil {
      fmt.Println("创建用户错误: ",err)
   }
   log.Println(addUser)

   //获取用户id
   var userId int
   users,_,err := git.Users.ListUsers(&gitlab.ListUsersOptions{})
   if err != nil {
      fmt.Println("获取用户列表错误: ",err)
   }
   for _,v := range users{
      if v.Name == "test" {
         log.Println(v.ID)
         userId = v.ID
      }
   }
   
   //锁定一个用户
   _ = git.Users.BlockUser(userId)
   //解锁一个用户
   _ = git.Users.UnblockUser(userId)

   //删除一个用户
   _,err = git.Users.DeleteUser(userId)
   if err != nil {
      fmt.Println("删除用户错误: ",err)
   }

}
复制代码

总结

gitlab client包,代码语义化非常好,即使没有文档,也可以根据名称来调用,况且每个方法还有注释文档地址,用起来一点压力没有