从本地到生产:迁移到 GitHub Actions 自动化 CI/CD,总结了这 5 个坑

一、为什么迁移到 GitHub Actions?

  • 无需额外服务器:GitHub 原生集成,免费额度充足(2000 分钟/月)
  • 矩阵构建:一次 push 测试多个 Node 版本、多个操作系统
  • 生态丰富:官方 marketplace 有上万 actions
  • 配置即代码 :.github/workflows/*.yml 随仓库版本管理

迁移前 :Jenkins + 自建服务器,维护成本高,构建不稳定。

迁移后:所有流程自动化,PR 自动跑测试,主干自动部署。

二、5 个踩过的坑与解决方案

坑 1:权限不足导致 actions 无法触发

现象 :pull_request 事件中,从 fork 仓库提交的 PR 无法访问 secrets。

原因 :GitHub 出于安全考虑,fork PR 默认不传递 secrets。

解决 :使用 pull_request_target 事件(注意安全风险,需谨慎)。

yaml 复制代码
on:
  pull_request_target:
    branches: [main]

坑 2:缓存失效,每次依赖安装 3 分钟

错误做法 :每次跑 npm ci 都不缓存。

正确做法 :使用 actions/cache 缓存 node_modules。

yaml 复制代码
- name: Cache node_modules
  uses: actions/cache@v4
  with:
    path: ~/.npm
    key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
    restore-keys: |
      ${{ runner.os }}-node-

坑 3:矩阵策略导致重复构建

需求 :需要在 Node 18、20、22 上分别测试,但每次 push 都跑 3 次,浪费时间。

解决 :使用矩阵,但限定只在 push 到 main 或 schedule 时跑多版本,PR 只跑最新版。

yaml 复制代码
strategy:
  matrix:
    node-version: [18.x, 20.x, 22.x]
    # 只在 main 分支跑全部
    exclude:
      - node-version: 18.x
        if: github.ref != 'refs/heads/main'

坑 4:环境变量在 composite action 中不生效

现象 :自定义 action 里读取不到 env 上下文。

解决 :通过 with 参数显式传递,或使用 ${{ env.MY_VAR }} 语法。

坑 5:workflow 复用导致调试困难

问题 :多个项目共用同一个 workflow,出错时难以定位。

解决 :使用可复用 workflow (workflow_call),并增加 workflow_dispatch 手动触发调试。

yaml 复制代码
on:
  workflow_call:
    inputs:
      environment:
        required: true
        type: string
    secrets:
      DEPLOY_KEY:
        required: true

三、完整 workflow 模板(可直接复制)

示例:Node.js 项目 CI + 自动部署到 Vercel

yaml 复制代码
name: CI/CD

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

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

  deploy:
    needs: test
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Deploy to Vercel
        uses: amondnet/vercel-action@v20
        with:
          vercel-token: ${{ secrets.VERCEL_TOKEN }}
          vercel-org-id: ${{ secrets.VERCEL_ORG_ID }}
          vercel-project-id: ${{ secrets.VERCEL_PROJECT_ID }}
          vercel-args: '--prod'

四、常用 actions 清单

用途 Action
缓存依赖 actions/cache@v4
设置 Node actions/setup-node@v4
设置 Python actions/setup-python@v5
上传 artifact actions/upload-artifact@v4
下载 artifact actions/download-artifact@v4
发送 Slack 通知 slackapi/slack-github-action@v1
部署到云服务器 easingthemes/ssh-deploy@main

五、总结

  • GitHub Actions 完全取代 Jenkins 等传统 CI,配置即代码,免费额度足够中小项目。
  • 重点注意:缓存策略 、权限处理 、矩阵优化 、workflow 复用。
  • 文中的所有 workflow 代码均可直接复制使用,根据项目调整即可。

建议收藏本文,下次新项目搭建 CI 时直接抄配置。下一篇写"GitHub Actions 安全最佳实践"。

相关推荐
Mr_Mao5 小时前
告别选型困难!集 VueUse、ahooks、Mantine 于一身:286 个 Hook 的 ReaUse 来了
前端·javascript·react.js
泡海椒6 小时前
趋势分析报表:jquick-pdf折线图PDF生成实战
java·大数据·运维·服务器·前端·pdf
默_笙6 小时前
🚙 一条腿走路会摔:ES 关键词检索、混合召回与 ReRank 裁判
前端·javascript
YIAN6 小时前
从跨域代理到 WebSocket:梳理前端实时通信的底层逻辑与完整实践
前端·websocket
一曲终散6 小时前
创建 SVG 图标预览页面:从零实现到解决 CORS 问题
前端
静默回滚7 小时前
iPhone照片电脑上打不开:HEIC解码从原理到WASM
前端
dsyyyyy11017 小时前
Vue 3 Watch 监视完全指南
前端·javascript·vue.js
航飞光电市场经理7 小时前
人员定位系统“全栈自研”技术解析:从射频前端到定位引擎的架构拆解
前端·架构
Apifox7 小时前
Apifox 9 月更新|CLI 能力升级、GitLab 私有化部署接入与产品体验优化
前端·后端·测试
deli0077 小时前
随机乱跳为什么能画出完美三角形:混沌游戏分形实验室
前端