测试阶段正在跳过

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

我是 Docker 新手,我有 Dockerfile,Azure Pipelines 使用该文件来构建映像并将其推送到 Azure 容器注册表。

// Dockerfile
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["poc.frontend/poc.frontend.csproj", "poc.frontend/"]
RUN dotnet restore "poc.frontend/poc.frontend.csproj"
COPY ["Tests/poc.frontend/poc.frontend.unittests/poc.frontend.unittests.csproj", "poc.tests/"]
RUN dotnet restore "poc.tests/poc.frontend.unittests.csproj"
COPY . .
WORKDIR "/src/poc.frontend"
RUN dotnet build "poc.frontend.csproj" -c Release

FROM build AS test
LABEL test=true
WORKDIR "/src/poc.tests"
RUN dotnet build "poc.frontend.unittests.csproj" -c Release
RUN dotnet test --test-adapter-path "bin/Release/net6.0/NUnit3.TestAdapter.dll" -c Release --results-directory /testresults --logger "trx;LogFileName=test_results.trx" "poc.frontend.unittests.csproj"

FROM build AS publish
WORKDIR "/src/poc.frontend"
RUN dotnet publish "poc.frontend.csproj" -c Release -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "poc.frontend.dll"]

当构建管道使用此 Dockerfile 作为 Docker@2 任务的一部分时,它会跳过测试部分。构建应用程序后,它立即进入发布部分。

// build-template.yaml
// ... other tasks
    
    - task: Docker@2
      displayName: 'Build and push an image to ACR'
      inputs:
        command: buildAndPush
        repository: ${{parameters.imageRepository}}
        dockerFile: ${{parameters.dockerFile}}
        containerRegistry: sc-acr-sp
        buildContext: $(Build.SourcesDirectory)
        tags: v$(Build.BuildId)

这些是日志显示的内容。

...
#17 [build 9/9] RUN dotnet build "poc.frontend.csproj" -c Release
#17 0.285 MSBuild version 17.3.2+561848881 for .NET
#17 1.000   Determining projects to restore...
#17 1.398   All projects are up-to-date for restore.
##[debug]Agent environment resources - Disk: / Available 18735.00 MB out of 74244.00 MB, Memory: Used 883.00 MB out of 6932.00 MB, CPU: Usage 15.91%
#17 3.825 /src/poc.frontend/Repositories/Mock/MockBasketRepository.cs(15,35): warning CS1998: This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread. [/src/poc.frontend/poc.frontend.csproj]
#17 3.826 /src/poc.frontend/Repositories/Mock/MockBasketRepository.cs(22,35): warning CS1998: This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread. [/src/poc.frontend/poc.frontend.csproj]
#17 3.939   poc.frontend -> /src/poc.frontend/bin/Release/net6.0/poc.frontend.dll
#17 3.956 
#17 3.956 Build succeeded.
#17 3.957 
#17 3.957 /src/poc.frontend/Repositories/Mock/MockBasketRepository.cs(15,35): warning CS1998: This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread. [/src/poc.frontend/poc.frontend.csproj]
#17 3.957 /src/poc.frontend/Repositories/Mock/MockBasketRepository.cs(22,35): warning CS1998: This async method lacks 'await' operators and will run synchronously. Consider using the 'await' operator to await non-blocking API calls, or 'await Task.Run(...)' to do CPU-bound work on a background thread. [/src/poc.frontend/poc.frontend.csproj]
#17 3.957     2 Warning(s)
#17 3.957     0 Error(s)
#17 3.957 
#17 3.957 Time Elapsed 00:00:03.53
#17 DONE 4.0s

#18 [publish 1/2] WORKDIR /src/poc.frontend
#18 DONE 0.0s

...

我应该怎么做才能不让测试阶段被忽视?

azure-devops dockerfile
1个回答
0
投票

在早于 23.0 版本的 Docker 引擎上,旧版 Docker 引擎构建器会处理 Dockerfile 的所有阶段,直到选定的

--target
。即使所选目标不依赖于该阶段,它也会构建一个阶段。

但是,从 Docker Engine 23.0 开始,BuildKit 成为用户的默认构建器。 BuildKit 只构建目标阶段所依赖的阶段。

对于您的情况,启用 BuildKit (DOCKER_BUILDKIT=1):

  • 目标阶段(
    final
    )取决于“
    publish
    ”阶段(
    COPY --from=publish /app/publish .
    )。
  • publish
    ”取决于“
    build
    ”阶段(
    FROM build AS publish
    )。因此,目标阶段也取决于“
    build
    ”阶段。
  • test
    ”阶段不被目标阶段依赖,目标阶段依赖的其他阶段也不依赖于“
    test
    ”阶段。

所以,最后,构建 Dockerfile 时仅执行 '

build
'、'
publish
' 和 '
final
' 阶段。


要禁用 BuildKit,您可以使用以下方法之一:

  1. 设置下面的管道变量。它将使用新值“DOCKER_BUILDKIT=0”映射/覆盖环境变量。

    variables:
      DOCKER_BUILDKIT: 0
    
  2. 直接在“docker build

    ”命令前添加“
    DOCKER_BUILDKIT=0”。它将在禁用 BuildKit 的情况下构建 Dockerfile。

    DOCKER_BUILDKIT=0 docker build xxx
    

相关文档:


© www.soinside.com 2019 - 2024. All rights reserved.