GitHub Actions 实战:从零搭建 CI/CD 流水线

在 DevOps 实践中,CI/CD(持续集成 / 持续交付)是提升团队交付效率的核心引擎。过去部署靠手工敲命令、容易出错;现在用 GitHub Actions,只要 push 代码就能自动测试、构建、部署。本文手把手带你从零搭建一条可用的 CI/CD 流水线。

一、GitHub Actions 核心概念

动手前先理清四个关键词,否则配置文件会看不懂:

  • Workflow(工作流):一个 YAML 文件,定义”什么事件触发、跑哪些任务”。存放在 .github/workflows/ 目录。
  • Job(任务):一组按顺序执行的 step,默认多个 job 并行。不同 job 之间默认隔离。
  • Step(步骤):job 里的最小执行单元,可以是一条 shell 命令或一个 Action。
  • Action(动作):可复用的功能单元(如 actions/checkout 拉代码),社区和官方提供了海量现成 Action。

二、第一个 Workflow:自动跑测试

新建 .github/workflows/ci.yml,下面是一个 Node.js 项目的最小可用配置:

name: CI

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

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - name: 拉取代码
        uses: actions/checkout@v4

      - name: 安装 Node.js
        uses: actions/setup-node@v4
        with:
          node-version: '20'
          cache: 'npm'

      - name: 安装依赖
        run: npm ci

      - name: 运行测试
        run: npm test

只要往 main 分支 push,GitHub 就会自动起一个 Ubuntu 环境,拉代码、装 Node、跑测试。红色 ✅ 变绿就说明流水线通过。

三、用缓存加速依赖安装

每次都重新 npm install 很慢。用 actions/cache 缓存 node_modules 或包管理器缓存目录,能把构建时间从几分钟压到几十秒:

      - name: 缓存 npm 依赖
        uses: actions/cache@v4
        with:
          path: ~/.npm
          key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }}
          restore-keys: |
            ${{ runner.os }}-npm-

四、多环境部署:矩阵(Matrix)

需要在多个 Node 版本或操作系统上验证?用 matrix 一次跑多组组合:

jobs:
  build:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node: [18, 20, 22]
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}
      - run: npm ci && npm test

五、与 Docker 集成:构建并推送镜像

很多项目最终要打成 Docker 镜像部署。结合我们之前写的 Docker Compose 一键编排实战,可以在 CI 里自动构建镜像并推送到镜像仓库:

  docker:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: 登录镜像仓库
        uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USER }}
          password: ${{ secrets.DOCKER_TOKEN }}
      - name: 构建并推送
        uses: docker/build-push-action@v6
        with:
          context: .
          push: true
          tags: myrepo/app:${{ github.sha }}

六、安全管理密钥(Secrets)

密码、Token 绝不能写进 YAML。在仓库 Settings → Secrets and variables → Actions 里添加,Workflow 中通过 ${{ secrets.NAME }} 引用,GitHub 会自动脱敏。

七、常用官方 Action 速查

Action作用
actions/checkout拉取仓库代码
actions/setup-node / setup-python安装运行环境
actions/cache缓存依赖加速
docker/build-push-action构建推送镜像
actions/upload-artifact上传构建产物

八、常见坑

  • 权限不足:推送镜像或写 Release 需要 permissions: write-all
  • 密钥没加:本地能跑、CI 报错,多半是 secret 名字拼错。
  • 缓存 key 不变:锁文件没改 → 缓存永远命中也永远不更新,注意加锁文件 hash。
  • Windows 换行符:shell 脚本在 Windows runner 上 \r\n 会炸,统一用 ubuntu 跑脚本类 step。

总结

GitHub Actions 把”测试—构建—部署”标准化成了几行 YAML。从今天的最小 CI 起步,再逐步接入 Docker 构建、多环境矩阵、自动部署,你的团队就能告别手工上线、减少”在我机器上是好的”这类问题。后续还可以探索 GitHub Environments 做审批式发布,把生产部署关进”双人复核”的安全栏里。

上一篇 PostgreSQL 慢查询优化:执行计划解读与索引调优实战
下一篇 Redis 缓存设计:穿透、击穿、雪崩与最佳实践