大家好,我是大布布将军。
在传统的部署模式中,我们可能需要手动登录服务器,拉取代码,运行 npm run build,然后重启服务。这个过程慢、容易出错,而且无法应对高频率的更新。
现代工程实践要求我们实现 CI/CD (Continuous Integration / Continuous Delivery 或 Deployment) ,即持续集成/持续交付(部署) 。
1. CI/CD 流程概述:工程化的生命线
CI/CD 就像一条高度自动化的流水线,确保每一次代码提交都能经过严格的测试,并安全地到达用户手中。
-
持续集成 (CI): 关注开发过程。开发者频繁将代码合并到主分支,自动化系统(如 Jenkins, GitHub Actions, GitLab CI)会自动执行构建、测试、代码质量检查。
-
持续交付/部署 (CD): 关注发布过程。
- 交付 (Delivery): 代码准备好随时可以部署,但由人工触发发布。
- 部署 (Deployment): 自动将代码部署到生产环境。
对于 Node.js BFF 服务,我们主要关注 CI 阶段的自动化测试 和 CD 阶段的容器部署。
2. 实践项目:基于 GitHub Actions 的 CI 流程
我们以最主流的 GitHub Actions 为例,实现一个简单的 CI 流程。
步骤一:配置工作流文件
在你的项目根目录创建 .github/workflows/ci.yml 文件。
YAML
# 📁 .github/workflows/ci.yml
name: Node.js CI
# 1. 触发条件:当代码被推送到 main 分支,或发起 Pull Request 时触发
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build-and-test:
runs-on: ubuntu-latest # 在最新的 Ubuntu 虚拟机上运行
strategy:
# 在 Node.js 18 和 20 两个版本上都进行测试
matrix:
node-version: [18.x, 20.x]
steps:
- uses: actions/checkout@v4 # 检出代码到工作区
- name: Use Node.js ${{ matrix.node-version }}
# 使用官方 action 设置 Node.js 版本
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
# 2. 运行依赖安装
- name: Install Dependencies
run: npm install
# 3. 运行代码检查和测试(这是 CI 环节的核心)
- name: Run ESLint and TypeScript check
run: npm run lint # 确保代码风格和类型检查通过
- name: Run Unit Tests
run: npm run test # 运行 Jest/Mocha 等测试框架的单元测试
核心价值: 任何开发者在提交代码到主分支前,系统都会自动在云端虚拟机上运行上述步骤。一旦测试失败,合并就会被阻止,有效保证了主分支的稳定性。
3. 持续部署 (CD):Docker 镜像的云端之旅
在 CI 环节通过后,CD 流程通常会接管:
- 构建镜像: 基于我们上一篇的
Dockerfile,构建一个新的 Docker 镜像。 - 推送镜像: 将新构建的镜像推送到镜像仓库(如 Docker Hub、阿里云 ACR、AWS ECR)。
- 部署到服务器: 通知生产环境的服务器(如 Kubernetes 或简单的 VPS):有一个新版本的镜像已准备就绪。
示例:部署到 Docker 服务器
最简单的 CD 部署场景是利用 SSH:
YAML
# 4. 部署步骤(在 CI 成功后执行)
- name: Log in to Docker Registry
uses: docker/login-action@v3
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Build and push Docker image
id: docker_build
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: your-docker-registry/bff-service:${{ github.sha }} # 使用 commit ID 作为 Tag
- name: Deploy via SSH
uses: appleboy/ssh-action@v1.0.0
with:
host: ${{ secrets.PROD_SSH_HOST }}
username: ${{ secrets.PROD_SSH_USER }}
key: ${{ secrets.PROD_SSH_KEY }}
script: |
# 登录生产服务器后执行的命令
docker pull your-docker-registry/bff-service:${{ github.sha }}
docker stop bff-container || true
docker rm bff-container || true
docker run -d --name bff-container -p 3000:3000 your-docker-registry/bff-service:${{ github.sha }}
注意: 实际生产环境通常使用 Kubernetes (K8s) 进行部署,但理解上述简单的 SSH 部署逻辑是掌握 CD 的第一步。
4. 运维与监控:确保服务健康
部署成功不代表工作结束。你还需要:
-
进程管理: 如果不使用 Docker,可以使用 PM2 来管理 Node.js 进程。PM2 可以利用多核 CPU 启动多个 Node.js 实例(即集群模式 Cluster Mode),并提供自动重启和日志管理。
-
可观测性 (Observability) :
- 监控 (Monitoring): 收集 CPU、内存、延迟、错误率等指标。
- 告警 (Alerting): 当关键指标超出阈值时(例如错误率超过 5%),立即通知开发人员。
总结
至此,您已经完成了 Node.js 全栈工程师学习大纲的所有关键知识点。您现在不仅能写出干净、异步的代码,还能:
- 用 TypeScript 保证数据结构。
- 用 BFF/Service 架构分离业务逻辑。
- 用 ORM/Redis 解决数据持久化和性能问题。
- 用 Docker/CI/CD 实现自动化部署和运维。
祝贺您!您已经掌握了一个合格的 Node.js 全栈工程师所需的核心技能。
