首页 公告 项目 RSS

使用github action自动推送你的镜像到dockerhub

September 24, 2020 本文有 1632 个字 需要花费 4 分钟阅读

简介

其实github action出来已经很久了,但是我一直没有什么场景去使用他,之前写了一个xiaomi路由器的exporter,正好试一试

操作

首先clone一下代码

git clone https://github.com/bboysoulcn/miwifi-exporter.git

之后就是新建目录

在项目根目录创建.github/workflows目录

mkdir -p .github/workflows

之后在这个目录里面新建一个yaml文件,什么名字都可以

vim ci.yaml

添加如下内容

name: ci
on:
  push:
    branches:
      - master
jobs:
  build-and-deploy-image:
    runs-on: ubuntu-latest
    steps:
      # 拉取master分支
      - name: Checkout
        uses: actions/checkout@master
      # 设置qemu来编译多个平台的镜像
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v1
      # 设置buildx
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v1
      # 配置缓存加快编译速度
      - name: Cache Docker layers
        uses: actions/cache@v2
        with:
          path: /tmp/.buildx-cache
          key: ${{ runner.os }}-buildx-${{ github.sha }}
          restore-keys: |
            ${{ runner.os }}-buildx-            
      # 登陆dockerhub
      - name: Login to DockerHub
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      # 编译并且推送到dockerhub
      - name: Build and push
        uses: docker/build-push-action@v2
        with:
          push: true
          platforms: linux/386,linux/amd64,linux/arm/v6,linux/arm/v7,linux/arm64
          cache-from: type=local,src=/tmp/.buildx-cache
          cache-to: type=local,dest=/tmp/.buildx-cache
          tags: |
            bboysoul/miwifi-exporter:latest
            bboysoul/miwifi-exporter:v1.0.0            
      # 微信提醒
      - name: WeChat Work notification by markdown
        uses: chf007/action-wechat-work@master
        env:
          WECHAT_WORK_BOT_WEBHOOK: ${{secrets.WECHAT_WORK_BOT_WEBHOOK}}
        with:
          msgtype: markdown
          content: miwifi-exporter 编译完成

说下流程

-> 拉取master分支 -> 设置qemu来编译多个平台的镜像 -> 设置buildx -> 配置缓存加快编译速度 -> 登陆dockerhub -> 编译并且推送到dockerhub -> 微信提醒

然后说下具体的用法,其实和很多流水线一样GitHub action也是用很多步骤串联起来做cicd的,个人感觉现在不用yaml文件去定义流水线的工具都是垃圾

name 就是去定义这个流水线的名字,如果不写,那么就是当前这个文件的文件名,最好写一下
on 就是使用什么事件去触发这个流水线,比如上面就是当master有push事件就会触发这个流水线,当然你可以定义多个事件来触发比如pull_request事件,有一个好玩的点就是你可以定义一个pull_request事件加一个比如企业微信机器人提醒的step来及时收到你的项目pull_request,更多的事件可以看下面

https://docs.github.com/cn/actions/reference/events-that-trigger-workflows#

之后就是定义jobs,build-and-deploy-image是这个job的名字,你可以写任何其他相关的名字

runs-on 表示你要运行任务的虚拟机环境,目前支持

  • Windows Server 2019
  • Ubuntu 20.04
  • Ubuntu 18.04
  • Ubuntu 16.04
  • macOS Catalina 10.15

详细的可以看

https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idruns-on

steps 就是定义这个job的每个步骤每个步骤都有不同的参数,一般来说每个步骤都有一个action,你可以使用use命令去使用action,具体的action可以去marketplace去寻找

https://github.com/marketplace?type=actions

action 方便了我们做很多以前必须要编写脚本做的事情,比如登陆到dockerhub你只要使用docker/login-action@v1这个action就可以了,不需要关注什么docker login等操作,with定义了这个action所要使用的参数,这个参数如果是一个变量的话就需要写成${{secrets.WECHAT_WORK_BOT_WEBHOOK}}这种形式,name就是定义这个step的名字,当然你也可以添加自己的环境变量,只要使用env命令就可以,详细的可以看下面

https://docs.github.com/en/actions/reference/workflow-syntax-for-github-actions#jobsjob_idsteps

关于编译多个平台的镜像

你可以看到,这里我使用了qemu action,这个是编译多个平台镜像的关键,你可以在

https://github.com/docker/setup-qemu-action

这个地方查看他的详细使用方式

关于构建镜像的缓存

对于docker镜像的构建加上构建缓存还是十分有必要的,在没有添加构建缓存的时候我的构建时间接近10分钟,因为是多个平台镜像的构建,所以速度会很慢,但是添加了构建缓存之后,构建的时间降到了5分钟左右,明显提高了构建的速度

其他骚操作

其实github action已经被人家用来操作一些其他的用途,比如定时任务管理工具,你只要在on命令下添加cron表达式就可以,比如

on:
  push:
  schedule:
    - cron: '0 21 * * *'

这样你就可以定义一些任务来让github给你定时执行

还有就是下载一些我们不能访问,但是国外的人都可以访问到的文件,你应该懂我在说什么,比如你想下载一段youtube上的视频,你就可以使用github action去下载,然后上传到artifact中,之后你只要下载artifact就可以了

或者说你可以在里面运行一个frp的客户端,然后你就可以把它作为一个免费的云服务器来使用了

或者还有就是: 挖矿??????

欢迎关注我的博客www.bboy.app

Have Fun