6月
02
背景
客户通过Jenkins流水线构建镜像上传harbor部署到kubernetes,经过不断的CI/CD,harbor占用空间不断增大,但旧的镜像其实是可以删除掉,保留最新的几个版本供回滚就可以,因此需要制定删除策略,目前情况如下
- 保留每个镜像最新3个版本即可
- 用户通过tag区分环境,比如 definesys/hr:dev.20210601,definesys/hr:uat.20210601,这样就导致如果保留最新3个镜像,有可能都保留了dev.xxx,其他环境的都被删除,因此也要考虑按照环境做分组,只保留每个分组内的最新3个版本即可
harbor本身并没有提供类似的功能,但是harbor有完善的restapi,因此可以自己写工具去实现以上需求。
方案
- java开发清理程序,打包为jar包,通过Main运行
- 通过jenkins打包应用并执行清理动作
之所以选择jenkins运行jar包,是因为jenkins可以提供配置参数界面,可以将清理程序的一些配置项通过jenkins传入,省的再去开发界面,而且jenkins有定时调度的功能,可以实现定时清理的功能。
实现
harbor的restapi非常的完善,而且难能可贵的是,整个harbor web系统也都是通过调用标准api完成所有功能,这样开发者可以很方便查看功能对应的api,只要打开F12查看网络请求即可。harbor也提供了swagger界面用于api的测试,点击harbor web系统左下角就可以进入

本次用到以下几个api
- 获取项目列表:/projects
- 获取仓库列表:/projects/{project_name}/repositories
- 获取镜像列表:/projects/{project_name}/repositories/{repository_name}/artifacts
- 删除镜像:/projects/{project_name}/repositories/{repository_name}/artifacts/{artifact_digest}
所有接口调用都需要经过认证,支持Basic Auth
认证,也就是将用户名密码转成base64通过header传入即可
获取接口都是支持分页,因此需要一页页获取直到没数据为止
jenkins
创建一个带参数的jekins job,参数如下

- harborServer:harbor系统地址
- admin:harbor管理员账号
- password:harbor管理员密码
- reserveCount:保留最新版本个数
- projectWhite:项目白名单
- repositoryWhite:仓库白名单
jenkins执行脚本如下
#!/bin/bash set -e mvn clean package java -jar target/harbor-clean-1.0.jar "$harborServer" "$admin" "$password" "$reserveCount" "$projectWhite" "$repositoryWhite"
带双引号可以避免参数为空参数位置错误问题
执行
jenkins运行后会提示总共删除了多少个镜像

删除后需要登录harbor手动清理才能最终释放磁盘空间,不然只是软删除磁盘空间并不会释放

代码
代码已上传github欢迎star
Address: https://zhengjianfeng.cn/?p=551
no comment untill now