全网搜索了下Harbor 2.0 API,几乎全是Linux curl或者python版本,java版本的很少,至少我找到的没调用成功,因为工作需要,将jar包或者前端静态文件制作成docker镜像。腾讯TKE并未提供这种支持,历经一番手动传输到VM再用linux命令上传,完全是拼体力。为了解决这种低效率问题,我写了个web版本的工具用来替代繁琐的手动敲命令制作、上传镜像。
1、核心Maven 依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.38</version>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
</dependencies>
2、核心思路
? ? 先用springweb组件的上传文件功能将构建镜像的jar(或者前端静态文件)上传到服务器,再通过java调用linux shell脚本实现docker镜像制作、并推送至Harbor镜像仓库。
3、实现难点
由于调用了Linux shell进行一系列操作,最开始想将Linux执行shell的内容通过websocket的方式显示到前端,后来考虑到到制作镜像的Dockerfile基本变化不大不会频繁改动,所以本身制作镜像、push镜像出错概率很低,所以只需等shell执行完毕后调用下Harbor API确定下push的镜像是否存在即可。找了一圈没用找到java版本可用的调用Harbor API实际成功的代码,主要是Harbor用了
Authorization来进行授权验证,经过研究找出java版实现的关键代码:
httpGet.setHeader("Authorization", "Basic "+Base64.getUrlEncoder().encodeToString((HARBOR_USERNAME + ":" + HARBOR_PASSWORD).getBytes()));
完整的源码见本人github:https://github.com/kakahu2015/harbor-demo?
|