docker build
you run the tests as one more step in building the final image. Let's look at a simple example. Suppose we have two projects: web applications and unit tests:GuidProvider
and looks like this: [Fact] public void Never_return_a_empty_guid() { // Arrange & Act var provider = new GuidProvider(); var id = provider.Id; // Assert Assert.NotEqual(Guid.Empty, id); }
FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base WORKDIR /app EXPOSE 80 FROM microsoft/dotnet:2.1-sdk AS build WORKDIR /src COPY CiCd.sln . COPY WebApplication/WebApplication.csproj WebApplication/ COPY WebApplication.Test/WebApplication.Test.csproj WebApplication.Test/ RUN dotnet restore COPY . . WORKDIR /src/WebApplication RUN dotnet build --no-restore -c Release -o /app FROM build as test WORKDIR /src/WebApplication.Test RUN dotnet test FROM build AS publish WORKDIR /src/WebApplication RUN dotnet publish --no-build -c Release -o /app FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "WebApplication.dll"]
docker build -t webapplication .
GuidProvider
which always returns Guid.Empty
), so the image build fails: Step 15/22 : RUN dotnet test ---> Running in 423c27696356 Build started, please wait... Build completed. Test run for /src/WebApplication.Test/bin/Debug/netcoreapp2.1/WebApplication.Test.dll(.NETCoreApp,Version=v2.1) Microsoft (R) Test Execution Command Line Tool Version 15.9.0 Copyright (c) Microsoft Corporation. All rights reserved. Starting test execution, please wait... [xUnit.net 00:00:00.96] WebApplication.Test.GuidProviderTests.Never_return_a_empty_guid [FAIL] Failed WebApplication.Test.GuidProviderTests.Never_return_a_empty_guid Error Message: Assert.NotEqual() Failure Expected: Not 00000000-0000-0000-0000-000000000000 Actual: 00000000-0000-0000-0000-000000000000 Stack Trace: at WebApplication.Test.GuidProviderTests.Never_return_a_empty_guid() in /src/WebApplication.Test/GuidProviderTests.cs:line 17 Test Run Failed. Total tests: 1. Passed: 0. Failed: 1. Skipped: 0. Test execution time: 2.8166 Seconds The command '/bin/sh -c dotnet test' returned a non-zero code: 1
docker build
, so we cannot provide a file with test results (which can be generated using the dotnet test
), this file remains in an intermediate container, and we cannot easily get him from there. docker run
alternative. At first we will lift the separate container and we will start tests in it. For both containers we will be able to use the same Dockerfile. First of all, you need to remove the line that starts the dotnet test
from the Dockerfile, since now we will run them separately. Ok, now let's use the docker run
, which allows you to run Dockerfile before a certain stage. In our case, this is the testing phase: docker build -t webapplication-tests . --target test
-target
parameter indicates which stage to build. Please note that the generated image will be named " webapplication-tests ". Now you can run our tests and at the same time save the file " test-results.trx " with the results of their execution in the container's " tests " directory: docker run -v/c/tests:/tests webapplication-tests --entrypoint "dotnet test --logger trx;LogFileName=/tests/test-results.trx"
docker build -t webapplication .
version: '3.5' services: webapplication: image: webapplication build: context: . dockerfile: Dockerfile webapplication-tests: image: webapplication-tests build: context: . dockerfile: Dockerfile target: test
version: '3.5' services: webapplication: environment: - ASPNETCORE_ENVIRONMENT=Development ports: - "8080:80" webapplication-tests: entrypoint: - dotnet - test - --logger - trx;LogFileName=/tests/test-results.trx volumes: - ${BUILD_ARTIFACTSTAGINGDIRECTORY:-./tests/}:/tests
docker-compose run webapplication-tests
BUILD_ARTIFACTSTAGINGDIRECTORY
environment BUILD_ARTIFACTSTAGINGDIRECTORY
or the default value is ./tests
. The final image is done like this: docker-compose build webapplication
Action: Build service images
and specify the path to docker-compose.yml.Action: Run a specific service image
and specify the name of the container Service Name: webapplication-tests
. Also, do not forget about the path to docker-compose.yml and docker-compose.override.yml. The value for Run in Background
should not be set, otherwise the container will be launched in “Detached mode” and the task will not wait for the results of the tests to be executed but will proceed to the next step. The “Publish Test Results” task will attempt to publish results that may not yet exist, since the launch of tests takes some time. Run this task: Even if a previous task has failed, unless the build was canceled
. This parameter is important because otherwise the results will never be published unless the tests pass. Search folder: $(Build.ArtifactStagingDirectory)
Source: https://habr.com/ru/post/430958/
All Articles