☁️ 自动化交付:CI/CD 流程与云端部署

大家好,我是大布布将军。

在传统的部署模式中,我们可能需要手动登录服务器,拉取代码,运行 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 流程通常会接管:

  1. 构建镜像: 基于我们上一篇的 Dockerfile,构建一个新的 Docker 镜像。
  2. 推送镜像: 将新构建的镜像推送到镜像仓库(如 Docker Hub、阿里云 ACR、AWS ECR)。
  3. 部署到服务器: 通知生产环境的服务器(如 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 全栈工程师学习大纲的所有关键知识点。您现在不仅能写出干净、异步的代码,还能:

  1. TypeScript 保证数据结构。
  2. BFF/Service 架构分离业务逻辑。
  3. ORM/Redis 解决数据持久化和性能问题。
  4. Docker/CI/CD 实现自动化部署和运维。

祝贺您!您已经掌握了一个合格的 Node.js 全栈工程师所需的核心技能。

相关推荐
LYFlied2 小时前
Vue.js 中的 XSS 攻击防护机制详解
前端·vue.js·xss
RisunJan2 小时前
Linux命令-htpasswd命令(创建和管理用于 HTTP 基本认证(Basic Authentication)的密码文件)
linux·运维·http
七宝三叔2 小时前
C#,为什么要用LINQ?
前端
七宝三叔2 小时前
用「点外卖」的例子讲透HttpClient
前端
冥界摄政王2 小时前
Cesium学习第二章 camera 相机
node.js·html·vue3·js·cesium
再睡一夏就好2 小时前
LInux线程池实战:单例模式设计与多线程安全解析
linux·运维·服务器·开发语言·javascript·c++·ecmascript
zfj3212 小时前
Linux第一个用户空间进程init进程的演进过程
linux·运维·网络
leoufung2 小时前
LeetCode 322. Coin Change:从错误思路到正确一维 DP
算法·leetcode·职场和发展
dixiuapp2 小时前
运维报修系统怎么选,核心是主动预防
运维