GitHub Actions从0到部署:Node项目CI/CD流水线实战配置
Chapter 1:OK so,先把流水线跑起来,不讲玄学
兄弟们,开机!这里是 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密钥别再乱填
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 下期继续现场排障。