侧边栏壁纸
博主头像
张种恩博主等级

一个能运维的 JPG 搬运工

  • 累计撰写 703 篇文章
  • 累计创建 60 个标签
  • 累计收到 24 条评论
Go

使用 Golang 下载阿里云 ACR 仓库中的 Chart

张种恩
2022-02-21 / 0 评论 / 0 点赞 / 93 阅读 / 1,368 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-02-22,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

最近在做 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
0

评论区