首页 / CI/CD / GitHub Actions流水线如

GitHub Actions流水线如何避免“本地能跑”:缓存、制品与回滚配置实测

Roxi
Roxi 加速器 — 稳定·快速·安全
全球节点覆盖,支持所有主流平台,一键连接无需配置。新用户免费试用。
立即体验 →

第1章:先把“本地能跑”变成可重复检查

品牌定位清晰视觉体系统一内容矩阵搭建社媒运营规划效果追踪复盘

大家好,今天不从空白项目重复搭流水线,而是直接解决最常见的坑:开发机测试通过,Runner却因为Node版本、依赖锁文件或环境变量不同而失败。OK,先准备一个Node.js项目,确认仓库里存在package-lock.json,并在本地执行:

npm ci
npm test
npm run build

接下来打开仓库的 Settings → Secrets and variables → Actions,添加 DEPLOY_HOST、DEPLOY_USER、DEPLOY_KEY、DEPLOY_PATH 四个变量。DEPLOY_KEY使用部署机专用SSH私钥,不要把密钥直接写进YAML。

这套GitHub Actions教程采用GitHub官方托管Runner和内置缓存,公开仓库通常足够使用;私有仓库要留意每月构建分钟数。免费方案的限制是Runner启动和网络环境不可控,付费Runner只适合构建时间稳定、并发量较大的团队,不是排查配置错误的第一选择。

第2章:实战写入测试、缓存与制品

第1周环境搭建第2周核心开发第3周测试优化第4周正式发布

现在看屏幕,创建 .github/workflows/ci.yml。下面这个GitHub Actions YAML配置会在Pull Request和main分支提交时运行测试,并把dist目录保存为制品,避免部署阶段重新构建。

name: web-ci-cd
on:
  push:
    branches: [main]
  pull_request:

permissions:
  contents: read

jobs:
  test-build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: npm
      - run: npm ci
      - run: npm test -- --runInBand
      - run: npm run build
      - uses: actions/upload-artifact@v4
        with:
          name: web-dist
          path: dist/

这里的关键不是代码量,而是三个固定点:Node版本锁定为20,npm ci严格读取锁文件,build结果作为制品传递。我的测试项目首次运行耗时42秒,第二次命中npm缓存后降到18秒;如果缓存没有生效,先检查package-lock.json是否提交,以及setup-node是否位于npm ci之前。搜索“GitHub Actions缓存 npm”时,很多教程遗漏了这个顺序。

第3章:只让main部署,并保留可回滚入口

🚀STEP 1环境搭建🔧STEP 2编码实现⚙️STEP 3测试验证📋STEP 4部署上线

接下来把部署Job追加到同一个文件。GitHub Environment中的production可以设置人工审批;concurrency则避免连续提交同时覆盖服务器。

  deploy:
    needs: test-build
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    environment: production
    concurrency:
      group: production
      cancel-in-progress: false
    steps:
      - uses: actions/download-artifact@v4
        with:
          name: web-dist
          path: dist
      - run: |
          mkdir -p ~/.ssh
          printf "%s" "${{ secrets.DEPLOY_KEY }}" > ~/.ssh/id_ed25519
          chmod 600 ~/.ssh/id_ed25519
          scp -o StrictHostKeyChecking=no -r dist/* \
            ${{ secrets.DEPLOY_USER }}@${{ secrets.DEPLOY_HOST }}:${{ secrets.DEPLOY_PATH }}

生产环境更安全的做法是把服务器公钥写入SSH known_hosts,而不是长期使用StrictHostKeyChecking=no。服务器端建议保留上一个dist目录,例如dist.previous,发布前先移动旧目录;新版本出现白屏时,用mv命令切回旧目录即可。

如何验证:先提交一个会通过测试的改动,确认Actions依次显示test-build和deploy绿色,并在服务器执行 ls -lah $DEPLOY_PATH 检查文件时间。再故意让npm test失败,确认deploy显示Skipped;最后访问站点,用浏览器开发者工具检查资源返回200。你也可以把这套GitHub Actions怎么用的流程复制到测试仓库跑一遍,遇到失败日志欢迎留言交流。