最近在做 CD 自动化相关的开发,遇到一个需求需要从阿里云容器镜像服务(ACR)提供的 Helm Chart 仓库中下载已有的 Chart。
问题在于,阿里云提供了专有的 acr 协议来供镜像的拉取,而现有的开源的 go helm client 是不支持这个协议的,就这个问题我咨询了阿里云的相关人员,他们给我提供了如下代码:
package main
import (
"fmt"
cm "github.com/chartmuseum/helm-push/pkg/chartmuseum"
"io/ioutil"
)
var (
fileURL = "https://xxx.cn-shenzhen.cr.aliyuncs.com/<namespace>/<repository>"
username = "xxx"
password = "xxx"
chartname = "xxx"
chartversion = "0.1.0"
)
func main() {
client, _ := cm.NewClient(
cm.URL(fileURL),
cm.Username(username),
cm.Password(password),
cm.AutoTokenAuth(true),
)
resp, err := client.DownloadFile("/charts/" + chartname + "-" + chartversion + ".tgz")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(resp)
b, err := ioutil.ReadAll(resp.Body)
defer resp.Body.Close()
if err != nil {
fmt.Println(err)
return
}
if resp.StatusCode != 200 {
fmt.Println(resp.StatusCode)
return
}
ioutil.WriteFile(chartname+"-"+chartversion+".tgz", []byte(b), 0666)
}
该代码本身逻辑没问题,但是该代码库对应的 go mod 文件头定义是有错误的,并且由于太久没有更新,它引用的 docker 相关依赖已经失效,所以要在 go mod 文件中做一些 replace
操作,如下:
module testProject/learn_t/helm_client_t/t3
go 1.17
require github.com/chartmuseum/helm-push v0.10.2
require k8s.io/helm v2.16.1+incompatible // indirect
replace github.com/docker/docker => github.com/moby/moby v0.1.2
replace github.com/chartmuseum/helm-push => github.com/AliyunContainerService/helm-acr v0.8.2
评论区