reactjs - 使用 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 tests
inside Dockerfile.prod
,我会在第一阶段(节点)还是第二阶段(nginx)这样做?
谢谢
编辑:不确定这是否可以被视为已解决,但Reddit上的用户建议RUN npm run test
在RUN npm run build
.
解决方案
推荐阅读
- python - 我可以为这个大型 excel 文件数据集运行什么样的分析?
- python - python中搜索字符串和字符串列表之间的最高百分比Levenshtein距离的最快方法是什么?
- java - 当线程等待java中的输入时,我可以停止线程吗?
- c++ - 如何除以多个数字?
- mysql - 如何根据总收入(net_ph)获得排名?
- html - 在 Tailwind css 中定位 HTML 元素
- javascript - Javascript有奇怪的while循环结果
- php - 如何扩展一个类以覆盖单个导入的类?
- javascript - 使用图像渲染:像素化;导致运动图像波纹垂直像素线
- javascript - 反应调用函数?