照片由 Mikhail Fesenko 拍摄,来自 Unsplash。
我为什么建这条管道每个资深的后端工程师都明白,在现代软件开发中,自动化才是王道。代码发布不应该像赌博一样,而应是一个精心策划且可靠的流程。我搭建了一个复杂的CI/CD流水线,来简化在Docker化环境中运行并托管于AWS Elastic Beanstalk上的Node.js服务器的部署过程。
Node.js 服务搭建:Docker 化部署后端服务是一个基于Docker的Node.js服务器,代码基于TypeScript,使用pnpm作为包管理器。本文主要介绍CI/CD的设置,关于Docker化的部署,我会在后续的文章中介绍。
目前的栈:
- Node.js with TypeScript: 使用 TypeScript 的 Node.js,确保类型安全和可维护性。
- pnpm: 更快且磁盘占用效率更高的包管理器。
- AWS Elastic Beanstalk: 处理基础设施无需关心细节。
- GitHub Actions: CI/CD 管道的核心。
- Codecov: 提供详细的测试覆盖率分析。
持续集成与持续交付的工作流程 #
工作流触发管道会在此情况下触发:
- 推送到
main
和staging
分支。 - 针对这些分支的拉取请求(PR)。
这里是对工作流的一个高层次概览。
- 测试: 运行代码质量检查、类型检查和覆盖率测试。
- 构建: 将应用打包成可部署包。
- 部署: 将可部署包上传到 Elastic Beanstalk 的(预发布)和(生产)环境。
jobs:
test:
name: 测试
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [20]
steps:
- name: 检出代码
uses: actions/checkout@v4
- name: 设置 Node.js
uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
- name: 安装依赖包
run: pnpm install
- name: 代码检查
run: pnpm run lint
- name: 运行带有覆盖率的测试
run: pnpm run test:coverage
- name: 上传覆盖率报告至 Codecov
uses: codecov/codecov-action@v5
with:
token: ${{ secrets.CODECOV_TOKEN }}
在这个阶段,我更注重质量。测试会执行,并生成覆盖率报告,这些报告上传到Codecov以便透明化。这里有一个来自Codecov报告的示例截图:
Jest 配置项这是我用的 Jest 设置:
import type { Config } from '@jest/types';
const config: Config.InitialOptions = {
verbose: true, // 详细模式输出
testEnvironment: 'node', // 测试环境设置为node
preset: 'ts-jest', // 使用ts-jest配置
collectCoverage: true, // 开启代码覆盖率收集
coverageReporters: ['text', 'cobertura'], // 覆盖率报告格式
coverageDirectory: './coverage', // 覆盖率报告存放目录
collectCoverageFrom: [
'src/**/*.ts', // 包含所有.ts文件
'!src/**/*.d.ts', // 排除编译生成的.d.ts文件
'!src/**/index.ts', // 排除index.ts文件
],
moduleNameMapper: {
'@/(.*)': '<rootDir>/src/$1', // 模块路径映射
},
};
export default config;
步骤 2:搭建阶段
一旦测试通过了,应用程序就会被打包。
build:
needs: test
steps:
- name: 打包部署文件
run: |
zip -r deploy.zip . -x "*.git*" -x "node_modules/*"
- name: 上传部署文件
uses: actions/upload-artifact@v4
with:
name: deploy-package
path: deploy.zip
步骤 3:部署
使用 Elastic Beanstalk 进行部署。每个环境,例如 staging
和 production
,都有自己独立的配置。
部署到 staging:
需要: 构建
步骤:
- 名称: 部署到 Elastic Beanstalk
使用: einaregilsson/beanstalk-deploy@v21
配置:
application_name: admin-service
environment_name: staging-env
deployment_package: deploy.zip
示例工作流:从 PR 到生产
- 开发人员从
staging
向main
创建 PR。 - CI 流水线运行: 运行测试、构建并准备部署工件。
- Codecov 报告更新: 显示测试覆盖率指标,确保透明性和责任。
- 部署: 工件自动部署到生产环境。
这里有一段package.json
脚本,支持管道流程。
"scripts": {
"build": "tsc -p tsconfig.build.json", // 构建: "tsc -p tsconfig.build.json" (用于编译项目)
"lint": "eslint . --max-warnings=0", // 代码检查: "eslint . --max-warnings=0" (用于检查代码规范)
"test:coverage": "jest --coverage", // 测试覆盖率: "jest --coverage" (用于生成测试覆盖率报告)
"validate": "pnpm run lint && pnpm run test:coverage" // 验证: "pnpm run lint && pnpm run test:coverage" (用于运行代码检查和生成测试覆盖率报告)
}
为什么这很重要?
不仅仅是为了自动化部署这条管道,它还涉及如下内容:
- 减少人为错误: 手动部署过程存在风险且不一致。
- 确保代码质量: 代码检查、类型检查和测试能确保代码质量。
- 促进协作: Codecov(Codecov)报告的透明性有助于建立团队信任。
在以后的文章里,我将会讲到。
- 怎样用 Docker 托管的 Node.js 服务器部署到“Elastic Beanstalk”。
关注我们!
阿里·法达,高级后端工程师,专注于构建可扩展系统并保持代码规范。
领英: Ali Fadda 网站: alifadda-me 邮箱地址: contact@alifadda.me 邮箱: silvertechguy@gmail.com