GitHub Actions 自动化部署实战:推送代码自动上线

zheng头像
zheng 2026-07-15 18:21
楼主

每次改完代码,手动 scp 上传、手动重启服务、手动清缓存……一套流程走下来,改一行 CSS 也要折腾 5 分钟。更别提哪天手滑把测试环境的代码推到生产环境了。GitHub Actions 就是来解决这个问题的——代码推上去,剩下的它全自动搞定,你甚至可以躺着用手机写代码然后坐等上线。


GitHub Actions 是什么?

GitHub Actions 是 GitHub 内置的 CI/CD 服务。你在仓库里写一个 YAML 配置文件,定义好"什么时候触发"和"做什么事",GitHub 就免费提供虚拟机帮你跑。

对比项 手动部署 GitHub Actions
触发方式 人为操作 git push、定时、手动触发
环境一致性 依赖个人电脑 每次都是干净的虚拟机
出错回滚 手动回滚 配好流程自动回滚
耗时 5-10 分钟 全自动,30 秒-2 分钟
费用 时间成本 公开仓库免费

公开仓库无限免费使用,私有仓库每月 2000 分钟免费额度,个人项目根本用不完。


一、核心概念

GitHub Actions 有几个关键概念,搞清楚了写配置文件才不会晕:

概念 说明
Workflow(工作流) 一个 YAML 文件,定义整个自动化流程
Event(事件) 触发器,比如 pushpull_request、定时 schedule
Job(任务) Workflow 中的一个执行单元,多个 Job 默认并行
Step(步骤) Job 中的每一步,可以运行命令或调用 Action
Action(动作) 可复用的步骤单元,社区有大量现成的
Runner(运行器) 执行 Job 的虚拟机,GitHub 提供 Ubuntu/Windows/macOS


二、你的第一个 Workflow

在仓库根目录创建 .github/workflows/deploy.yml

name: Deploy to GitHub Pages

# 触发条件:推送到 main 分支时触发
on:
  push:
    branches:
      - main

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest      # 用最新的 Ubuntu 虚拟机

    steps:
      # 步骤1:拉取代码
      - name: Checkout
        uses: actions/checkout@v4

      # 步骤2:安装 Node.js
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20

      # 步骤3:安装依赖
      - name: Install Dependencies
        run: npm install

      # 步骤4:构建项目
      - name: Build
        run: npm run build

      # 步骤5:部署
      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_dir: ./dist

把这个文件推到仓库,以后每次 git push,GitHub 就会自动跑这 5 个步骤。


三、触发器详解

除了 push,还有很多触发方式:

# 推到 main 分支
on:
  push:
    branches: [main]

# 发 PR 到 main 时跑测试
on:
  pull_request:
    branches: [main]

# 每天凌晨 3 点自动跑(UTC 时间)
on:
  schedule:
    - cron: '0 3 * * *'

# 手动触发(在 GitHub 网页上点按钮)
on:
  workflow_dispatch:

# 多个事件组合
on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

schedule 用的是 POSIX cron 语法,跟 Linux crontab 一样。注意时区是 UTC,北京时间要减 8 小时。


四、实战:Hexo 博客自动部署到 GitHub Pages

假设你有一个 Hexo 博客,源文件放在 source 分支,生成后的静态文件部署到 main 分支的 Pages。

.github/workflows/hexo-deploy.yml

name: Hexo Deploy

on:
  push:
    branches:
      - source       # 源文件分支

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          ref: source

      - uses: actions/setup-node@v4
        with:
          node-version: 20

      - name: Cache node_modules
        uses: actions/cache@v4
        with:
          path: node_modules
          key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}

      - run: npm install
      - run: npx hexo generate

      - name: Deploy
        uses: peaceiris/actions-gh-pages@v3
        with:
          github_token: ${{ secrets.GITHUB_TOKEN }}
          publish_branch: main      # 部署到 main 分支
          publish_dir: ./public
          force_orphan: true

这里面用了一个 actions/cache@v4,它能把 node_modules 缓存起来,下次构建不用重新 npm install,速度从 2 分钟缩短到 20 秒。


五、实战:自动跑测试,不通过不让合代码

没人 review 的小项目最怕改了一个地方、坏了三个地方。用 Actions 在每次 PR 时自动跑测试:

name: Run Tests

on:
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: '3.12'
      - run: pip install -r requirements.txt
      - run: pytest --cov=./ --cov-report=xml

然后在仓库 Settings → Branches → Branch protection rules,勾选 "Require status checks to pass before merging",把 test 这个 Job 加上。

从此以后,测试不通过的 PR 没法合进 main 分支。


六、用 Secrets 管理敏感信息

数据库密码、SSH 私钥、API Token 这些东西绝对不能写在 YAML 里。用 GitHub Secrets:

仓库 Settings → Secrets and variables → Actions → New repository secret。

Secret 名称 用途
SSH_PRIVATE_KEY 部署到自己的服务器
DOCKER_PASSWORD 推送 Docker 镜像
NPM_TOKEN 发布 npm 包

在 Workflow 中这样引用:

- name: Deploy to server
  uses: appleboy/ssh-action@v1
  with:
    host: ${{ secrets.SERVER_HOST }}
    username: ${{ secrets.SERVER_USER }}
    key: ${{ secrets.SSH_PRIVATE_KEY }}
    script: |
      cd /var/www/myapp
      git pull
      docker compose up -d --build

这样就算有人看到了你的 Workflow 文件,也拿不到真正的密钥。


七、矩阵构建:一次测多个环境

你的项目要同时支持 Python 3.10、3.11、3.12?用矩阵策略一次性全跑:

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        python-version: ['3.10', '3.11', '3.12']
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-python@v5
        with:
          python-version: ${{ matrix.python-version }}
      - run: pip install pytest
      - run: pytest

GitHub 会并行启动 3 个虚拟机,分别跑 3 个 Python 版本的测试。${{ matrix.python-version }} 会被替换成对应的版本号。


八、常用 Actions 速查

GitHub Actions 生态里有很多现成的 Action,不用自己写脚本:

Action 用途
actions/checkout 拉取仓库代码
actions/setup-node 安装指定版本 Node.js
actions/setup-python 安装指定版本 Python
actions/cache 缓存依赖,加速构建
peaceiris/actions-gh-pages 部署到 GitHub Pages
appleboy/ssh-action SSH 到服务器执行命令
docker/login-action 登录 Docker Hub
JamesIves/github-pages-deploy-action 另一个 Pages 部署方案


GitHub Actions 就是你白嫖的 CI/CD 服务器。配置一次,以后只管写代码和 git push,测试、构建、部署全自动。回头看看之前手动 scp 上传的日子,你会觉得那时候的自己真是活在石器时代。

内网穿透实战:frp 让你在家里的电脑也能被公网访问 个人云盘 NextCloud 搭建指南:数据掌握在自己手里

最新回复

暂无回复,来说两句吧

发表评论

站点总访问量:2835