我正在尝试将单元测试作为docker build
流程的一部分运行,但我偶然发现了两个资源:
- .NET Core 多阶段 Dockerfile,在 Azure Pipelines 中具有测试和代码覆盖率
- 使用 Docker 和 Azure Pipelines(第一个引用)运行 .NET Core 单元测试。
基本上,如果我理解正确,他们建议的要点是有这样的东西来运行测试,作为构建最终 docker 映像的一部分:
# First stage
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
LABEL test=true
# Copy files
RUN dotnet test <project-or-solution> --logger trx --results-directory /test-results
# publish the app etc.
# Second stage
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime
COPY --from=build-env ...
然后,在您的管道(例如,Azure Pipelines)中,您执行以下操作来复制/test-results
第一阶段的内容(然后发布结果):
id=$( docker image ls --filter=label=test=true -q | head -n1 )
docker create --name test-container $id
docker cp test-container:/test-results ./test-results
docker rm test-container
但是,这就是我发生的事情:如果一个或多个测试失败,当我创建 my 时test-container
,目录/test-results
不存在;我认为原因是因为测试在负责运行测试的中间容器中失败,整个 Docker 构建失败,因此,中间容器中的更改不会提交到映像,只有成功/test-results
在返回的图像中可用的单元测试--filter=label=test=true
我还看到了另一种方法,其中创建了一个带有 an 的单独图像ENTRYPOINT
以便能够运行测试。
在中运行 C# 单元测试的正确和推荐方法是docker
什么?