Docker 映像已构建,但在 Azure 管道中运行覆盖率测试时在本地找不到它

问题描述 投票:0回答:1

我想构建并运行覆盖测试并发布到声纳。这是 Dockerfile:

FROM node:12.22.12-buster-slim as base

RUN apt update &&\
    apt install --yes --no-install-recommends \
    python2 \
    make \
    g++

WORKDIR /code

COPY .npmrc package.json package-lock.json ./

RUN npm install

ARG PUBLIC_URL="/web-frontend/"

FROM base as dev

RUN npm install --also=dev

COPY ./ ./

CMD ["npm", "start"]

FROM base as builder

COPY ./ ./

RUN PUBLIC_URL=${PUBLIC_URL} npm run build

FROM nginx:1.25-alpine3.18 AS dist

RUN apk add --no-cache \
    # CVE-2023-43787
    'libx11>=1.8.7-r0'

WORKDIR /app

COPY --from=builder /code/build/ ./

COPY st/nginx.conf /etc/nginx/nginx.conf
COPY st/docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh

ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["nginx", "-g", "daemon off;"]

和管道 yaml:

trigger:
- none

pr:
- none

pool:
    vmImage: 'ubuntu-latest'

variables:
  acr_repository_name: 'webui'
  pkg_version: '0.0.1'
  sprint_number: '0001'
  branch_type: '$(Build.SourceBranchName)'
  build_version: '$(pkg_version)-d$(sprint_number).$(Build.BuildId)'  
  sonar_project_key: 'com.my_domain:$(acr_repository_name)-$(branch_type)'

jobs:
- job: Build
  displayName: 'Build'
  steps:
  - checkout: self
  - script: |
      echo "Build id: $(Build.BuildId)"
      echo "Branch name: $(Build.SourceBranchName)"
      echo "Branch type: $(branch_type)"
      echo "Build version: $(build_version)"
      echo "Souce directory: '$(Build.SourcesDirectory)"
      echo "Tag name: "my_domain.azurecr.io/dir/$(acr_repository_name):$(build_version)""
    displayName: 'Variables info'


  - task: Docker@2
    displayName: 'Build dev image'
    inputs:
      containerRegistry: 'my_domain Container Registry'
      repository: 'dir/$(acr_repository_name)'
      command: 'build'
      Dockerfile: '**/Dockerfile'
      target: 'dev'
      tags: '$(build_version)'

  - task: Docker@2
    displayName: 'Push dev image'
    inputs:
      containerRegistry: 'my_domain Container Registry'
      repository: 'dir/$(acr_repository_name)'
      command: 'push'
      tags: '$(build_version)'

  - script: |
      docker images
    displayName: 'List Docker Images'

  - script: |
      docker run --rm -v $(Build.SourcesDirectory)/coverage:/code/coverage dir/insightui:$(build_version) npm run test:coverage
    displayName: 'Run unit tests'

  - task: PublishPipelineArtifact@1
    inputs:
      targetPath: '$(Build.SourcesDirectory)/coverage'
      artifact: 'coverage'

构建步骤的输出是:

#20 writing image sha256:2aab8942b077ded98d19adc30af6591d0c20c21f930ef4caef3a2fb5158f4abb done
#20 naming to ***/dir/web-ui:0.0.1-d001.001 done

单元测试步骤的输出是:

Script contents:
docker run --rm -v /home/vsts/work/1/s/coverage:/code/coverage /dir/web-ui:0.0.1-d0001.001 npm run test:coverage
========================== Starting Command Output ===========================
/usr/bin/bash --noprofile --norc /home/vsts/work/_temp/4e631df5-e77e-4617-bdd3-8685a8f2a0a8.sh
Unable to find image '/dir/web-ui:0.0.1-d0001.001' locally
docker: Error response from daemon: pull access denied for dir/web-ui, repository does not exist or may require 'docker login': denied: requested access to the resource is denied.
See 'docker run --help'.

docker images 步骤的输出是:

REPOSITORY                           TAG               IMAGE ID       CREATED         SIZE
***/dir/web-ui   0.0.1-d0001.001   2393648ffe25   5 seconds ago   63.9MB

我不明白这里有什么问题。目标是构建图像、进行单元测试并推送到 sonarcloud 报告。我可以在每次运行的声纳中看到一些报告,但覆盖范围是空的,因为本地没有运行单元测试。我什至可以针对本地构建的图像运行

npm run test:coverage
吗?多次尝试改变事情,但没有任何运气。如有任何帮助,我们将不胜感激。

docker unit-testing npm azure-pipelines cicd
1个回答
0
投票

在您的管道中,步骤“

Run unit tests
”只是在单独的会话中启动容器,此步骤完成后可能会被清理。后续步骤(包括
PublishPipelineArtifact@1
)仍将在代理计算机上运行,而不是在上述步骤启动的容器中运行。

  - script: |
      docker run --rm -v $(Build.SourcesDirectory)/coverage:/code/coverage dir/insightui:$(build_version) npm run test:coverage
    displayName: 'Run unit tests'

  - task: PublishPipelineArtifact@1
    inputs:
      targetPath: '$(Build.SourcesDirectory)/coverage'
      artifact: 'coverage'

对于您的情况,我建议您配置 Dockerfile 在构建 Docker 映像时执行构建和测试过程,并生成测试结果的报告文件。然后将生成的报告文件复制到构建的 Docker 镜像之外。要发布代码覆盖率结果,您可以使用

PublishTestResults@2
PublishCodeCoverageResults@2
任务。

  1. Dockerfile
FROM node:12.22.12-buster-slim as base
. . .

FROM base as dev
. . .

FROM dev as builder
. . .

FROM builder as test
ARG BuildId
LABEL test=$BuildId
// Commands to run test and generate the code coverage reported to a specified path.

FROM nginx:1.25-alpine3.18 AS dist
. . .
  1. 管道。
variables: 
  DOCKER_BUILDKIT: 0
  . . .

jobs:
- job: Build
  displayName: 'Build'
  steps:
  . . .

  - task: Docker@2
    displayName: 'Build dev image'
    inputs:
      containerRegistry: 'my_domain Container Registry'
      repository: 'dir/$(acr_repository_name)'
      command: 'build'
      Dockerfile: '**/Dockerfile'
      target: 'dev'
      tags: '$(build_version)'
      arguments: '--build-arg BuildId=$(Build.BuildId)'

  . . .

  - task: PowerShell@2
    displayName: 'Copy test results'
    inputs:
      pwsh: true
      targetType: inline
      script: |
        $images = docker images 
        echo "images" $images 
        $id=docker images --filter "label=test=$(Build.BuildId)" -q | Select-Object -First 1 
        echo "image id:" $id 
        docker create --name copytestresult $id 
        docker cp copytestresult:/testresults ./testresults 
        docker rm copytestresult

    - task: PublishTestResults@2 
      displayName: 'Pusblish test results'
      . . .
© www.soinside.com 2019 - 2024. All rights reserved.