如何使用Github Action优雅的同步国外镜像到DockerHub或私有仓库

2023-10-31 17:26:17 浏览数 (3)

0x00 快速入门

描述: GitHub 操作是一个持续集成和持续交付(CI/CD)平台,可用于自动执行生成、测试和部署管道。Github 您可以创建工作流来构建和测试对存储库的每个拉取请求,或将合并的拉取请求部署到生产环境。

Github Action 文档地址: https://docs.github.com/en/actions

Github Action 是什么?

描述: Github Action 是一种自动化工具(不仅仅是 DevOps),用于在 GitHub 上创建、测试和部署软件项目, 还允许您在仓库中发生其他事件时运行工作流,这一点有点类似于Gitlab中的CI,只不过Action更加的强大。

例如,您可以运行工作流,以便在有人在您的仓库中创建新问题时自动添加相应的标签。除此之外,它允许开发人员定义一系列步骤和任务,以响应特定的事件或触发条件, 这些事件可以是代码提交、拉取请求、问题创建等等。

参考地址: https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions

Github Action 有什么用?

描述: Github Action 有以下几个主要用途:

  • 自动化构建和测试:可以在代码提交或拉取请求等事件触发时,自动执行构建和测试任务,确保代码的质量和稳定性。
  • 自动化部署:可以将代码自动部署到云服务、服务器或容器中,减少手动操作的工作量,提高部署效率。
  • 定时任务:可以设置定时触发任务,例如定时生成报告、备份数据等。
  • 持续集成/持续部署(CI/CD):可以将整个软件开发和交付过程自动化,实现持续集成和持续部署,加快软件的迭代和发布速度。
  • 自动化代码审查和格式化:可以使用静态代码分析工具自动检查代码质量,并自动格式化代码,提高代码规范性。
  • 通知和报警:可以在特定事件发生时发送通知或报警,例如代码构建失败、测试未通过等。

使用 Github Action,开发人员可以自动执行各种任务,以便更加高效地管理和自动化他们的开发工作流程,减少手动操作和人为错误,提高开发效率和代码质量。

例如: 运行测试、构建代码、部署应用程序等。它提供了丰富的功能和生态系统,使得开发人员能够更轻松地管理和自动化他们的开发工作流程。

Github Action 组件结构

描述: 您可以将GitHub Actions工作流配置为在存储库中发生事件时触发,例如打开拉取请求或创建问题。 您的工作流包含一个或多个作业,这些作业可以按顺序或并行运行,每个作业都将在其自己的虚拟机运行程序中或在容器中运行,并有一个或多个步骤,这些步骤可以运行您定义的脚本或运行操作,这是一个可重复使用的扩展,可以简化您的工作流程。

GitHub Actions 由如下组件构成:

  • Workflows : 工作流是一个可配置的自动化流程,它将运行一个或多个作业,工作流是由检入到存储库的YAML文件定义的,当由存储库中的事件触发时,工作流将运行,也可以手动触发,也可以按定义的时间表触发。工作流在存储库的.github/workworks目录中定义,一个存储库可以有多个工作流,每个工作流可以执行不同的任务集
  • Events : 事件是存储库中触发工作流运行的特定活动, 例如代码提交、分支提交、PR提交时触发。
  • Runners : 指在触发工作流时运行工作流的服务器系统,简单的说就是运行相关操作的机器 ,GitHub Action 默认提供 Linux、Windows 和 macOS 虚拟机来运行您的工作流程,但您可以在自己的数据中心或云基础架构中托管自己的自托管运行器。
  • Jobs : 作业是在同一个运行器上执行的工作流中的一组步骤。每个步骤要么是将要执行的shell脚本,要么是将运行的操作。步骤按顺序执行,并且相互依赖, 管道步骤之间可以相互的共享数据。
  • Actions : 是 GitHub Actions 平台的自定义应用程序,用于执行复杂但经常重复的任务。使用操作可以帮助减少在工作流文件中编写的重复代码量,您可以编写自己的操作,也可以在GitHub Marketplace(Action 仓库)中找到要在工作流中使用的操作。

Github Action 如何使用?

描述: 此处,我们参考一下Github Action 给我们提供的 Workflows 示例,来帮助我们了解Action的基础语法,以及让我们快速上手使用Github Action。

官方参考地址: https://docs.github.com/en/actions/quickstart

Step 1.创建一个演示仓库image-syncer,点击 action 创建一个 Simple workflow 或者仓库中直接创建 .github/workflows/learn-github-actions.yml文件包含以下内容。

代码语言:javascript复制
# 工作流名称
name: learn-github-actions
# 工作流运行时显示名称
run-name: ${{ github.actor }} is learning GitHub Actions
# 怎样触发工作流
on: 
 push:
   branches: [ "main" ]
 pull_request:
   branches: [ "main" ]
