рд╣рдо рдХрдВрдЯреЗрдирд░ рдХреЛ Azure DevOps (VSTS) рдореЗрдВ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ

.рдиреЗрдЯ рдХреЛрд░ рдХреЗ рдЖрдЧрдорди рдХреЗ рд╕рд╛рде, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдУрдПрд╕ рдкрд░ рди рдХреЗрд╡рд▓ рдЕрдкрдирд╛ рдХреЛрдб рдЪрд▓рд╛рдиреЗ рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рдЕрд╡рд╕рд░ рд╣реИ, рдмрд▓реНрдХрд┐ рд╡рд┐рднрд┐рдиреНрди рдУрдПрд╕ рдкрд░ рднреА рдЗрд╕рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВред рдФрд░ рдХреНрдпрд╛ рдЕрд▓рдЧ рдУрдПрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╕рдордп рдбреЙрдХрд░ рд╕реЗ рдмреЗрд╣рддрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ?

рдкрд░реАрдХреНрд╖рдг рдЕрдзрд┐рдХ рдореВрд▓реНрдпрд╡рд╛рди рд╣реИ рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рдФрд░ рд▓рдХреНрд╖реНрдп рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рдмреАрдЪ рдХреЛрдИ рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реИред рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рдЖрдк рдХрдИ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдпрд╛ рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдбреЙрдХрд░ рдХреЗ рд╕рд╛рде, рдЖрдк рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдореЗрдВ рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдПрдХ рдЕрд▓рдЧ рдЫрд╡рд┐ рдХреИрд╕реЗ рдмрдирд╛рдИ рдЬрд╛рдП, рдЬрд┐рд╕рдореЗрдВ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗ рдФрд░ VSTS рдореЗрдВ рдЗрд╕ рд╕рднреА CI / CD рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рд╣рд╛рд▓ рд╣реА рдореЗрдВ Azure DevOps рд╣реИред

