NodeJS 开发期间的Skaffold测试

2ic8powd  于 2023-03-29  发布在  Node.js
关注(0)|答案(1)|浏览(109)

我正在尝试向Node.js服务添加测试。

# package.json
"scripts": {
    "start": "node src/server.js",
    "dev": "nodemon src/server.js",
    "test": "jest",
    "test-watch": "jest --watchAll"
  },

问题是,如果我使用test-watch,它会停止skaffold管道。

apiVersion: skaffold/v4beta2
kind: Config
metadata:
  name: microservices-quiz-app
build:
  artifacts:
    - image: auth-img
      context: auth
      docker:
        dockerfile: Dockerfile
      sync:
        manual:
          - src: src/**/*.js
            dest: .
test:
  - image: auth-img
    context: auth
    custom:
      - command: npm run test-watch # !!!
manifests:
  rawYaml:
  - auth/k8s/*.yml
  - ingress-srv.yml

运行test-watch后,skaffold dev卡住

Testing images...
Running custom test command: "npm run test-watch"

> auth@1.0.0 test-watch
> jest --watchAll

PASS src/tests/app.test.js
  GET /
    √ responds with a default message (69 ms)

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        3.372 s
Ran all test suites.

另一个问题是当我使用Google Cloud Build时,我得到npm not found
一个三个三个一个
(Is npm run test没有在创建的Node容器中运行(使用auth-img)?在cloudbuild.yaml中指定相同的镜像只是为了运行一些测试会很麻烦)
使用Skaffold进行测试的最佳方法是什么?起初,我将tests文件夹放在src之外,这样它们就不会同步并触发重建,但如果不向上滚动,很容易错过结果。

vmdwslir

vmdwslir1#

默认情况下,测试不会在容器中运行。我们可以显式地使用docker创建一个包含生成的IMAGE的容器。

test:
  # auth
  - image: auth-img-dev
    context: auth
    custom:
      # run test in container
      - command: echo $IMAGE && docker run -e CI=true $IMAGE npm test

但是,在Windows中,我们需要用%IMAGE%替换$IMAGE,所以我认为最好只将其用于持续集成,并在单独的终端窗口中本地运行npm run test-watch。(可能有一种方法可以使用Docker映像执行connect,而不必在本地重新安装依赖项,但你可能负责一个微服务,所以这不是一个很大的麻烦。
我发现有两个不同的Dockerfile和两个skaffold配置更简单。

skaffold.dev.yaml

# less images to build and no tests
apiVersion: skaffold/v4beta2
kind: Config
metadata:
  name: microservices-quiz-app
build:
  artifacts:
    # auth
    - image: auth-img
      context: auth
      docker:
        dockerfile: Dockerfile.dev
      sync:
        manual:
          - src: src/**/*
            dest: .
    # quiz
    - image: quiz-img
      context: quiz
      docker:
        dockerfile: Dockerfile.dev
    # react-client
    - image: react-client-img
      context: react-client
      docker:
        dockerfile: Dockerfile.dev
      sync:
        manual:
          - src: src/**/*
            dest: .
manifests:
  rawYaml:
  - auth/k8s/*.yaml
  - quiz/k8s/*.yaml
  - react-client/k8s/*.yaml
  - jwt-secret.yaml
  - ingress-srv.yaml
  - kafka.yaml

skaffold.yaml

apiVersion: skaffold/v4beta2
kind: Config
metadata:
  name: microservices-quiz-app
build:
  artifacts:
    # auth
    - image: auth-img
      context: auth
      docker:
        dockerfile: Dockerfile
    - image: auth-img-dev
      context: auth
      docker:
        dockerfile: Dockerfile.dev
    # quiz
    - image: quiz-img
      context: quiz
      docker:
        dockerfile: Dockerfile
    # react client
    - image: react-client-img
      context: react-client
      docker:
        dockerfile: Dockerfile
    - image: react-client-img-dev
      context: react-client
      docker:
        dockerfile: Dockerfile.dev
test:
  # auth
  - image: auth-img-dev
    context: auth
    custom:
      # run test in container
      - command: echo $IMAGE && docker run -e CI=true $IMAGE npm test
  # react-client
  - image: react-client-img-dev
    context: react-client
    custom:
      # run test in container
      - command: docker run -e CI=true $IMAGE npm test
manifests:
  rawYaml:
  - auth/k8s/*.yaml
  - react-client/k8s/*.yaml 
  - quiz/k8s/*.yaml
  # - jwt-secret.yaml created manually
  - ingress-srv.yaml

生产skaffold.yaml仍然需要构建开发映像,以便能够运行测试。

Dockerfile.dev

# alpine doesn't work with mongodb-memory-server
FROM node:18
WORKDIR /app
COPY ["package.json", "package-lock.json*", "./"]
RUN npm install
COPY . .
CMD [ "npm", "run", "dev" ]

停靠文件

FROM node:18-alpine

ENV NODE_ENV=production

WORKDIR /app

COPY ["package.json", "package-lock.json*", "./"]

RUN npm install --omit=dev

COPY . .

CMD ["npm", "start"]

生产Dockerfile通常是一个多阶段构建(不确定是否适用于nodejs服务器),例如使用React:

FROM node:18-alpine as builder 
WORKDIR /app
COPY ["package.json", "package-lock.json*", "./"]
RUN npm i
COPY . .
RUN npm run build

FROM node:18-alpine
WORKDIR /app
RUN npm install --global serve
COPY --from=builder /app/dist .
CMD ["serve", "-l", "5173"]

关于Golang:

## Build
FROM golang:1.20-buster AS build

WORKDIR /app

COPY go.mod ./
COPY go.sum ./
RUN go mod download

COPY . .

RUN go build -o /quiz

## Deploy
FROM gcr.io/distroless/base-debian10

COPY --from=build /quiz /quiz

EXPOSE 8080

USER nonroot:nonroot

ENTRYPOINT ["/quiz"]

您还可以使用开发映像作为生产映像的第一个阶段。

相关问题