【发布时间】:2021-07-22 07:00:17
【问题描述】:
我创建了一个存储 npm 项目的 docker 映像。 npm 项目有一个运行测试的 npm 脚本。我将Gitlab 用于 CI/CD,我想在其中定义一个作业,该作业将提取我的图像并运行 npm 脚本。这是.gitlab.yml:
stages:
- test
.test-api:
image: $CI_REGISTRY_IMAGE
stage: test
script:
- cd packages/mypackage && npm run test:ci
artifacts:
paths:
- packages/mypackage/test-report.html
expire_in: 1 week
test-api-beta:
extends: .test-api
environment:
name: some-env
variables:
CI_REGISTRY_IMAGE: my_image_name
gitlab 作业失败并出现错误:
> mypackage@1.0.0 test:ci /builds/my-organization/my-project/packages/mypackage
> DEBUG=jest-mongodb:* NODE_ENV=test ts-node --transpile-only --log-error node_modules/.bin/jest --watchAll=false --detectOpenHandles --bail
sh: 1: ts-node: not found
npm ERR! code ELIFECYCLE
npm ERR! syscall spawn
npm ERR! file sh
npm ERR! errno ENOENT
npm ERR! mypackage@1.0.0 test:ci: `DEBUG=jest-mongodb:* NODE_ENV=test ts-node --transpile-only --log-error node_modules/.bin/jest --watchAll=false --detectOpenHandles --bail`
npm ERR! spawn ENOENT
npm ERR!
npm ERR! Failed at the mypackage@1.0.0 test:ci script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
npm WARN Local package.json exists, but node_modules missing, did you mean to install?
npm ERR! A complete log of this run can be found in:
npm ERR! /root/.npm/_logs/2021-04-28T09_05_39_023Z-debug.log
主要问题是错误npm WARN Local package.json exists, but node_modules missing, did you mean to install?。这意味着 gitlab script 在我项目的实际 git 存储库上执行,而不是在 docker 映像上执行。事实上,我的存储库不包含node_modules,因此作业失败。但是gitlab为什么不对实际图片执行script呢?
docker 镜像有一个CMD 指令:
CMD ["npm", "run", "start"]
也许CMD 以某种方式干扰了 gitlab script?
附:手动拉取 docker 镜像并在本地执行 npm 脚本。
这是我的Dockerfile:
FROM node:14.15.1
COPY ./package.json /src/package.json
WORKDIR /src
RUN npm install
COPY ./lerna.json /src/lerna.json
COPY ./packages/mypackage/package.json /src/packages/mypackage/package.json
RUN npm run clean
COPY . /src
EXPOSE 8082
CMD ["npm" , "run", "start"]
编辑:根据 M. Iduoad answer 如果脚本更改如下:
.test-api:
image: $CI_REGISTRY_IMAGE
stage: test
script:
- cd /src/packages/mypackage && npm run test:ci
artifacts:
paths:
- packages/mypackage/test-report.html
expire_in: 1 week
npm 脚本有效。我们需要cd /src/packages/mypackage,因为这是 Dockerfile 中脚本的位置。
【问题讨论】:
标签: docker gitlab continuous-integration gitlab-ci continuous-deployment