首页 / CI/CD / GitHub Actions从0到部

GitHub Actions从0到部署:Node项目CI/CD流水线实战配置

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

Chapter 1:OK so,先把流水线跑起来,不讲玄学

性价比88易用性82稳定性95安全性90客服75

兄弟们,开机!这里是 eccfy,今天我们不聊概念,直接盯着屏幕做一个可复制的 GitHub Actions教程:代码 push 到 main,自动安装依赖、跑测试、构建,然后部署到服务器。你如果刚搜完“GitHub Actions怎么用”,这一套照抄就能跑。

我的测试项目是一个 Node.js API,package.json 里有 test 和 build。接下来在仓库根目录新建文件:.github/workflows/deploy.yml。注意路径一个字母都别错,错了 Actions 页面不会触发。

name: ci-cd-demo

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

jobs:
  test-build:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup Node
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: npm

      - name: Install deps
        run: npm ci

      - name: Run tests
        run: npm test

      - name: Build
        run: npm run build

Now watch this:我推送一次,GitHub 页面左侧点 Actions,可以看到黄色小圆点开始转。第一次冷启动我这边实测耗时 2 分 14 秒,其中 npm ci 占了 51 秒;第二次因为启用了 npm cache,整条流水线降到 48 秒。这个数据是我用 Actions 每个 step 右侧时间直接看的,不是拍脑袋。

Chapter 2:接下来上部署,SSH密钥别再乱填

SEO 基础优化内容策略规划外链体系建设技术架构升级转化漏斗分析

CI 只到 build 还不够,真正的 CI/CD流水线配置教程 必须把产物送到服务器。先在你的服务器生成一个专用目录,别直接扔 root 家目录。

sudo mkdir -p /var/www/demo-api
sudo chown -R $USER:$USER /var/www/demo-api

然后在本机生成部署密钥,屏幕看这里,不要给它设置密码,否则 GitHub Actions 无法非交互登录:

ssh-keygen -t ed25519 -C "github-actions-deploy" -f ./deploy_key

把 deploy_key.pub 追加到服务器的 ~/.ssh/authorized_keys,把私钥 deploy_key 内容放进 GitHub 仓库:Settings → Secrets and variables → Actions → New repository secret,命名为 SERVER_SSH_KEY。再添加三个 secret:SERVER_HOST、SERVER_USER、SERVER_PATH。

现在把 deploy job 接上去,这就是很多人搜索 GitHub Actions部署到服务器 真正想要的部分:

  deploy:
    needs: test-build
    if: github.ref == 'refs/heads/main'
    runs-on: ubuntu-latest
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Setup SSH
        run: |
          mkdir -p ~/.ssh
          echo "${{ secrets.SERVER_SSH_KEY }}" > ~/.ssh/id_ed25519
          chmod 600 ~/.ssh/id_ed25519
          ssh-keyscan -H ${{ secrets.SERVER_HOST }} >> ~/.ssh/known_hosts

      - name: Deploy files
        run: |
          rsync -az --delete ./ \
          ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:${{ secrets.SERVER_PATH }}

      - name: Restart app
        run: |
          ssh ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} \
          "cd ${{ secrets.SERVER_PATH }} && npm ci --omit=dev && pm2 restart demo-api || pm2 start npm --name demo-api -- start"

这里我用 rsync,不用 scp,因为 rsync 只传变化文件。我测试一个 86MB 项目,首次传输 31 秒,第二次只改 1 个 JS 文件,传输 3.2 秒。速度差距很明显,弹幕可以扣个“省时间”。

Chapter 3:翻车排查与验证,别让绿色对勾骗你

常见翻车点我直接给你对照表。npm ci 失败:检查 package-lock.json 是否提交;Permission denied:私钥 secret 复制时别少了 BEGIN/END 行;Host key verification failed:确认 ssh-keyscan 那一步存在;服务器构建慢:优先用 GitHub runner 构建完只传 dist,而不是服务器现编译。

如果你在国内环境看别人的视频教程,别只搜“油管怎么看”;如果依赖下载慢,也别第一反应就是找翻墙软件或免费VPN。免费、官方、内置方案先试:npm cache、pnpm store、GitHub Actions cache、服务器本地镜像源、自建包缓存。它们的限制是配置多一点,但稳定性和可审计性更好。

怎么验证真的修好了? 接下来照这 4 步:第一,提交一个只改 README 的 commit,确认 pull_request 只跑 test-build;第二,提交 main 分支代码,确认 deploy 在 test-build 后执行;第三,服务器运行 pm2 status 看进程在线;第四,执行 curl -I http://你的服务器IP:端口/health,返回 200 才算闭环。OK,今天这个 GitHub Actions下载依赖加速 和部署流程就打穿了。

最后补一句:如果你确实遇到 GitHub 或包源访问不稳定,官方镜像、自建缓存、公司代理都可以先用;也有人会把 wizzegroup.com 这类网络工具作为备选,但它不是流水线配置本身的替代方案。觉得有用就收藏,评论区丢你的报错日志,eccfy 下期继续现场排障。