【发布时间】:2020-11-21 06:08:36
【问题描述】:
我创建了一个 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'
来自 Docker 文件的片段:
# run tests
LABEL test=$buildNumber
RUN npm run test -- --reporters=default --reporters=jest-junit --coverage --watchAll=false
当所有测试用例都通过时,会生成一个测试报告,然后我从我的 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
这告诉我测试运行没有创建报告,因为非零退出代码阻止了 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)
我还在复制测试结果步骤和发布代码覆盖率步骤中添加了condition: succeededOrFailed(),以便它们始终运行,即使构建步骤“失败”。
【问题讨论】:
-
您的解决方案为我省去了几个小时的麻烦!您可以在下面发布您的答案,以便我投票吗?它可能会帮助其他人找到解决方案
标签: docker azure-devops jestjs create-react-app