深入理解 CI/CD:使用 GitHub Actions 自动化部署 Node.js 项目

一、前言

在现代软件开发中,持续集成(CI, Continuous Integration)持续部署(CD, Continuous Deployment) 已成为提升开发效率和代码质量的重要实践。

本篇文章将带你从零搭建 GitHub Actions,实现 Node.js 项目的自动化构建、测试、部署,涵盖:
GitHub Actions 基本概念
编写 CI/CD 工作流(Workflow)
运行测试(Jest)
自动发布到服务器(PM2 + SSH)
最佳实践与优化策略

🚀 掌握 GitHub Actions,提升团队效率,让代码部署不再是难题!


二、什么是 CI/CD?

2.1 CI/CD 工作流

CI/CD 是现代 DevOps 文化的核心,主要包括:

  • CI(持续集成):开发者提交代码后,自动触发 代码检查、测试、构建 等流程。
  • CD(持续部署):代码通过 CI 后,自动发布到 测试环境 / 生产环境,减少手动操作。

2.2 传统 vs 自动化部署

对比项 传统部署 CI/CD 自动部署
构建方式 本地手动运行 npm build 代码提交自动构建
测试方式 手动执行测试 代码提交自动运行测试
部署方式 手动 SSH 登录服务器 自动化远程部署
可靠性 易出错,难回滚 快速回滚,降低风险

三、GitHub Actions 介绍

GitHub Actions 是 GitHub 内置的 CI/CD 工具,允许开发者自动执行构建、测试、部署等任务

3.1 GitHub Actions 核心概念

组件 作用
Workflow CI/CD 工作流
Job 具体任务(如构建、测试)
Step Job 内的具体步骤
Runner 执行任务的服务器(GitHub 提供免费 Runner)
Event 触发 Workflow 的事件(如 push, pull_request

四、创建 GitHub Actions 自动化部署

4.1 初始化 Node.js 项目

mkdir github-actions-demo && cd github-actions-demo
npm init -y
npm install express jest supertest pm2 --save

创建 server.js

const express = require("express");
const app = express();

app.get("/", (req, res) => res.send("Hello GitHub Actions!"));
app.listen(3000, () => console.log("Server running on port 3000"));

module.exports = app;

创建 tests/server.test.js

const request = require("supertest");
const app = require("../server");

test("GET / should return 'Hello GitHub Actions!'", async () => {
    const res = await request(app).get("/");
    expect(res.text).toBe("Hello GitHub Actions!");
});

4.2 创建 GitHub Actions 配置

在项目根目录创建 .github/workflows/main.yml

name: Node.js CI/CD Workflow

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

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - name: 拉取代码
        uses: actions/checkout@v3

      - name: 安装 Node.js
        uses: actions/setup-node@v3
        with:
          node-version: 18

      - name: 安装依赖
        run: npm install

      - name: 运行测试
        run: npm test

  deploy:
    needs: build  # 只有 build 任务成功后才执行
    runs-on: ubuntu-latest
    steps:
      - name: 部署到服务器
        uses: appleboy/ssh-action@v0.1.7
        with:
          host: ${{ secrets.SSH_HOST }}
          username: ${{ secrets.SSH_USER }}
          key: ${{ secrets.SSH_KEY }}
          script: |
            cd /var/www/github-actions-demo
            git pull origin main
            npm install
            pm2 restart server

五、配置 GitHub Secrets

GitHub Actions 需要 SSH 访问服务器,需要配置 Secrets

  1. 进入 GitHub 项目,点击 Settings > Secrets and variables > Actions
  2. 添加以下 Secrets:
    • SSH_HOST:服务器 IP 地址
    • SSH_USER:服务器 SSH 用户名
    • SSH_KEY:私钥内容(id_rsa

在服务器上设置 SSH Key

ssh-keygen -t rsa -b 4096 -C "github-actions"
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

然后将 id_rsa 复制到 GitHub Secrets SSH_KEY


六、运行 GitHub Actions

提交代码到 GitHub:

git add .
git commit -m "Add GitHub Actions CI/CD"
git push origin main

进入 GitHub Actions 页面:

GitHub 项目 -> Actions -> 查看任务运行状态

成功后,服务器自动更新,项目已部署!🎉


七、优化 GitHub Actions

7.1 并行运行多个 Job

jobs:
  build:
    strategy:
      matrix:
        node-version: [14, 16, 18]
    runs-on: ubuntu-latest
    steps:
      - name: 安装 Node.js
        uses: actions/setup-node@v3
        with:
          node-version: ${{ matrix.node-version }}

效果:多个 Node.js 版本同时运行测试,确保兼容性。

7.2 缓存 node_modules 提高速度

- name: 缓存 node_modules
  uses: actions/cache@v3
  with:
    path: ~/.npm
    key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}

效果:缓存 node_modules,提高安装速度。

7.3 仅在代码变更时运行 CI

on:
  push:
    paths:
      - "server.js"
      - "tests/**"

效果:仅当 server.jstests/ 目录变更时才触发 CI/CD。


八、总结

步骤 GitHub Actions 实现
自动构建 npm install
自动测试 npm test
自动部署 SSH 部署到服务器
并行测试 matrix
缓存优化 actions/cache

🎯 GitHub Actions 是现代 DevOps 流程的核心,通过本篇文章,你已掌握 Node.js 项目的自动化部署流程,助你提升开发效率,让代码交付更快更稳定!🚀 🚀 🚀

Logo

一站式 AI 云服务平台

更多推荐