Kun*_*Waz 6 docker jestjs azure-devops create-react-app
我创建了一个 React 应用程序,并使用 Docker 在 Azure DevOps 中设置了一个完全工作的管道来构建、测试和发布我的应用程序。
我的管道 yaml 文件中的片段:
#----------------------------------------------------------------------
# Build the docker image
#----------------------------------------------------------------------
- task: Docker@2
inputs:
containerRegistry: 'XXXcontainerrepo'
repository: 'XXX'
command: 'build'
Dockerfile: '**/production.Dockerfile'
tags: |
$(Build.BuildNumber)
arguments: '--build-arg buildNumber="$(Build.BuildNumber)"'
displayName: 'Docker build'
#----------------------------------------------------------------------
# Export and publish test results
#----------------------------------------------------------------------
- script: |
export id=$(docker images --filter "label=test=$(Build.BuildNumber)" -q | head -1)
echo "Container ID: ${id}"
docker create --name testcontainer $id
docker cp testcontainer:/app/coverage ./coverage
docker cp testcontainer:/app/junit.xml ./junit.xml
docker rm testcontainer
displayName: 'Copy test results and code coverage reports'
- task: PublishCodeCoverageResults@1
inputs:
codeCoverageTool: 'cobertura'
summaryFileLocation: '$(System.DefaultWorkingDirectory)/coverage/cobertura-coverage.xml'
displayName: 'Publish code coverage reports'
- task: PublishTestResults@2
inputs:
testResultsFormat: 'JUnit'
testResultsFiles: '**/junit.xml'
mergeTestResults: true
failTaskOnFailedTests: true
testRunTitle: 'Jest Unit Tests'
displayName: 'Publish test results'
Run Code Online (Sandbox Code Playgroud)
Docker 文件中的片段:
# run tests
LABEL test=$buildNumber
RUN npm run test -- --reporters=default --reporters=jest-junit --coverage --watchAll=false
Run Code Online (Sandbox Code Playgroud)
当所有测试用例通过后,会生成一个测试报告,然后我从 Docker 容器中复制该报告并使用 Azure 管道中的任务进行发布。

但是,当测试失败时,我会在 Docker 容器中收到错误,并且构建会失败,但不会创建任何报告。当然,我可以在管道构建日志中看到失败的测试,但我在 Azure DevOps 中看不到可用的报告,因为它从未创建,因此无法发布。
当我在本地运行相同的命令时,当所有测试通过或一个或多个测试失败时,我都会在两种情况下创建测试报告。
所以我的问题是,即使使用 Docker 的一个或多个测试失败,是否也可以创建报告?据我了解,失败测试的数量是退出代码,当退出代码!= 0 时,Docker 容器就会失败。
我仍然希望 Docker 构建步骤在创建报告后失败,但为了以防万一,我在测试结果发布任务中设置了一个标志,以便在一个或多个测试失败时使构建失败。
failTaskOnFailedTests: true
更新
将标志添加到 Docker 构建步骤时,continueOnError: true构建将继续进行下一步,但问题仍然存在。测试运行似乎在创建测试和覆盖率报告之前就停止了,可能是由于它生成的非零退出代码导致 Docker 步骤退出。
在复制测试结果步骤中,我得到以下输出:
Error: No such container:path: testcontainer:/app/coverage
Error: No such container:path: testcontainer:/app/junit.xml
Run Code Online (Sandbox Code Playgroud)
这告诉我测试运行没有创建报告,因为非零退出代码停止了 Docker 构建步骤退出。
解决方案
我最终延迟了退出代码,以便带有测试标签的容器完成,从而可用于下一步提取报告文件。
RUN npm run test -- --reporters=default --reporters=jest-junit --coverage --
watchAll=false; \
echo $? > /npm.exitcode;
# if the npm command failed - fail the build here so that we can get the
test-report files regardless of exit code
RUN exit $(cat /npm.exitcode)
Run Code Online (Sandbox Code Playgroud)
我还添加了condition: succeededOrFailed()复制测试结果步骤和发布代码覆盖步骤,以便它们始终运行,即使构建步骤“失败”。
您可以尝试以下链接中的解决方法:
https://github.com/MicrosoftDocs/azure-devops-docs/issues/2183 https://github.com/microsoft/vstest/issues/1848
尝试将“exit 0”添加到该行的末尾,如下所示:RUN dotnet test MyProject.Tests.csproj -c Release --logger "trx;LogFileName=testresults.trx"; exit 0
| 归档时间: |
|
| 查看次数: |
4315 次 |
| 最近记录: |