# 工作流程任务(通常含有一个或多个步骤)
jobs:
  # 工作任务名称
  check-bats-version:
    # 将作业配置为在最新版本的Ubuntu Linux运行程序上运行, 注意此处不是Docker Hub中的ubuntu:latest, 而是Github中自己的虚拟主机。
    runs-on: ubuntu-latest
    # 操作步骤
    steps:
      # 使用 actions 脚本,例如,用于在工作流程中检出代码仓库的操作,即它允许你从存储库中检出(拉取)代码
      - uses: actions/checkout@v3
      # 使用 actions 脚本,创建一个 node 运行环境并使用with参数指定了node版本为 14
      - uses: actions/setup-node@v3
        with:
          node-version: '14'
      # 运行一段shell命令或者Shell脚本
      - run: npm install -g bats
      - run: bats -v
      - run: |
          #!/usr/bin/env bash
          echo -e "Hello, Github Actions!nAuthor: WeiyiGeeknBlog: https://blog.weiyigeek.top" 
          whoami && uname -a && ip addr

Step 2.修改完毕 workflow 文件后, 我们可以直接提交到仓库之中,然后将会触发 Workflows 工作流的执行,流程大致如下所示:。

Step 3.提交触发 Workflows 工作流后,我们创建的 learn-github-actions 工作流执行结果如下所示:


偷偷的告诉你哟?极客全栈修炼】微信小程序已开放

可直接在微信里面直接浏览博主文章哟,后续将上线更多有趣的小工具。


0x01 奇技淫巧

1.使用Github Action优雅的同步国外镜像到个人DockerHub中

描述: 由于国内上网环境的原因,在部署某些云原生应用时,通常会遇到镜像无法直接拉取,例如 k8s.io、gcr.io、quay.io 等国外仓库中的镜像,在最开始的做法是使用他人同步到dockerHub仓库中的此版本镜像,或者是采用国外的vps虚拟主机使用docker pull/docker tag/docker push命令的方式复制到dockerHub仓库,但是对于作者来说这两种都不是最优解,因为有可能他人没有同步到你所需要的版本或者说你根本就没有VPS,此时应该怎么办呢。

虽然前面作者写了一篇【如何使用Aliyun容器镜像服务对海外gcr、quay仓库镜像进行镜像拉取构建?】的文章地址: https://mp.weixin.qq.com/s/oQ82YWYRnSIUp-RXLdNS8A

但是作者仍然觉得不够优雅,并且不能批量的同步,此处作者在使用Github-Action构建项目时,突发奇想为何不用Github Action Skopeo工具来同步镜像呢,说做就做,遂有了此篇文章。

Github项目地址(欢迎大家Fork,然后自行更改项目中的secrets即可):

https://github.com/WeiyiGeek/action-sync-images/

操作流程: Step 1.登录Gitub,点击右上角 ,然后创建一个名为action-sync-images的Github仓库。

Step 2.首先点击仓库里中的settins菜单,选择安全选项卡,点击Action,然后将会进入到 Actions secrets and variables,此时为了账号密码,我们需要提前设置我们Docker hub登录的账号密码到项目的secrets中(PS: fork了此项目的朋友可以自行将对应DocekrHub设置为自己的账号密码)。

Step 3.然后点击仓库里中的Action菜单,在选择一个 simple workflows 将会为我们创建一个新的工作流文件或者在项目根目录自行创建一个.github/workflows/sync-images-dockerHub-example.yaml目录文件。

Step 4.此处我们拉取kubernetes 最新的 V1.27.4 版本,使用kubeadm搭建集群此时我们要在Github Action中使用skopeo工具将registry.k8s.io仓库中的镜像同步到docker.io,执行下述shell命令,我们提前获取所需镜像并拼接拷贝命令,若需拷贝到自己的hub仓库请执行自行修改DOCKER_HUBUSERURL,此处我dockerhub用户名是weiyigeek

代码语言:javascript复制
K8SVERSION=1.27.4
DOCKER_HUBUSERURL=docker.io/weiyigeek
kubeadm config images list --kubernetes-version=${K8SVERSION} 2>/dev/null > K8sv1.27.4.txt
for i in `cat K8sv1.27.4.txt`;do
  echo skopeo copy --all docker://${i} docker://${DOCKER_HUBUSERURL}/${i##*/}
done

# 执行结果:
skopeo copy --all docker://registry.k8s.io/kube-apiserver:v1.27.4 docker://docker.io/weiyigeek/kube-apiserver:v1.27.4
skopeo copy --all docker://registry.k8s.io/kube-controller-manager:v1.27.4 docker://docker.io/weiyigeek/kube-controller-manager:v1.27.4
skopeo copy --all docker://registry.k8s.io/kube-scheduler:v1.27.4 docker://docker.io/weiyigeek/kube-scheduler:v1.27.4
skopeo copy --all docker://registry.k8s.io/kube-proxy:v1.27.4 docker://docker.io/weiyigeek/kube-proxy:v1.27.4
skopeo copy --all docker://registry.k8s.io/pause:3.9 docker://docker.io/weiyigeek/pause:3.9
skopeo copy --all docker://registry.k8s.io/etcd:3.5.7-0 docker://docker.io/weiyigeek/etcd:3.5.7-0
skopeo copy --all docker://registry.k8s.io/coredns/coredns:v1.10.1 docker://docker.io/weiyigeek/coredns:v1.10.1

