我想构建并运行覆盖测试并发布到声纳。这是 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
吗?多次尝试改变事情,但没有任何运气。如有任何帮助,我们将不胜感激。
在您的管道中,步骤“
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
任务。
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
. . .
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'
. . .