为了账号安全,请及时绑定邮箱和手机立即绑定

如何搭建CI/CD流水线实现无缝的生产级Node.js部署

照片由 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: 提供详细的测试覆盖率分析。

持续集成与持续交付的工作流程 #

工作流触发

管道会在此情况下触发:

  • 推送到 mainstaging 分支。
  • 针对这些分支的拉取请求(PR)。
工作流程

这里是对工作流的一个高层次概览。

  1. 测试: 运行代码质量检查、类型检查和覆盖率测试。
  2. 构建: 将应用打包成可部署包。
  3. 部署: 将可部署包上传到 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 进行部署。每个环境,例如 stagingproduction,都有自己独立的配置。

    部署到 staging:  
        需要: 构建  
        步骤:  
          - 名称: 部署到 Elastic Beanstalk  
            使用: einaregilsson/beanstalk-deploy@v21  
            配置:  
              application_name: admin-service  
              environment_name: staging-env  
              deployment_package: deploy.zip
示例工作流:从 PR 到生产

  1. 开发人员从stagingmain创建 PR。
  2. CI 流水线运行: 运行测试、构建并准备部署工件。
  3. Codecov 报告更新: 显示测试覆盖率指标,确保透明性和责任。
  4. 部署: 工件自动部署到生产环境。
那些魔法背后的剧本

这里有一段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

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消