Step 5.将上述执行结果放置在Use Skopeo Tools Sync Image to Docker Hub子步骤下,然后将下述工作流的脚本复制粘贴到sync-images-dockerHub-example.yaml文件中,然后点击commit changes进行提交即可,注意下面是使用skopeo工具进行同步,为啥要使用此工具可以参考作者的【如何使用Skopeo做一个优雅的镜像搬运工】此篇文章地址: https://mp.weixin.qq.com/s/_r9WLMAIbOFEzj7-OWPWDw。

代码语言:javascript复制
# 1.首先,在workflow文件中定义触发器,例如每次推送到主分支时触发同步操作。
# 工作流名称
name: Sync-Images-to-DockerHub-Example
# 工作流运行时显示名称
run-name: ${{ github.actor }} is Sync Images to DockerHub.
# 怎样触发工作流
on:
  push:
    branches: [ "main" ]
  pull_request:
    branches: [ "main" ]

  # Allows you to run this workflow manually from the Actions tab
  workflow_dispatch:

# 2.添加一个job来执行同步操作。在workflow文件中,添加一个job 并指定使用的操作系统环境。
# 工作流程任务(通常含有一个或多个步骤)
jobs:
  syncimages:
    runs-on: ubuntu-latest
    # 在job中添加步骤来执行同步操作。在上述job中,添加步骤来执行skopeo命令,从registry.k8s.io仓库拉取镜像,并将其推送到docker.io仓库。
    steps:
    - name: Checkout Repos
      uses: actions/checkout@v3
      
    - name: Set up Docker Buildx
      uses: docker/setup-buildx-action@v2.9.1
    # 设置项目Secrets以提供Docker Hub登录所需的用户名和密码。
    - name: Login to Docker Hub
      uses: docker/login-action@v2.2.0
      with:
        username: ${{ secrets.DOCKER_USERNAME }}
        password: ${{ secrets.DOCKER_PASSWORD }}
        logout: false
    
    # 使用shell命令批量同步所需的镜像到dockerHub中
    - name: Use Skopeo Tools Sync Image to Docker Hub
      run: |
        #!/usr/bin/env bash
        skopeo copy --all docker://registry.k8s.io/kube-apiserver:v1.27.4 docker://docker.io/weiyigeek/kube-apiserver:v1.27.4
        skopeo copy --all docker://registry.k8s.io/kube-controller-manager:v1.27.4 docker://docker.io/weiyigeek/kube-controller-manager:v1.27.4
        skopeo copy --all docker://registry.k8s.io/kube-scheduler:v1.27.4 docker://docker.io/weiyigeek/kube-scheduler:v1.27.4
        skopeo copy --all docker://registry.k8s.io/kube-proxy:v1.27.4 docker://docker.io/weiyigeek/kube-proxy:v1.27.4
        skopeo copy --all docker://registry.k8s.io/pause:3.9 docker://docker.io/weiyigeek/pause:3.9
        skopeo copy --all docker://registry.k8s.io/etcd:3.5.7-0 docker://docker.io/weiyigeek/etcd:3.5.7-0
        skopeo copy --all docker://registry.k8s.io/coredns/coredns:v1.10.1 docker://docker.io/weiyigeek/coredns:v1.10.1
代码语言:javascript复制

Step 6.commit提交后将会触发工作流执行,此时我们回到仓库的action页面,点击如下图所示的,查看此工作流执行情况,是否有同步失败的情况。

亲,文章就要看完了,不关注一下【全栈工程师修炼指南】吗?

Step 7.最后登录我的Docker Hub ( https://hub.docker.com/r/weiyigeek/ )验证是否已经同步过来, 可以从下图看到已经同步过来了。此后我们便可以使用 docker pull 命令或者是 ctr image pull 命令拉取镜像即可。

温馨提示: 默认Docker Hub我们创建的账号都是免费计划,虽然没有空间的大小限制,但是有下载次数以及下载速度的限制,所以有条件的尽量自行使用内部私有镜像仓库。

扩展补充: Github Action 的 skopeo-copy-action 项目:https://github.com/marketplace/actions/skopeo-copy-action

至此,使用Github Action Skopeo 工具优雅的同步镜像到dockerHub中完毕!

本文至此完毕,更多技术文章,尽情等待下篇好文!

原文地址: https://blog.weiyigeek.top/2023/7-8-766.html

0 人点赞