别再本地 docker build 了!教你用 GitHub Actions 搭建全自动流水线,真香

别再本地 docker build 了!教你用 GitHub Actions 搭建全自动流水线,真香
作者:小明同学
链接:https://zhuanlan.zhihu.com/p/1985333395300050862
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

说实话,你是不是也经历过这种“垃圾时间”:

代码终于写完了,兴冲冲地在本地终端敲下docker build,然后……

电脑风扇开始狂转,CPU 温度飙升,你甚至不敢切出去看视频,生怕卡顿。好不容易构建完了,还要docker push,盯着那个慢吞吞的进度条,祈祷网络别断。

这一套流程下来,少说十几二十分钟没了。如果中间发现有个标点符号写错了?好家伙,推倒重来。

这就叫“被工具玩了”,而不是“玩工具”。

今天我要给大家安利一个我用了很久、相见恨晚的神器组合:GitHub Actions + Docker Hub

简单说,就是把“构建”和“上传”这两件费时费力的事,从你的本地电脑,转移到 GitHub 的服务器上去做。

Github Action 是 Github 推出的一个持续集成和持续交付的平台,能够让你自动化你的编译、测试和部署流程。

重点是:它完全免费,速度飞快,而且全自动。

这就好比你写好菜谱(代码),不用自己进厨房(本地构建),直接把菜谱扔给微软请的免费大厨(GitHub Actions),他做好了直接端上桌(发布到 Docker Hub)。

怎么搞?我不整那些虚头巴脑的概念,直接上实操,保姆级教程,包教包会。

第一步:准备好你的“菜谱”和“厨房”

首先,你得有个 GitHub 账号,和一个 Docker Hub 账号(存镜像的地方)。

在你的 GitHub 项目里,必须得有一个Dockerfile。这个大家都懂,就是告诉机器怎么打包你的程序。

第二步:把“钥匙”交给 GitHub(关键!)

这是很多新手最容易卡住的地方。

你要让 GitHub 帮你上传镜像,你得给它权限,但你肯定不能把密码直接写在代码里吧?那样全世界都看见了。

正确做法是这样:

1.打开你的 GitHub 仓库,点击Settings(设置)。

2.找到左侧的Secrets and variables->Actions

3.点击New repository secret

我们需要添加两个“暗号”:

  • DOCKER_USERNAME:填你的 Docker Hub 用户名。
  • DOCKER_PASSWORD:填你的 Docker Hub 密码(或者 Access Token,建议用 Token 更安全)。

这样,GitHub 就在后台悄悄记住了你的身份,别人看代码是绝对看不到的。

第三步:告诉保姆“该干活了”

接下来,我们要写一个脚本,告诉 GitHub:“嘿,只要我更新了代码,你就立刻帮我干活!”

在你的项目根目录下,建立一个文件夹:.github/workflows(注意前面的点)。 在里面新建一个文件,名字随便取,比如docker-publish.yml

复制下面这段代码进去(虽然是代码,但很好懂,我加了人话注释):

name: Build and Push Docker Image

on:
  push:
    branches: [ master ] # 构建的分支,可以根据需要修改
  pull_request:
    branches: [ master ] # 触发构建的分支,可以根据需要修改
  workflow_dispatch: # 添加 workflow_dispatch 事件,支持手动触发

jobs:
  build:
    name: Push Docker image to multiple registries
    runs-on: ubuntu-latest
    # 显式声明权限,遵循最小权限原则
    permissions:
      packages: write # 推送镜像到 GHCR
      contents: read  # 读取源码
      attestations: write # 写入构建证明
      id-token: write # OIDC 认证,用于签名
    steps:
      # 1. 检出代码
      - name: Check out the repo
        uses: actions/checkout@v4
	  # 2. 安装 QEMU (支持 ARM64 等多架构)
      - name: Set up QEMU
        uses: docker/setup-qemu-action@v3
      # 3. 初始化 Buildx (使用 docker-container 驱动)
      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3
	  # 4. 登录 Docker Hub
      - name: Log in to Docker Hub
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      # 5. 登录 Registry
      - name: Log in to the Container registry
        uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      # 6. 生成元数据 (Tags & Labels)
      - name: Extract metadata (tags, labels) for Docker
        id: meta
        uses: docker/metadata-action@v5
        with:
          images: |
            jumploop/webssh # Docker Hub仓库名称
            ghcr.io/${{ github.repository }}
          tags: |
            latest
            ${{ github.sha }}
      # 7. 构建并推送 (核心步骤)
      - name: Build and push Docker images
        id: push
        uses: docker/build-push-action@v6
        with:
          context: .
          file: ./Dockerfile
          push: true
          platforms: linux/amd64,linux/arm64
          tags: ${{ steps.meta.outputs.tags }}
          labels: ${{ steps.meta.outputs.labels }}
      # 8. 镜像签名与证明 (增强安全性)
      - name: Generate artifact attestation
        uses: actions/attest-build-provenance@v2
        with:
          subject-name: ghcr.io/${{ github.repository }}
          subject-digest: ${{ steps.push.outputs.digest }}
          push-to-registry: true

第四步:见证奇迹

保存,提交代码,Push 到 GitHub。

打开 GitHub 仓库的Actions标签页,你会看到一个小绿点在转圈。点进去,你会发现 GitHub 的服务器正在疯狂为你通过云端宽带拉取依赖、编译代码。

通常几分钟后,那个圈圈变成绿色的对号。

这时候你去 Docker Hub 刷新一下,崭新的镜像已经躺在那儿了。

写在最后

为什么要折腾这个?

除了省电省网费,更重要的是它能让你养成“自动化”的思维

以后无论你在哪里,用着多烂的电脑,甚至是用 iPad 写代码,只要你把代码往 GitHub 一推,云端的流水线就开始自动运转。

等哪天服务器挂了,你只需要一条拉取命令就能恢复,而不是满头大汗地在本地重新打包。

把重复的工作交给机器,把时间留给自己。这才是程序员该有的“偷懒”方式。

趁热打铁,现在就去给你的项目加个 Actions 吧,那种看着绿灯自动亮起的感觉,真的很爽。