这是我参与8月更文挑战的第18天,活动详情查看:8月更文挑战
需求例子🚊
解决每增加一个项目,就新增一个用户,需要手动去harbor创建用户,这是因为前期在设计kubernetes项目部署时,做了项目隔离,每个项目都有属于自已的namespace和user
类似的例子还有比如自动清理镜像,自动新建项目等等
为了完善自动化流程,调用harbor api完成相应的功能是必不可少的了
安装
官方提供了一键安装脚本,分为离线和在线两种方式,对于访问docker hub比较慢的建议使用离线方式
下载后解压包
tar xzvf harbor-offline-installer-v2.3.1.tgz
tar xzvf harbor-online-installer-v2.3.1.tgz
运行一键安装脚本
cd harbor-offline-installer
./install.sh
访问服务器IP,harbor默认账密admin和Harbor12345
harbor api🚩
harbor要身已经提供了api接口,还集成了swagger文档,点击左下角的Harbot Api V2打开
页面直接可以看需要提供的参数和返回值
用户查询接口例子
- 参数: 提供一个string类型的username, 分页大小和页码选填
- 返回值: 返回string类型的username,以及int类型的user_id
使用 点击页面右边的 Try it out 按扭, 然后在输入框填入值,点击Execute运行 得到结果
api例子⛔
因为这里直接使用的api 是官方提供的,且是域名带路径参数的方式,所以使用curl 命令是直接可以调用, 因此完全可以集成的到shell脚本里面。
创建用户⬆️
curl -u "admin:Harbor12345" -X POST -H "Content-Type: application/json" "https://harbor-test.xxxxx.org/api/v2.0/users" -d @user.json
user.json
{
"user_id": 5,
"username": "zhangsan",
"email": "zhangsan@qq.com",
"password": "Zs20210802",
"realname": "zhangsan",
"role_id": 2
}
获取用户信息⬆️
curl -u "admin:Harbor12345" -X GET -H "Content-Type: application/json" "https://harbor-test.xxxxx.org/api/v2.0/users"
删除用户⬆️
curl -u "admin:Harbor12345" -X DELETE -H "Content-Type: application/json" "https://harbor-test.xxxxx.org/api/v2.0/users/{user_id}"
修改用户密码⬆️
curl -u "admin:Harbor12345" -X PUT -H "Content-Type: application/json" "https://harbor-test.xxxxx.org/api/v2.0/users/{user_id}/password" -d @uppwd.json
# cat uppwd.json
{
"old_password": "Harbor6666",
"new_password": "Harbor8888"
}
harbor sdk🚩
上面虽然使用cur命令可以调用api,也可以方便集成到shell脚本里面,但是我们整个devops是项目化的,自动化的流程使用golang语言使用的项目,所以需要使用golang实现
接下分享2个第三方的harbor sdk的测试结果,最终goharbor-client能够满足增删改查需要,而go-harbor没有增改功能
go sdk❤️
目前在github找到2种go sdk包 github.com/mittwald/go… github.com/TimeBye/go-… go-harbor 实现了 Projects Repositories Artifacts 三组api功能,其他还未实现
goharbor-client 说明文档中不够详细,只简单的说了支持curd操作,具体如何还需要自已调用测试
那么现在 把这2个包都调用测一测
go-harbor1️⃣
使用 1️
现在项目都使用go mod来管理包,所有直接import 同步一下既可
import "github.com/TimeBye/go-harbor"
现在调一下各api看看
- 文档说没有实现user对应api,其实是有的
- 已实现的api目前都只支持3种方法类型Get,List,Delete 没有创建和更新功能
harborClient, err := harbor.NewClientSet("https://harbor-test.xxxxx.org", "username", "password")
if err != nil {
panic(err)
}
query := model.Query{}
//用户
fmt.Println(harborClient.User.Get("1"))
fmt.Println(harborClient.User.List(&query))
fmt.Println(harborClient.User.Delete("6"))
//仓库
fmt.Println(harborClient.V2.Repositories("bitsensor").Get("elastalert"))
fmt.Println(harborClient.V2.Repositories("cloudos").List(&query))
fmt.Println(harborClient.V2.Repositories("cloudos").Delete("cloudos-next-allinone"))
//项目
fmt.Println(harborClient.V2.Get("15"))
fmt.Println(harborClient.V2.List(&query))
fmt.Println(harborClient.V2.Delete("11"))
//制品
fmt.Println(harborClient.V2.Repositories("appsmith").Artifacts("appsmith-editor").List(&query))
fmt.Println(harborClient.V2.Repositories("appsmith").Artifacts("appsmith-editor").Get("latest"))
fmt.Println(harborClient.V2.Repositories("appsmith").Artifacts("appsmith-editor").Delete("latest"))
运行后部分结果✴️
目前来看,该项目只能留待观察,毕竟现在没有我们需要的功能
goharbor-client2️⃣
这个项目有v1和v2版本,因为我们的harbor是2.x的,支持v2版本,这里直接import v2版本的包
import "github.com/mittwald/goharbor-client/v4/apiv2"
因该项目没有文档(因为是按照官方的swagger ui来的),所以只能自行摸索,但是创建了客户端之后发现 该项目语义化非常好,各功能非常好找
看图
在创建client时需要传入的url要带上api
harborClient, err := apiv2.NewRESTClientForHost("https://harbor-test.xxxxx.org/api/", "admin", "Harbor12345")
if err != nil {
log.Println("连接harbor错误",err)
}
创建用户,仓库,项目例子
下面运行成功的例子✴️
harborClient, err := apiv2.NewRESTClientForHost("https://harbor-test.xxxxx.org/api/", "admin", "Harbor12345")
if err != nil {
log.Println("连接harbor错误",err)
}
//新建用户
result, err := harborClient.NewUser(context.TODO(),"zhangsan3","zhangsan3@qq.com","zhangsan3","Zs20210803","")
if err != nil {
log.Println("创建用户错误",err)
}
fmt.Println(result)
//新建项目
var storageLimit int64 = 10
result2, err := harborClient.NewProject(context.TODO(),"zhangsan3",&storageLimit)
if err != nil {
log.Println("创建项目错误",err)
}
fmt.Println(result2)
//新建仓库
legacyModel := legacymodel.RegistryCredential{
AccessKey: "",
AccessSecret : "",
Type: "",
}
result3,err := harborClient.NewRegistry(context.TODO(),"zhangsan3","helm-hub","http://ip:9000",&legacyModel,false)
if err != nil {
log.Println("创建仓库错误",err)
}
fmt.Println(result3)
返回结果,虽然创建返回报错了,但在界面上可以看到刚刚创建的项目
以创建来看,这项目已经能够满足我们的需要求,至于其他的接口,本文就不一一贴出来了,有兴趣的同事自行测试一下既可