← 返回资讯
陈默
AI 行业分析师
已审核

CI/CD 落地实录:从 0 到 1 搭建 GitHub Actions 流水线

我们团队从手动部署切换到 CI/CD 用了两周。下面是从零搭建的完整记录。

CI/CD 落地实录:从 0 到 1 搭建 GitHub Actions 流水线

CI/CD 落地实录:从 0 到 1 搭建 GitHub Actions 流水线

我们团队从手动部署切换到 CI/CD 用了两周。下面是从零搭建的完整记录。

第 1 步:确定流水线结构

CODE
代码推送 → 安装依赖 → 代码检查 → 测试 → 构建 → 部署

第 2 步:基础配置

YAML
# .github/workflows/deploy.yml
name: Deploy

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

jobs:
  test-and-deploy:
    runs-on: ubuntu-latest
    
    services:
      postgres:
        image: postgres:16-alpine
        env:
          POSTGRES_PASSWORD: test
        options: >-
          --health-cmd pg_isready
          --health-interval 10s
        ports:
          - 5432:5432
    
    steps:
      - uses: actions/checkout@v4
      
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: 'npm'
      
      - run: npm ci
      
      - run: npm run lint
      
      - run: npm run type-check
      
      - run: npm test
        env:
          DATABASE_URL: postgresql://postgres:test@localhost:5432/test
      
      - run: npm run build

第 3 步:缓存优化

YAML
- uses: actions/cache@v4
  with:
    path: |
      ~/.npm
      ${{ github.workspace }}/.next/cache
    key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-nextjs-

第 4 步:部署到服务器

YAML
- 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 /app
      git pull origin main
      docker compose up -d --build

第 5 步:环境区分

YAML
# 开发环境 - 推送到 dev 分支自动部署
name: Deploy Dev
on:
  push:
    branches: [dev]

# 生产环境 - 手动触发
name: Deploy Production
on:
  workflow_dispatch:  # 手动触发

第 6 步:通知

YAML
- name: Notify on failure
  if: failure()
  uses: slackapi/slack-github-action@v1
  with:
    payload: |
      {
        "text": "部署失败: ${{ github.event.head_commit.message }}"
      }
  env:
    SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }}

关键经验

1. 先跑 lint 再跑 test,lint 更快,先拦截低级错误

2. 缓存 node_modules,每次全量安装太慢

3. 敏感信息用 Secrets,不要硬编码

4. 生产部署用手动触发,不要自动

5. 失败时通知,别等别人告诉你部署挂了

866
14444 阅读
2 评论
分享
链接已复制
编辑说明

本文由 MakeSense 编辑团队撰写并审核。文中引用的数据和观点均经过交叉验证,如有疏漏欢迎在评论区指正。最后更新:2026年07月12日 11:21

陈默

AI 行业分析师

前某大厂 AI 实验室研究员,关注大模型技术演进和商业化落地。写过 200+ 篇行业分析,擅长从产品视角拆解技术趋势。

读者评论 2

技术小白 1周前
作为非技术人员也看懂了,感谢作者的通俗讲解。
回复 点赞 (3)
Dev小王 1周前
终于有人把这个说清楚了,收藏了。
回复 点赞 (8)