通过 Github Actions 自动构建 ZFile 镜像并推送到 Docker Hub

发布于 2022-05-22
上文 提到 ZFile 的 Docker 镜像构建过程,不过需要手动在服务器上执行命令构建并推送,对服务器网络和配置都有一定要求。

前言

上文 提到 ZFileDocker 镜像构建过程,不过需要手动在服务器上执行命令构建并推送,对服务器网络和配置都有一定要求。

本文来介绍如何使用 Github Actions 来自动构建并推送。

创建 Github Actions 配置文件

github 项目中 /.github/workflows/ 目录下创建文件 build.ymlyml 文件名称可以随意输入。

name: Build ZFile Docker Image And Push To Docker Hub  # workflow 的名字

#on: [push, pull_request] # push 和 pull_request 时会触发
on:
  workflow_dispatch:  # 手动触发

jobs:
  docker:
    name: Publish Docker Image   # 任务名称
    runs-on: ubuntu-18.04        # 执行环境
    env:
      REPO: ${{ secrets.ENTITY_DOMAIN_REPO }}   # 推送到哪个 docker hub 仓库, 如 zhaojun1998/zfile

    steps:
      - name: Checkout                  # 检出代码
        uses: actions/checkout@v2

      - name: Set up QEMU               # 设置 QEMU 环境,用来模拟操作系统,用来编译 arm64 镜像和 amd64 镜像
        uses: docker/setup-qemu-action@v2
        with:
          platforms: all

      - name: Set up Docker Buildx      # 设置 Docker Buildx 环境
        id: buildx
        uses: docker/setup-buildx-action@v2
        with:
          version: latest

      - name: Inspect builder           # 查看 builder 状态
        run: |
          echo "Name:      ${{ steps.buildx.outputs.name }}"
          echo "Endpoint:  ${{ steps.buildx.outputs.endpoint }}"
          echo "Status:    ${{ steps.buildx.outputs.status }}"
          echo "Flags:     ${{ steps.buildx.outputs.flags }}"
          echo "Platforms: ${{ steps.buildx.outputs.platforms }}"

      - name: Login to Docker Registry   # 登录到 Docker Registry
        run: echo '${{ secrets.DOCKERHUB_PASS }}' | docker login -u ${{ secrets.DOCKERHUB_USER }} --password-stdin

      - name: Build Docker Image         # 编译镜像并推送,在--platform后面指定需要兼容的平台列表
        run: docker buildx build -t $REPO:latest --platform linux/amd64,linux/arm64 --push .

配置变量

上方配置文件中所有 ${{ secrets.xxxx }} 都是变量,这个需要在 Github 仓库设置中配置,这样敏感信息,如账号密码,不用写在配置文件中,可以避免信息泄露。

配置方式如图所示:

触发 Actions

推送上方配置文件到登陆 Github 仓库后,点击 Run workflow 即可运行。

然后经过一两分钟等待后,查看日志,已经运行完成了,在 DockerHub 上也能看生成的结果。