无法在GitHub Actions中用Docker Compose为NestJS配置E2E测试
解决GitHub Actions中Docker运行E2E测试时ts-jest缺失的问题
问题分析
本地通过Docker Compose执行npm run test:e2e正常,但GitHub Actions中运行时报错Module ts-jest in the transform option was not found,核心原因是Docker镜像构建时未安装开发依赖——ts-jest属于开发依赖范畴,若构建镜像仅安装生产依赖,会直接导致测试环节找不到该模块。
解决方案
1. 修改Dockerfile的依赖安装逻辑
确保Dockerfile中安装完整依赖(包含开发依赖),避免使用npm install --production这类仅安装生产依赖的命令:
WORKDIR /app COPY package*.json ./ # 安装所有依赖(含开发依赖) RUN npm install COPY . .
2. 多阶段构建优化(可选)
如果需要兼顾生产镜像体积,可采用多阶段构建,测试阶段使用包含开发依赖的镜像阶段:
# 构建阶段:安装全量依赖并编译代码 FROM node:16.17 AS builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build # 生产阶段:仅复制编译产物和生产依赖 FROM node:16.17 WORKDIR /app COPY package*.json ./ RUN npm ci --only=production COPY --from=builder /app/dist ./dist # 测试时指定使用builder阶段镜像,或在测试步骤中临时安装开发依赖
3. 调整GitHub Actions执行步骤
若不想修改Dockerfile,可在测试前临时在容器内安装开发依赖:
- name: 运行E2E测试 run: | docker-compose -f docker-compose.yml build docker-compose -f docker-compose.yml run backend-core npm install docker-compose -f docker-compose.yml run backend-core npm run test:e2e
4. 验证jest配置文件
确认test/jest-e2e.json中的transform配置和rootDir路径正确:
{ "moduleFileExtensions": ["js", "json", "ts"], "rootDir": ".", "testEnvironment": "node", "testRegex": ".e2e-spec.ts$", "transform": { "^.+\\.(t|j)s$": "ts-jest" } }
关键注意点
- 本地环境已提前安装全量依赖,因此测试正常,但Docker镜像默认可能仅包含生产依赖,导致测试环节缺失开发依赖模块。
- 采用多阶段构建时,必须确保测试阶段使用的是包含开发依赖的镜像阶段。
内容的提问来源于stack exchange,提问作者Sanketh B. K
相关产品推荐
相关产品推荐

