首页 > 解决方案 > 使用 travis CI 在 docker 中运行 npm 测试

问题描述

我正在通过 TravisCI 将一个反应应用程序部署到 Heroku。我使用 Heroku 的事实并没有真正影响我要问的内容,我很确定,它只是为了上下文。Travis 成功部署应用程序,直到我在以下位置添加测试步骤(该script部分).travis.yml

language: generic
sudo: required
services:
- docker
before_install:
- docker build -t myapp:prod -f Dockerfile.prod .
script:
- docker run -e CI=true myapp:prod npm run test
after_success:
- docker build -t myapp:prod -f Dockerfile.prod .
- echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_ID" --password-stdin
- docker push myapp:prod
deploy:
  provider: heroku
  app: myapp
  skip_cleanup: true
  api_key:
    secure: <my_key>

但是,myDockerfile.prod是一个多阶段节点 + nginx,其中 nginx 阶段不保留任何节点或 npm 内容:

# build environment
FROM node:13.12.0-alpine as builder

# set working directory
WORKDIR /app

# add `/app/node_modules/.bin` to $PATH
ENV PATH /app/node_modules/.bin:$PATH

# install app dependencies
COPY package.json ./
COPY package-lock.json ./

# some CI stuff I guess
RUN npm ci
RUN npm install react-scripts@3.4.1 -g --silent
COPY . ./
RUN npm run build

# production environment
FROM nginx:stable-alpine
COPY nginx.conf /etc/nginx/conf.d/default.conf

# If using React Router
COPY --from=builder /app/build /usr/share/nginx/html

# For Heroku
CMD sed -i -e 's/$PORT/'"$PORT"'/g' /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'

因此,我的理解是.travis.yml尝试npm run test在我的 nginx 容器中运行该命令并且无法执行 npm 命令(没有安装节点,对吗?)。因此,在诸如之类的 SO 答案的指导下,我开始将命令添加到该 nginx 阶段,例如

COPY package.json ./
COPY package-lock.json ./
RUN apk add --update npm

但我意识到我可能以错误的方式处理这个问题。我应该通过 Travis 添加 npm 吗?也就是说,我是否应该.travis.yml在该scripts部分中包含类似的docker run -e CI=true myapp:prod apk add --update npm内容以及其他必要的内容?这会导致 nginx 图像更小,不是吗?但是,我会在 node 阶段遇到 package.json 问题Dockerfile.prod吗?

总之,要使用 TravisCI 测试使用 nginx 服务的 dockerized react 应用程序,我应该在什么时候将 npm 安装到我的图像中?它是作为 in 的一部分发生script还是.travis.yml发生在Dockerfile.prod? 如果推荐到npm run testsinside Dockerfile.prod,我会在第一阶段(节点)还是第二阶段(nginx)这样做?

谢谢

编辑:不确定这是否可以被视为已解决,但Reddit上的用户建议RUN npm run testRUN npm run build.

标签: reactjsdockernginxnpmtravis-ci

解决方案


推荐阅读