рдпрджрд┐ рдЖрдк рдбреЙрдХрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рд╢рд╛рдпрдж рдЕрдкрдиреЗ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдорд▓реНрдЯреА-рд╕реНрдЯреЗрдЬ рдмрд┐рд▓реНрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдк рдПрдХ рд╣реА рдбреЙрдХрд░ рдлрд╝рд╛рдЗрд▓ рдХреЗ рднреАрддрд░ рдмрд╛рдпрдиреЗрд░рд┐рдЬрд╝ (рдмрд┐рд▓реНрдб рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдФрд░ рдЕрдВрддрд┐рдо рдЫрд╡рд┐ (рд░рдирдЯрд╛рдЗрдо рдЫрд╡рд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдкрдХреЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдПрдХ рдХрдВрдЯреЗрдирд░ рд╢рд╛рдорд┐рд▓ рд╣реИ, рддреЛ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдЕрдВрддрд┐рдо рдЫрд╡рд┐ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЖрдо рддрд░реАрдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдбреЙрдХрд░рдлрд╛рдЗрд▓ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓ рд░рд╣рд╛ рд╣реИред

рдорд▓реНрдЯреА-рд╕реНрдЯреЗрдк рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬрдм рдЖрдк docker build рд▓реЙрдиреНрдЪ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЕрдВрддрд┐рдо рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдореЗрдВ рдПрдХ рдФрд░ рдХрджрдо рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдЖрдЗрдП рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЙрджрд╛рд╣рд░рдг рджреЗрдЦреЗрдВред рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рджреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╣реИрдВ: рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдпреВрдирд┐рдЯ рдЯреЗрд╕реНрдЯ:


рдЕрднреА рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЪрд┐рдВрддрд╛ рди рдХрд░реЗрдВ рдХрд┐ рд╡реЗрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреНрдпрд╛ рдХрд░рддрд╛ рд╣реИред рджреВрд╕рд░реА рдУрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХрдорд╛рддреНрд░ рдкрд░реАрдХреНрд╖рдг рд╣реИ рдЬреЛ GuidProvider рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 [Fact] public void Never_return_a_empty_guid() { // Arrange & Act var provider = new GuidProvider(); var id = provider.Id; // Assert Assert.NotEqual(Guid.Empty, id); } 

рдЕрдм рдПрдХ Dockerfile рдмрдирд╛рдПрдВ рдЬреЛ WebApplication рдЫрд╡рд┐ рдмрдирд╛рдПрдЧрд╛ рдФрд░ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдЧрд╛:

 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"] 

рдЗрд╕ рдбреЙрдХрд░реАрдлрд╛рдЗрд▓ рдХреЛ рдПрдХ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд╕реЙрд▓реНрдпреВрд╢рди рдлрд╛рдЗрд▓ (iCd.sln) рдХреЗ рд╕рд╛рде рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдХ рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ:

 docker build -t webapplication . 

рд╣рдорд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ ( GuidProvider рдореЗрдВ рдПрдХ рддреНрд░реБрдЯрд┐ рдЬреЛ рд╣рдореЗрд╢рд╛ Guid.Empty рд╡рд╛рдкрд╕ рдХрд░ Guid.Empty ), рдЗрд╕рд▓рд┐рдП рдЫрд╡рд┐ рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛:

рдЙрддреНрдкрд╛рджрди
 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 

рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ Azure DevOps рдореЗрдВ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдХреИрд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдлрд┐рд▓рд╣рд╛рд▓ рд╣рдорд╛рд░реА рдмрд┐рд▓реНрдб рдкрд░рд┐рднрд╛рд╖рд╛ рдПрдХ рдбреЙрдХрд░ рдЯрд╛рдЗрдк рдХрд╛рд░реНрдп рд╣реИ:



рд▓реЙрдиреНрдЪ рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░рд╛ рдкрд░реАрдХреНрд╖рдг рдЧрд┐рд░ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ рд╣реИрдВ ("рдЯреЗрд╕реНрдЯ" рдЯреИрдм рдЦрд╛рд▓реА рд╣реИ), рдХреНрдпреЛрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдг VSTS рдХреА рд╕рдордЭ рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:



рдЫрд╡рд┐ рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд▓ рд░рд╣реЗ рдкрд░реАрдХреНрд╖рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЦрд░рд╛рдм рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡реАрдПрд╕рдЯреАрдПрд╕ рдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рд╕реЗ рд░реЛрдХ рджреЗрдЧрд╛ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХреНрдпрд╛ рдерд╛ред рдпрд╣ рдбреЙрдХрд░ рдХреЗ "рд╕реАрдорд╛" рдХреЗ рдХрд╛рд░рдг рд╣реИ, рдЬреЛ docker build рджреМрд░рд╛рди рд╡реЙрд▓реНрдпреВрдо рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкрд░реАрдХреНрд╖рдг рдХреЗ рдкрд░рд┐рдгрд╛рдо (рдЬреЛ dotnet test рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ) рдХреЗ рд╕рд╛рде рдПрдХ рдлрд╝рд╛рдЗрд▓ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╣ рдлрд╝рд╛рдЗрд▓ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдмрдиреА рд╣реБрдИ рд╣реИ, рдФрд░ рд╣рдо рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЙрд╕реЗ рд╡рд╣рд╛рдБ рд╕реЗред

рд╣рдо рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд▓реЗрдВрдЧреЗ рдФрд░ docker run рд▓рд┐рдП рдПрдХ рдмрдврд╝рд┐рдпрд╛ рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЪрд▓реЛ рдПрдХ рдЕрд▓рдЧ рдХрдВрдЯреЗрдирд░ рдмрдврд╝рд╛рдПрдВ рдФрд░ рдЙрд╕рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВред рджреЛрдиреЛрдВ рдХрдВрдЯреЗрдирд░реЛрдВ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд╣реА рдбреЙрдХрд░рдлрд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдЙрд╕ рд▓рд╛рдЗрди рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬреЛ рдбреЙрдХрд░рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдбреЙрдЯрдиреЗрдЯ dotnet test рдЪрд▓рд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдм рд╣рдо рдЙрдиреНрд╣реЗрдВ рдЕрд▓рдЧ рд╕реЗ рдЪрд▓рд╛рдПрдВрдЧреЗред рдареАрдХ рд╣реИ, рдЕрдм рдЖрдЗрдП docker docker run рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдЬреЛ рдЖрдкрдХреЛ Dockerfile рдХреЛ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдмрд┐рдВрджреБ рдкрд░ рдЪрд▓рд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдЪрд░рдг рд╣реИ:

 docker build -t webapplication-tests . --target test 

-target рдкреИрд░рд╛рдореАрдЯрд░ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХрд┐рд╕ рдЪрд░рдг рдХреЛ рдЗрдХрдЯреНрдард╛ рдХрд░рдирд╛ рд╣реИред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЙрддреНрдкрдиреНрди рдЫрд╡рд┐ рдХреЛ " рд╡реЗрдмрдПрдкрд┐рд╕рд▓реЗрд╢рди-рдкрд░реАрдХреНрд╖рдг " рдХрд╣рд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдм рд╣рдо рдЕрдкрдиреЗ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдЙрдирдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ " test-results.trx " рдХреЛ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВ ред

 docker run -v/c/tests:/tests webapplication-tests --entrypoint "dotnet test --logger trx;LogFileName=/tests/test-results.trx" 

рдпрд╣рд╛рдВ рд╣рдо рдкрд┐рдЫрд▓реЗ рдЪрд░рдг рдореЗрдВ рдмрдирд╛рдИ рдЧрдИ рдЫрд╡рд┐ рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рдо рдХрдВрдЯреЗрдирд░ " рдкрд░реАрдХреНрд╖рдг " рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рдореЗрдЬрдмрд╛рди рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ (рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдбреА: \ рд╕реАрдИрд╕реАрдбреА \ рдкрд░реАрдХреНрд╖рдг) рдореЗрдВ рдореИрдк рдХрд░рддреЗ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореБрдЭреЗ D: \ CiCD \ рдкрд░реАрдХреНрд╖рдг рдореЗрдВ рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рдорд┐рд▓рд╛ред

рдЕрдВрддрд┐рдо рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд▓рд╛рдПрдВ:

 docker build -t webapplication . 

рдлрд╛рдпрджрд╛ рдпрд╣ рд╣реИ рдХрд┐ рдбреЙрдХрд░ рд╕реНрддрд░ рдХреЗ рдореЙрдбрд▓ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж, рдЕрдиреНрдп рд╕рднреА рдЪрд░рдгреЛрдВ рдХреЛ рдлрд┐рд░ рд╕реЗ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ (рдпрд╛рдиреА рдЖрд╡реЗрджрди рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдХреЛрдИ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред

рдареАрдХ рд╣реИ, рдЪрд▓реЛ рдЕрдм рдпрд╣ рд╕рдм Azure DevOps рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд░реЗрдВред рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЛ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдФрд░ рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдбреЙрдХрдЯрд░-рдХрдВрдкреЛрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд╣рдорд╛рд░реЗ docker-compose.yml рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рд╛рдордЧреНрд░реА рд╣реИ:

 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 рдпрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдорд╛рди рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдЖрдЙрдЯрдкреБрдЯ trx рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рддрд╛ ./tests ред / ./tests ред рдЕрдВрддрд┐рдо рдЫрд╡рд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЧрдИ рд╣реИ:

 docker-compose build webapplication 

рдЕрдм рдЖрдк Azure DevOps рдореЗрдВ рд╣рдорд╛рд░реА CI рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЪрд░рдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ:

  1. рд╕рднреА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдЗрдХрдЯреНрдард╛ [рдирд┐рд░реНрдорд╛рдг]
  2. рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдПрдВ [рдЪрд▓рд╛рдПрдВ]
  3. рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВ [рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВ]
  4. рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА (рд░рдЬрд┐рд╕реНрдЯреНрд░реА) рдореЗрдВ рдЪрд┐рддреНрд░ рдЪрд▓рд╛рдПрдБ [рдкреБрд╢]

рдЖрдЗрдП рдкрд╣рд▓реЗ рдЪрд░рдг рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ, рдЬреЛ Azure рдореЗрдВ Docker Compose task (рдХрд╛рд░реНрдп) рд╣реИ:



рд╣рдо Action: Build service images рдбрд╛рд▓рддреЗ рд╣реИрдВ Action: Build service images рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдбреЙрдХрдЯрд░-рдХрдВрдкреЛрдЬрд╝.рдорд╛рдЗрд▓ рдХреЛ рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВред

рдЕрдЧрд▓рд╛, рдХрдВрдЯреЗрдирд░ рдХреЛ рдЗрдХрд╛рдИ рдкрд░реАрдХреНрд╖рдгреЛрдВ рд╕реЗ рдЪрд▓рд╛рдПрдБ:



рдпрд╣рд╛рдВ рдЖрдкрдХреЛ Action: Run a specific service image рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ Action: Run a specific service image рдФрд░ рдХрдВрдЯреЗрдирд░ рдХрд╛ рдирд╛рдо рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ Service Name: webapplication-tests ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, docker-compose.yml рдФрд░ docker-compose.override.yml рдХреЗ рд░рд╛рд╕реНрддреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдордд рднреВрд▓рдирд╛ред Run in Background рдлреЙрд░ Run in Background рдХрд╛ рдорд╛рди рд╕реЗрдЯ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдХрдВрдЯреЗрдирд░ "рдбрд┐рдЯреИрдЪ рдореЛрдб" рдореЗрдВ рд╢реБрд░реВ рд╣реЛрдЧрд╛ рдФрд░ рдХрд╛рд░реНрдп рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдФрд░ рдЕрдЧрд▓реЗ рдЪрд░рдг рдкрд░ рдЬрд╛рдПрдЧрд╛ред рдкреНрд░рдХрд╛рд╢рд┐рдд рдкрд░реАрдХреНрд╖рд╛ рдкрд░рд┐рдгрд╛рдо рдХрд╛рд░реНрдп рдЙрди рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдЧрд╛ рдЬреЛ рдЕрднреА рддрдХ рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдореЗрдВ рд╕рдордп рд▓рдЧрддрд╛ рд╣реИред

рддреАрд╕рд░рд╛ рдЪрд░рдг "рдЯреЗрд╕реНрдЯ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВ" рд╣реИ:



Run this task: Even if a previous task has failed, unless the build was canceled рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ Run this task: Even if a previous task has failed, unless the build was canceled ред рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛрдиреЗ рдкрд░ рдкрд░рд┐рдгрд╛рдо рдХрднреА рдкреНрд░рдХрд╛рд╢рд┐рдд рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред Search folder: $(Build.ArtifactStagingDirectory)

рдЕрдВрддрд┐рдо рдЪрд░рдг рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рднрдВрдбрд╛рд░рдг рдореЗрдВ рдзрдХреЗрд▓рдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Azure рд╕рджрд╕реНрдпрддрд╛, рд╕рд╛рде рд╣реА Azure рдХрдВрдЯреЗрдирд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рдирдпрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рддреИрдпрд╛рд░ рд╣реИред рд╕рд╣реЗрдЬреЗрдВред рд╣рдо рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдлрд▓ рд╣реЛрддреЗ рд╣реИрдВ, рддреЛ рдмрд┐рд▓реНрдб рд╡рд┐рдлрд▓ рд╣реЛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдо VSTS рдореЗрдВ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦрддреЗ рд╣реИрдВ:



рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рдордЧреНрд░реА рд╕рд╣рд╛рдпрдХ рдереАред рдЖрдк рдпрд╣рд╛рдБ рдореЗрд░реА рдЕрд╕реЗрдВрдмрд▓реА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди yml рдлрд╝рд╛рдЗрд▓ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!

Source: https://habr.com/ru/post/hi430958/


All Articles