需求
用docker都知道下不来镜像很烦,之前用别人弄好的github action同步了镜像才顺利装好minikube。总不能老用别人的,抄过来改改后才是自己的,万一以后自己想弄点其他东西呢。
怎么弄?当然是抄作业啦。
文章: 无法拉取 gcr.io 镜像?用魔法来打败魔法
https://mp.weixin.qq.com/s/Vt0FRTx1PsoYFdLa0QZzWw
文章作者的github地址: https://github.com/togettoyou/hub-mirror
思路
按照前面文章里面的思路是白嫖github的服务器来下载镜像并上传到阿里云,整个工作流程如下
- 在Github仓库中,按照模板创建issue
- Github Action 检测到有issue创建,运行go代码
- go代码将镜像pull下来然后push到阿里云仓库,push成功则输出output文件运行的服务器上
- Github Action后续步骤中,检查如果有output文件则执行
- 如果有output文件则将output文件里面的内容作为评论回复issue
- 回复成功给issue添加success的label
- 失败则给issue添加failure的label
这里我猜文章作者用 Go Docker SDK的一个原因是方便下载多个平台的镜像,像我就可能用到x86的或者arm64的,然后在代码中也容易拼接输出的内容作为评论回复issue。
动手抄作业
既然大致弄清楚思路了,就可以心安理得的抄作业了。正常人就直接fork原作者的仓库改个变量就可以了。
但是我得体现一下我的工作量啊,不然这文章不就有点短了吗。
抄代码
先把仓库创建好,代码弄好,上传到github
1.仓库初始化
本次执行命令创建文件夹并关联github仓库
mkdir docker-image
cd docker-image
echo "# docker-image" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin https://github.com/WeiYu53111/docker-image.git
git push -u origin main
2.添加工作流配置文件
然后就是添加我们的action配置文件了,首先创建文件夹
mkdir -p .github/workflows
然后添加文件sync.yaml,这里和参考作业的一模一样,只是改了workflow的名字以及go的版本,我以前安装的版本是1.21.4
# workflow 名称name: sync-job
# 当新建或者修改 issues 时,触发当前 workflowon:issues:types:[opened, edited]# 需要执行的任务列表jobs:# 镜像转换任务mirror_transition:# 运行环境runs-on: ubuntu-latest
# 运行条件 => issues 的 label 包含 hub-mirrorif: contains(github.event.issue.labels.*.name, 'hub-mirror')
# 镜像转换任务的步骤列表steps:# 1. 切换分支(默认主分支)-name: Check out code
uses: actions/checkout@v2
# 2. 设置 go 环境-name: Setup go
uses: actions/setup-go@v4
with:go-version:'1.21.4'# 3. 运行 go 代码-name: Run code
run: go run main.go --username=${{ secrets.DOCKER_USERNAME }}--password=${{ secrets.DOCKER_TOKEN }}--repository=${{ secrets.DOCKER_REPOSITORY }}--content='${{ github.event.issue.body }}' --maxContent=11 --outputPath=output.md
# 4. 当成功输出 output.md 文件时,为 issues 添加评论-name: Add comment
if: ${{ hashFiles('output.md') }}uses: actions/github-script@v5
with:script:|
const fs = require('fs')
const data = fs.readFileSync('output.md', 'utf8')
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: data
})# 5. 当以上步骤成功时,为 issues 添加 success 标签-name: Success issues
if: ${{ success() }}uses: actions/github-script@v5
with:script:|
github.rest.issues.addLabels({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
labels: ['success']
})# 6. 当以上步骤失败时,为 issues 添加 failure 标签,并为其添加失败原因评论-name: Failure issues
if: ${{ failure() }}uses: actions/github-script@v5
with:script:|
github.rest.issues.addLabels({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
labels: ['failure']
})
github.rest.issues.createComment({
issue_number: context.issue.number,
owner: context.repo.owner,
repo: context.repo.repo,
body: "[构建失败,点击查看](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})"
})
这个action配置文件中,用了好几个action, 可以通过 GitHub 的marketplace搜索相关的仓库查看使用说明以 用来给issue添加label的action为例,想要什么功能都可以来这里搜,现在社会这么卷,应该啥都有
Github marketplace : https://github.com/marketplace
还有一个用来定时关闭issue的工作流配置
name:'close stale issues'on:workflow_dispatch:schedule:-cron:'00 10 * * *'jobs:stale:runs-on: ubuntu-latest
steps:-uses: actions/stale@v8
with:stale-issue-message:'This issue is stale'days-before-stale:7days-before-close:0days-before-pr-stale:-1days-before-pr-close:-1operations-per-run:1000
3.go脚本copy
本来是想自己模仿思路写一个,看了作者的代码,然后想了想,自己没怎么写过go的代码,浪费时间不说,还没作者写的好,还是直接copy吧,把时间留着干点别的不好。。
vscode中初始化GO项目
go mod init wy/docker-image
然后下载作者的代码放到项目中,结构如下
output.tmpl是模板文件,最终输出结果就是用这个字符串模板渲染的。还有一个vendor目录是下载依赖后,用命令将依赖包copy过来的,这样子在运行的时候,会优先用vendor目录下的依赖,从而加速工作流的速度。
# 设置代理
go env -w GO111MODULE=on
go env -w GOPROXY=https://goproxy.cn,direct
# 下载库
go mod tidy
# 将包复制到项目根目录下,会自动创建vendor目录
go mod vendor
4.新增token,上传代码
因为添加了.github/workflows 文件夹,默认是没有办法提交,会提示
![remote rejected] main -> main (refusing to allow a Personal Access Token to create or update workflow `.github/workflows/close.yaml` without `workflow` scope)
需要设置一下个人令牌
保存token后,修改本地仓库目录的 .git/config 文件,将token添加上去如下
然后就能push成功了
阿里云仓库
先创建个阿里云的仓库,用来存放同步过来的镜像,这个也是最终自己用来pull的地址.
老规矩,先到阿里云搜索 容器镜像服务 然后进入到控制台,点击个人版
创建好之后查看命名空间
以及设置登录密码
Github仓库设置
1.docker仓库信息
然后在setting页面处, 新建
DOCKER_USERNAME
(镜像仓库登录名) 和
DOCKER_TOKEN
(镜像仓库密码)以及
DOCKER_REPOSITORY
三个 Secrets
阿里云仓库地址如下
registry.cn-guangzhou.aliyuncs.com/wy53111
2.issue模板以及label设置
然后还是在setting页面处,开启issue功能,并设置issue模版,我这里issue默认是开的
一定要加上label,模板文本内容
{"platform":"","hub-mirror":["若对OS/ARCH无要求,platform请留空,不要加任何值,默认就是linux/amd64","如需切换arm架构,请修改platform为arm64或linux/arm64/v8","格式:你需要转换的原始镜像$自定义镜像名:自定义标签名 (其中 $自定义镜像名:自定义标签名 是可选的)","以下是三个正确示例","registry.k8s.io/kube-apiserver:v1.27.4","registry.k8s.io/kube-apiserver:v1.27.4$my-kube-apiserver","registry.k8s.io/kube-apiserver:v1.27.4$my-kube-apiserver:mytag","要求:hub-mirror 标签是必选的,标题随意,内容严格按照该 json 格式,每次最多支持转换 11 个镜像","错误的镜像都会被跳过","请确保 json 格式是正确的,比如下面这个是最后一个,后面是没有逗号的","好了,改成你想要转换的镜像吧"]}
删除旧的lable,添加新的Label
3.workflow权限设置
在Settings页面,Action栏目 处的 Workflow permissions` 修改如下
验收成果
github创建issue后等待一会就可以了
版权归原作者 全是操作 所有, 如有侵权,请联系我们删除。