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

简介

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

操作

首先clone一下代码

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

之后就是新建目录

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

mkdir -p .github/workflows

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

vim ci.yaml

添加如下内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
name: ci
on:
push:
branches:
- master
jobs:
build-and-deploy-image:
runs-on: ubuntu-latest
steps:
# 拉取master分支
- name: Checkout
uses: actions/[email protected]
# 设置qemu来编译多个平台的镜像
- name: Set up QEMU
uses: docker/[email protected]
# 设置buildx
- name: Set up Docker Buildx
uses: docker/[email protected]
# 配置缓存加快编译速度
- name: Cache Docker layers
uses: actions/[email protected]
with:
path: /tmp/.buildx-cache
key: ${{ runner.os }}-buildx-${{ github.sha }}
restore-keys: |
${{ runner.os }}-buildx-
# 登陆dockerhub
- name: Login to DockerHub
uses: docker/[email protected]
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
# 编译并且推送到dockerhub
- name: Build and push
uses: docker/[email protected]
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/[email protected]
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/[email protected]这个action就可以了,不需要关注什么docker login等操作,with定义了这个action所要使用的参数,这个参数如果是一个变量的话就需要写成$这种形式,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表达式就可以,比如

1
2
3
4
on:
push:
schedule:
- cron: '0 21 * * *'

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

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

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

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

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

Have Fun

欢迎关注我的其它发布渠道