从本地到生产:迁移到 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 安全最佳实践"。

相关推荐
之歆7 小时前
Vue商品详情与放大镜组件
前端·javascript·vue.js
再吃一根胡萝卜8 小时前
如何把小米 MiMo 接入 CodeBuddy,打造私有 Agent
前端
负责的蛋挞9 小时前
异步HttpModule的实现方式
java·服务器·前端
AC赳赳老秦9 小时前
防火墙规则批量配置实战:OpenClaw 自动生成模板、批量下发与合规性校验全解析
java·开发语言·人工智能·python·github·php·openclaw
丹宇码农12 小时前
把 HLS 字幕玩出花:zwPlayer 如何让 M3U8 视频支持全文搜索、翻译与码率自适应
前端·javascript·音视频·hls·视频播放器
2501_9437823512 小时前
【共创季稿事节】猜数字游戏:二分法思维与交互式反馈
前端·游戏·microsoft·harmonyos·鸿蒙·鸿蒙系统
GV191rLvq12 小时前
基于Socket实现的最简单的Web服务器【ASP.NET原理分析】
服务器·前端·asp.net
吠品12 小时前
LangChain 里 tool_call_id 为空?一次 MCP 工具集成的排查记录
前端
微信开发api-视频号协议12 小时前
企业微信二次开发中的文件系统设计:媒体资源、临时文件与业务附件
前端·微信·企业微信·媒体·ipad·微信开放平台