0


GithubAction同步镜像到阿里云仓库

需求

用docker都知道下不来镜像很烦,之前用别人弄好的github action同步了镜像才顺利装好minikube。总不能老用别人的,抄过来改改后才是自己的,万一以后自己想弄点其他东西呢。

怎么弄?当然是抄作业啦。

文章: 无法拉取 gcr.io 镜像?用魔法来打败魔法
https://mp.weixin.qq.com/s/Vt0FRTx1PsoYFdLa0QZzWw
文章作者的github地址: https://github.com/togettoyou/hub-mirror

思路

按照前面文章里面的思路是白嫖github的服务器来下载镜像并上传到阿里云,整个工作流程如下

  1. 在Github仓库中,按照模板创建issue
  2. Github Action 检测到有issue创建,运行go代码
  3. go代码将镜像pull下来然后push到阿里云仓库,push成功则输出output文件运行的服务器上
  4. Github Action后续步骤中,检查如果有output文件则执行
  5. 如果有output文件则将output文件里面的内容作为评论回复issue
  6. 回复成功给issue添加success的label
  7. 失败则给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后等待一会就可以了
在这里插入图片描述

在这里插入图片描述

标签: 阿里云 github docker

本文转载自: https://blog.csdn.net/wy53111/article/details/143408101
版权归原作者 全是操作 所有, 如有侵权,请联系我们删除。

“GithubAction同步镜像到阿里云仓库”的评论:

还没有评论