全部文章

GitHub Actions 入门

CI/CD 工作流配置、自动测试、自动部署与常用 Action 推荐

目录 21 节

GitHub Actions 入门

GitHub Actions 是 GitHub 内置的 CI/CD 平台,通过 YAML 配置自动化工作流。

这页更适合当作“团队自动化起步手册”来用:先把持续集成跑通,再决定是否把部署、发版、定时任务也收进仓库。很多仓库一开始就把 CI/CD 全塞进一个工作流,后面往往会变成难改、难排障、改一个步骤全局受影响。

推荐落地顺序

建议按下面的顺序逐步接入,而不是一次写满所有能力:

  1. 先做最小 CI:安装依赖、类型检查、测试、构建
  2. 再加缓存与矩阵测试,提升速度和兼容性
  3. 然后拆出部署工作流,避免与 CI 混在一起
  4. 最后再补 Release、定时任务、自动清理等辅助流程

如果项目已经接入平台自带的 Git 自动部署(例如 Cloudflare Pages / Vercel / Netlify),那 GitHub Actions 往往更适合负责“检查与门禁”,而不是重复做第二次部署。

工作流拆分建议

常见的目录结构如下:

.github/workflows/
  ci.yml            # lint / test / build
  deploy.yml        # 部署到服务器或平台
  release.yml       # tag / release note / artifact
  nightly.yml       # 定时任务、巡检、备份

拆分的核心好处有两个:

  • 改测试流程时,不会误伤部署逻辑
  • 出问题时能快速判断是“质量检查失败”还是“发布链路失败”

基本结构

在仓库中创建 .github/workflows/ci.yml

name: CI

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
      - run: npm ci
      - run: npm run build
      - run: npm test

触发条件

on:
  push:
    branches: [main, develop]
    paths:
      - "src/**"
      - "package.json"
  pull_request:
    branches: [main]
  schedule:
    - cron: "0 0 * * 1" # 每周一 UTC 0:00
  workflow_dispatch: # 手动触发

常用模板

Node.js 项目

name: CI
on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [20, 22]
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node-version }}
      - uses: pnpm/action-setup@v4
        with:
          version: latest
      - run: pnpm install --frozen-lockfile
      - run: pnpm lint
      - run: pnpm test
      - run: pnpm build

部署到 Cloudflare Pages

name: Deploy
on:
  push:
    branches: [main]

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
      - uses: pnpm/action-setup@v4
        with:
          version: latest
      - run: pnpm install --frozen-lockfile
      - run: pnpm build
      - uses: cloudflare/wrangler-action@v3
        with:
          apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }}
          command: pages deploy dist --project-name=my-project

Docker 构建推送

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

jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: docker/setup-buildx-action@v3
      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - uses: docker/build-push-action@v6
        with:
          push: true
          tags: ghcr.io/${{ github.repository }}:${{ github.ref_name }}

自动发布 Release

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

jobs:
  release:
    runs-on: ubuntu-latest
    permissions:
      contents: write
    steps:
      - uses: actions/checkout@v4
      - uses: softprops/action-gh-release@v2
        with:
          generate_release_notes: true

Secrets 配置

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

在工作流中使用:

env:
  API_KEY: ${{ secrets.API_KEY }}

缓存依赖

- uses: actions/cache@v4
  with:
    path: ~/.pnpm-store
    key: pnpm-${{ hashFiles('pnpm-lock.yaml') }}
    restore-keys: pnpm-

权限与 Secrets 建议

Secrets 能不用就不用,必须用时也尽量最小化权限。

permissions:
  contents: read

常见经验:

  • 纯测试工作流通常只需要只读权限
  • 需要发 Release、写评论、推镜像时,再按需加 contents: writepackages: write
  • 把密钥分仓库环境管理,例如 previewproduction,不要所有环境共用一套
  • 部署前先确认 Secret 名称、作用域和环境是否一致

Cloudflare Pages 场景提醒

如果你已经把仓库直接绑定到 Cloudflare Pages,那么:

  • push 到指定分支后,Pages 会自动拉代码并构建部署
  • 这时 GitHub Actions 更适合做 linttestbuild 预检查
  • 除非你明确需要“手动部署某个产物目录”或“多环境发布”,否则没必要再在 Actions 里额外执行一次 pages deploy

简单说:平台自动部署负责上线,Actions 负责兜底检查,这通常比“双重部署源”更清晰。

常用 Actions

Action说明
actions/checkout@v4检出代码
actions/setup-node@v4安装 Node.js
actions/cache@v4缓存依赖
pnpm/action-setup@v4安装 pnpm
docker/build-push-action@v6Docker 构建推送
cloudflare/wrangler-action@v3Cloudflare 部署
softprops/action-gh-release@v2创建 Release

常见失败排查

依赖安装失败

  • 先确认锁文件是否提交,例如 pnpm-lock.yamlpackage-lock.json
  • 再确认工作流里使用的包管理器是否和本地一致
  • Node.js 版本、pnpm 版本不一致时,也很容易出现“本地能过,CI 失败”

构建失败但本地正常

  • 检查是否遗漏了环境变量
  • 检查构建命令是否依赖本地特有文件或缓存
  • 检查 Linux 大小写敏感问题,例如 import './Utils' 与真实文件名不一致

部署成功但线上异常

  • 先确认部署的到底是不是最新 commit
  • 再确认产物目录是否正确,例如 dist.output/publicbuild
  • 如果平台本身有 Git 自动部署,避免 Actions 再单独部署旧产物

工作流重复执行

同一个仓库同时配置了 pushpull_request、平台自动构建时,很容易出现“看起来像重复跑三次”的情况。需要提前明确:

  • 谁负责质量检查
  • 谁负责真正上线
  • 哪个分支触发预览,哪个分支触发生产部署

延伸阅读

参考链接

阅读建议
  • - 先读标题和摘要,再结合目录决定从哪个章节开始精读。
  • - 看到具体命令、配置或步骤时,尽量在自己的环境里同步验证。
  • - 如果你只是快速查资料,可先看目录和相关文档,再决定是否深入全文。
适合谁看
  • - 希望把零散经验整理成长期可复用工作流的人
  • - 想先建立认知,再决定是否深入实践的人
  • - 希望阅读时顺手建立自己的操作清单或收藏体系的人
执行前检查
  • - 先浏览标题、摘要和目录,带着问题阅读会更高效
  • - 顺手记录真正对你有用的命令、链接和注意事项,避免重复搜索
  • - 如果页面里提到相关文档,尽量一起打开对照,效果通常更完整
同类内容
← 上一篇GitHub 使用技巧