Kami meluncurkan wadah dengan unit test di Azure DevOps (VSTS)

Dengan munculnya .Net Core, kami memiliki peluang besar untuk tidak hanya menjalankan kode kami pada OS yang berbeda, tetapi juga mengujinya pada berbagai OS. Dan apa yang bisa lebih baik dari Docker ketika bekerja dengan OS yang berbeda?

Pengujian lebih berharga ketika Anda tidak memiliki perbedaan antara lingkungan pengujian dan lingkungan target. Bayangkan Anda mendukung aplikasi Anda pada beberapa sistem operasi atau versi sistem operasi. Dengan Docker, Anda dapat menguji aplikasi Anda di masing-masing aplikasi tersebut.

Pada artikel ini, kita akan melihat cara membuat gambar terpisah di mana unit test aplikasi Anda akan diluncurkan dan mengkonfigurasi untuk semua pipa CI / CD ini di VSTS yang merupakan Azure DevOps baru-baru ini.

Jika Anda bekerja dengan Docker, Anda mungkin menggunakan bangunan multi-tahap untuk membangun wadah Anda. Dalam hal ini, Anda menggabungkan pembuatan binari (menggunakan gambar bangunan) dan pembuatan gambar akhir (menggunakan gambar runtime) dalam file Docker yang sama.

Jika sistem Anda terdiri dari satu wadah, dalam hal ini pendekatan yang paling umum adalah menjalankan tes sebagai bagian dari proses membangun gambar akhir. Artinya, menjalankan tes di Dockerfile.

Untuk melakukan ini dalam proses multi-langkah, ketika Anda meluncurkan docker build Anda menjalankan tes sebagai langkah lain dalam membangun gambar akhir. Mari kita lihat contoh sederhana. Katakanlah kita memiliki dua proyek: aplikasi web dan pengujian unit:


Untuk saat ini, jangan khawatir tentang apa yang dilakukan aplikasi web. Di sisi lain, kami memiliki satu-satunya tes yang memeriksa perilaku GuidProvider dan terlihat seperti ini:

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

Sekarang buat Dockerfile yang akan membuat gambar Aplikasi Web dan menjalankan tes pada saat yang sama:

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

Dockerfile ini harus ditempatkan di direktori dengan file solusi (iCd.sln). Untuk membuat gambar, gunakan perintah:

 docker build -t webapplication . 

Pengujian kami gagal (kesalahan dalam GuidProvider yang selalu mengembalikan Guid.Empty ), sehingga pembuatan gambar akan gagal:

keluaran
 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 

Sekarang mari kita lihat bagaimana memulai proses ini di Azure DevOps.

Definisi build kami saat ini adalah satu jenis tugas Docker:



Sebagai hasil dari peluncuran, build gagal karena pengujian kami gagal. Selain itu, kami tidak memiliki hasil tes (tab "Tes" kosong), karena pengujian tidak dilakukan dalam pemahaman VSTS:



Menjalankan tes sebagai bagian dari rakitan gambar tidak sepenuhnya buruk, tetapi akan mencegah VSTS mengetahui apa hasilnya. Ini karena "batasan" Docker, yang tidak memungkinkan pembuatan volume selama docker build , oleh karena itu kami tidak dapat menyediakan file dengan hasil pengujian (yang dapat dihasilkan menggunakan dotnet test ), file ini tetap berada dalam wadah perantara, dan kami tidak dapat dengan mudah mendapatkannya dia dari sana.

Kami akan mengambil pendekatan yang berbeda dan menggunakan alternatif yang bagus untuk docker run . Pertama, mari kita naikkan wadah terpisah dan menjalankan tes di dalamnya. Untuk kedua kontainer, kita bisa menggunakan Dockerfile yang sama. Pertama-tama, kita perlu menghapus garis yang menjalankan dotnet test dari Dockerfile, karena sekarang kita akan menjalankannya secara terpisah. Ok, sekarang mari kita gunakan docker run , yang memungkinkan Anda untuk menjalankan Dockerfile ke titik tertentu. Dalam kasus kami, ini adalah fase pengujian:

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

