扩展课 E1

GitHub 与自动发布

扩展课。每次发布都要 scp、build、push,重复多了容易出错。把代码放到 GitHub,以后只要打一个版本标签,镜像就会自动构建好。

本课目标

  • 用 SSH 密钥把代码推送到 GitHub 私有仓库。
  • 写一个 GitHub Actions 工作流:推送版本标签时自动构建并推送镜像。
  • 用新流程发布一个版本。

先懂概念

  • GitHub:存放 Git 仓库的网站。代码多了一份异地备份,也方便和别人协作。
  • GitHub Actions:GitHub 提供的自动化服务。你在仓库里写一个工作流文件,规定“发生什么事时,自动执行哪些步骤”。
  • Secrets:保存在 GitHub 仓库设置里的密码,工作流运行时可以读取,但不会出现在代码里。GitHub 会尽量在日志里把它们遮住,但不要在工作流里主动打印它们。

新的发布流程:

本地 git tag v4 → git push → GitHub Actions 构建镜像 → 推送到 Docker Hub → 服务器 docker compose pull

跟着做

1. 把公钥添加到 GitHub

注册 GitHub 账号。在自己电脑上显示公钥内容(公钥可以公开,私钥不行):

cat $HOME\.ssh\id_ed25519.pub
cat ~/.ssh/id_ed25519.pub

复制输出的一整行。在 GitHub 点右上角头像 → Settings → SSH and GPG keys → New SSH key,粘贴保存。然后测试:

ssh -T [email protected]

第一次会询问是否信任 GitHub 的指纹。先对照 GitHub 官方公布的 SSH 指纹,一致再输入 yes。看到 Hi 你的用户名! You've successfully authenticated 就成功了。

2. 创建仓库并推送

在 GitHub 点 New repository,名称填 weekly-report,选择 Private(私有),不要勾选添加 README,创建。

在自己电脑上:

cd ~/ai-course/weekly-report
git remote add origin [email protected]:你的用户名/weekly-report.git
git push -u origin main
git push --tags

刷新 GitHub 页面,能看到你的代码和提交记录。再确认一次仓库里没有 .env。

3. 添加 Secrets

先在 Docker Hub 再创建一个访问令牌,描述填 github-actions,权限 Read & Write。一个用途一个令牌,以后某一个泄露了,单独删除即可。

在 GitHub 仓库页面打开 Settings → Secrets and variables → Actions → New repository secret,添加两个:

名称值
DOCKERHUB_USERNAME你的 Docker Hub 用户名
DOCKERHUB_TOKEN刚创建的令牌

4. 写工作流文件

在项目里创建 .github/workflows/docker.yml,可以让 Codex 帮你创建,内容如下:

name: docker

on:
  push:
    tags: ["v*"]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKERHUB_USERNAME }}
          password: ${{ secrets.DOCKERHUB_TOKEN }}
      - uses: docker/build-push-action@v6
        with:
          context: .
          push: true
          tags: ${{ secrets.DOCKERHUB_USERNAME }}/weekly-report:${{ github.ref_name }}

意思是:推送以 v 开头的标签时,在 GitHub 提供的 Linux 机器上检出代码、登录 Docker Hub、按 Dockerfile 构建镜像,并以标签名作为镜像版本推送。

git add -A
git commit -m "自动构建镜像"
git push

5. 用新流程发布 v4

随便改一点东西(比如让 AI 改一下页面标题),然后:

git add -A
git commit -m "修改标题"
git tag v4
git push
git push origin v4

打开 GitHub 仓库的 Actions 标签,能看到一次正在运行的工作流。几分钟后变成绿色的对勾,Docker Hub 上就多了 v4。

在服务器上:

cd ~/apps/weekly-report
vim compose.yaml

把版本改成 v4,然后:

docker compose pull
docker compose up -d

从此不用再 scp 和在服务器上 docker build 了。

你应该看到

  • GitHub 上有你的私有仓库,Actions 里的运行记录是绿色对勾。
  • Docker Hub 上有 v4 标签,服务器运行的是 v4。

常见问题

工作流失败,日志里有 unauthorized? 检查两个 Secrets 的名字是否完全一致、令牌是否有 Write 权限。

推送标签后没有触发工作流? 确认 docker.yml 已经推送到 GitHub 并且在 .github/workflows/ 目录下,标签以小写 v 开头。

git push 很慢或连不上? 中国内地访问 GitHub 不稳定,可以多试几次,或者换个时间。

自检

  • ssh -T [email protected] 能认出我的用户名。
  • 代码在 GitHub 私有仓库里,没有 .env。
  • 推送版本标签后,Docker Hub 自动出现了对应版本。