Parameter -target menunjukkan tahap mana yang harus dirakit. Harap dicatat bahwa gambar yang dihasilkan akan disebut " tes aplikasi web ". Sekarang kita dapat menjalankan pengujian dan menyimpan file " test-results.trx " dengan hasil eksekusi di direktori " tes " wadah:

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

Di sini kita menjalankan gambar yang dibuat pada langkah sebelumnya, dan melalui ini kita memetakan direktori " tes " kontainer ke direktori host (dalam kasus saya D: \ CiCD \ tes). Akibatnya, saya mendapat hasil tes dalam tes D: \ CiCD \.

Untuk membangun gambar akhir, jalankan:

 docker build -t webapplication . 

Keuntungannya adalah berkat model level Docker, tidak perlu melakukan kembali semua langkah lainnya (mis. Tidak perlu mengkompilasi ulang aplikasi).

Baiklah, sekarang mari kita terapkan semua ini ke saluran pipa Azure DevOps. Untuk menyederhanakan perakitan dan menghindari sejumlah besar parameter, kami akan menggunakan docker-compose. Docker-compose.yml kami memiliki konten berikut:

 version: '3.5' services: webapplication: image: webapplication build: context: . dockerfile: Dockerfile webapplication-tests: image: webapplication-tests build: context: . dockerfile: Dockerfile target: test 

Di sini kita mendefinisikan dua gambar (aplikasi web dan uji aplikasi web). Agar semuanya sesuai dengan kanon, mari kita tambahkan file docker-compose.override.yml:

 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 

Hebat, sekarang untuk menjalankan tes, kita hanya perlu:

 docker-compose run webapplication-tests 

Perintah ini menjalankan tes dan membuat file trx keluaran dalam direktori yang ditentukan oleh variabel lingkungan BUILD_ARTIFACTSTAGINGDIRECTORY atau nilai default ./tests . Gambar akhir dilakukan seperti ini:

 docker-compose build webapplication 

Sekarang Anda dapat mengedit proses CI kami di Azure DevOps. Untuk melakukan ini, kami menetapkan langkah-langkah berikut:

  1. Kumpulkan semua gambar [bangun]
  2. Jalankan tes unit [lari]
  3. Publikasikan hasil tes [terbitkan]
  4. Jalankan gambar di repositori (Registry) [push]

Mari kita mulai dengan langkah pertama, yang merupakan tugas Menulis Tugas Docker di Azure:



Kami menempatkan Action: Build service images dan tentukan path ke docker-compose.yml.

Selanjutnya, jalankan wadah dengan unit test:



Di sini Anda perlu memilih Action: Run a specific service image dan tentukan nama wadah Nama Service Name: webapplication-tests . Juga, jangan lupa tentang path ke docker-compose.yml dan docker-compose.override.yml. Nilai untuk Run in Background tidak boleh ditetapkan, jika tidak wadah akan mulai dalam "mode Terpisah" dan tugas tidak akan menunggu hasil tes dan akan pergi ke langkah berikutnya. Tugas Publikasikan Hasil Hasil akan mencoba untuk mempublikasikan hasil yang mungkin belum tersedia, karena menjalankan tes membutuhkan waktu.

Langkah ketiga adalah "Publikasikan Hasil Tes":



Penting untuk menentukan Run this task: Even if a previous task has failed, unless the build was canceled . Opsi ini penting karena jika tidak hasilnya tidak akan pernah dipublikasikan jika tes gagal. Search folder: $(Build.ArtifactStagingDirectory)

Langkah terakhir adalah mendorong gambar ke penyimpanan. Untuk melakukan ini, tentukan langganan Azure, serta Registri Wadah Azure. Semuanya siap untuk membuat bangunan baru. Simpan. Kita mulai. Jika tes gagal, build akan gagal, tetapi sekarang kita melihat hasilnya di VSTS:



Saya harap materi ini bermanfaat. Anda dapat menemukan file konfigurasi yml konfigurasi saya di sini .

Terima kasih atas perhatian anda!

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


All Articles