GNU/Linux >> Belajar Linux >  >> Linux

Memindahkan ASP.NET Core dari Azure App Service di Windows ke Linux dengan menguji di WSL dan Docker terlebih dahulu

Saya memperbarui salah satu situs web saya dari ASP.NET Core 2.2 ke versi LTS (Long Term Support) terbaru dari ASP.NET Core 3.1 minggu ini. Sekarang saya ingin melakukan hal yang sama dengan situs podcast saya DAN memindahkannya ke Linux secara bersamaan. Layanan Aplikasi Azure untuk Linux memiliki harga yang sangat bagus dan memungkinkan saya untuk beralih ke paket Premium v2 dari Standar yang memberi saya memori dua kali lipat dengan diskon 35%.

Podcast saya secara historis berjalan di ASP.NET Core di Azure App Service untuk Windows. Bagaimana saya tahu jika itu akan berjalan di Linux? Yah, saya akan mencobanya lihat!

Saya menggunakan WSL (Windows Subsystem for Linux) dan Anda juga harus. Sangat mungkin bahwa Anda memiliki WSL yang siap untuk digunakan di mesin Anda dan Anda belum menyalakannya. Gabungkan WSL (atau WSL baru2) dengan Terminal Windows dan Anda berada di tempat yang indah di Windows dengan kemampuan untuk mengembangkan apa pun untuk di mana saja.

Pertama, mari kita lihat apakah saya dapat menjalankan situs podcast ASP.NET Core saya yang sudah ada (sekarang diperbarui ke .NET Core 3.1) di Linux. Saya akan memulai Ubuntu 18.04 di Windows dan menjalankan dotnet --version untuk melihat apakah saya sudah menginstal sesuatu. Anda mungkin tidak punya apa-apa. Saya memiliki 3.0 sepertinya:

$ dotnet --version
3.0.100

Oke, saya ingin menginstal .NET Core 3.1 pada instance Ubuntu WSL. Ingat, hanya karena saya telah menginstal .NET 3.1 di Windows tidak berarti itu diinstal di instance Linux/WSL saya. Saya harus memeliharanya sendiri. Cara lain untuk memikirkannya adalah bahwa saya telah menginstal win-x64 dari .NET 3.1 dan sekarang saya membutuhkan yang linux-x64.

  • CATATAN: Memang benar saya bisa "dotnet publish -r linux-x64 " dan kemudian scp file yang diterbitkan lengkap yang dihasilkan ke Linux/WSL. Itu tergantung pada bagaimana saya ingin membagi tanggung jawab. Apakah saya ingin membangun di Windows dan berjalan di Linux/Linux? Atau apakah saya ingin membangun dan menjalankan dari Linux. Keduanya valid, hanya tergantung pada pilihan, kesabaran, dan keakraban Anda.
  • GOTCHA: Juga jika Anda mengakses file Windows di /mnt/c di bawah WSL yang dikloning git dari Windows, ketahuilah bahwa ada kehalusan jika Git untuk Windows dan Git untuk Ubuntu mengakses indeks/file secara bersamaan. Lebih mudah dan lebih aman dan lebih cepat untuk hanya git mengkloning salinan lain dalam sistem file WSL/Linux.

Saya akan menuju ke https://dotnet.microsoft.com/download dan mendapatkan .NET Core 3.1 untuk Ubuntu. Jika Anda menggunakan apt, dan saya berasumsi Anda melakukannya, ada beberapa penyiapan awal dan selanjutnya menjadi sederhana

sudo apt-get install dotnet-sdk-3.1

Tidak ada keringat. Mari kita "dotnet build " dan berharap yang terbaik!

Ini mungkin mengejutkan tetapi jika Anda tidak melakukan sesuatu yang rumit atau khusus Windows, aplikasi .NET Core Anda seharusnya dibuat sama di Windows seperti halnya di Linux. Jika Anda melakukan sesuatu yang menarik atau spesifik OS, Anda dapat #ifdef jalan menuju kejayaan jika Anda bersikeras.

Poin bonus jika Anda memiliki Tes Unit - dan saya melakukannya - jadi selanjutnya saya akan menjalankan tes unit saya dan melihat bagaimana hasilnya.

OPSI: Saya menulis hal-hal seperti build.ps1 dan test.ps1 yang menggunakan PowerShell karena PowerShell sudah ada di Windows. Kemudian saya menginstal PowerShell (hanya untuk skrip, bukan shelling) di Linux sehingga saya dapat menggunakan skrip .ps1 saya di mana-mana. Test.ps1 dan build.ps1 dan dockertest.ps1, dll yang sama hanya berfungsi di semua platform. Pastikan Anda memiliki shebang #!/usr/bin/pwsh di bagian atas file ps1 Anda sehingga Anda dapat menjalankannya (chmod +x ) di Linux.

Saya menjalankan test.ps1 yang menjalankan perintah ini

dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=lcov /p:CoverletOutput=./lcov .\hanselminutes.core.tests

dengan coverlet untuk cakupan kode dan... bekerja! Sekali lagi, ini mungkin mengejutkan tetapi jika Anda tidak memiliki jalur kode keras, buat asumsi apa pun tentang drive C:\ yang ada, dan hindari registri dan hal-hal khusus Windows lainnya, semuanya berfungsi.

Test Run Successful.
Total tests: 23
Passed: 23
Total time: 9.6340 Seconds

Calculating coverage result...
Generating report './lcov.info'

+--------------------------+--------+--------+--------+
| Module | Line | Branch | Method |
+--------------------------+--------+--------+--------+
| hanselminutes.core.Views | 60.71% | 59.03% | 41.17% |
+--------------------------+--------+--------+--------+
| hanselminutes.core | 82.51% | 81.61% | 85.39% |
+--------------------------+--------+--------+--------+

Saya dapat membangun, saya dapat menguji, tetapi dapatkah saya menjalankannya? Bagaimana dengan menjalankan dan menguji dalam container?

Saya menjalankan WSL2 di sistem saya dan saya telah melakukan semua ini di Ubuntu 18.04 DAN saya menjalankan Pratinjau Teknologi Docker WSL. Mengapa tidak melihat apakah saya dapat menjalankan pengujian saya di bawah Docker juga? Dari Docker untuk Windows saya akan mengaktifkan dukungan Eksperimental WSL2 dan kemudian dari menu Sumber Daya, Integrasi WSL Saya akan mengaktifkan Docker dalam instance Ubuntu 18.04 saya (instance Anda dan namanya akan menjadi milik Anda sendiri).

Saya dapat mengonfirmasi itu berfungsi dengan "info buruh pelabuhan" di bawah WSL dan berbicara dengan instance yang berfungsi. Saya seharusnya dapat menjalankan "info buruh pelabuhan" di KEDUA Windows DAN WSL.

$ docker info
Client:
Debug Mode: false

Server:
Containers: 18
Running: 18
Paused: 0
Stopped: 0
Images: 31
Server Version: 19.03.5
Storage Driver: overlay2
Backing Filesystem: extfs
...snip...

Dingin. Saya ingat saya juga perlu memperbarui Dockerfile saya dari 2.2 SDK di hub Docker ke 3.1 SDK dari Microsoft Container Registry, jadi satu baris ini berubah:

#FROM microsoft/dotnet:2.2-sdk AS build
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 as build

serta versi runtime terakhir untuk aplikasi nanti di Dockerfile. Pada dasarnya pastikan Dockerfile Anda menggunakan versi yang benar.

#FROM microsoft/dotnet:2.1-aspnetcore-runtime AS runtime
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime

Saya juga memasang volume hasil tes sehingga ada pernyataan If ofensif ini di test.ps1. YA, saya tahu saya harus melakukan semua jalur dengan / dan menjadikannya relatif.

#!/usr/bin/pwsh
docker build --pull --target testrunner -t podcast:test .
if ($IsWindows)
{
 docker run --rm -v d:\github\hanselminutes-core\TestResults:/app/hanselminutes.core.tests/TestResults podcast:test
}
else
{
 docker run --rm -v ~/hanselminutes-core/TestResults:/app/hanselminutes.core.tests/TestResults podcast:test
}

Terlepas dari itu, itu berhasil dan itu bekerja dengan luar biasa. Sekarang saya menjalankan tes di Windows dan Linux dan di Docker (dalam wadah Linux) yang dikelola oleh WSL2. Semuanya bekerja di mana-mana. Sekarang setelah berjalan dengan baik di WSL, saya tahu ini akan bekerja dengan baik di Azure di Linux.

Berpindah dari Azure App Service di Windows ke Linux

Ini juga cukup sederhana.

Saya akan menulis blog secara rinci bagaimana saya membangun dan menerapkan situs di Azure DevOps dan bagaimana saya pindah dari .NET 2.2 dengan Pipa DevOps "Wizard Built" Klasik ke .NET Core 3.1 dan kontrol sumber memeriksa pipa YAML berikutnya minggu.

Versi singkatnya adalah, buat Paket Layanan Aplikasi Linux (ingat bahwa "Paket Layanan Aplikasi" adalah VM yang tidak perlu Anda khawatirkan. Lihat pada pilihan di bawah bahwa Paket Linux memiliki ikon penguin. Ingat juga bahwa Anda dapat memiliki aplikasi sebanyak yang Anda inginkan (dan akan muat di memori dan sumber daya). Saat Anda memilih "Stack" untuk aplikasi Anda dalam Azure App Service untuk Linux, Anda secara efektif memilih Gambar Docker yang dikelola Azure untuk Anda.

Saya mulai dengan menyebarkan ke staging.mydomain.com dan mencobanya. Anda dapat menggunakan Azure Front Door atau CloudFlare untuk mengelola lalu lintas dan kemudian menukar DNS. Saya test di Staging sebentar, baru ganti DNS langsung. Saya menunggu beberapa jam hingga lalu lintas mengalir dari situs podcast Windows dan kemudian menghentikannya. Setelah satu atau dua hari tidak ada lalu lintas, saya menghapusnya. Jika saya melakukan pekerjaan saya dengan benar, tidak ada dari Anda yang memperhatikan bahwa situs tersebut dipindahkan dari Windows ke Linux, dari .NET Core 2.2 ke .NET Core 3.1. Ini harus secepat atau lebih cepat tanpa downtime.

Ini adalah cuplikan dari Portal Azure saya. Mulai hari ini, saya telah memindahkan halaman rumah saya, portal manajemen gula darah saya, dan situs podcast saya ke dalam satu Paket Layanan Aplikasi Linux. Masing-masing di-host di GitHub dan masing-masing di-deploy secara otomatis dengan Azure DevOps.

Migrasi besar berikutnya ke cloud adalah blog ini yang masih menjalankan .NET Framework 4.x. Saya akan membuat blog tentang bagaimana podcast diperiksa ke GitHub, kemudian digunakan dengan Azure DevOps minggu depan.

Migrasi keren apa yang telah ANDA lakukan akhir-akhir ini, Pembaca yang Terhormat?

Sponsor :Seperti C#? Kami juga melakukannya! Itulah mengapa kami mengembangkan .NET IDE lintas platform yang cepat, cerdas, yang memberi Anda lebih banyak kekuatan pengkodean. Analisis kode yang cerdas, penyelesaian kode yang kaya, pencarian dan navigasi instan, debugger tingkat lanjut... Dengan JetBrains Rider, semua yang Anda butuhkan ada di ujung jari Anda. Kode C# dengan kecepatan berpikir di Linux, Mac, atau Windows. Coba JetBrains Rider hari ini!

Linux
  1. Cara Mengakses Sistem File Linux di Windows 10 dan WSL 2

  2. Lihat Tag Servis DELL dan Kode Servis Ekspres Dari Linux dan Windows

  3. Salin file dari linux ke windows share dengan C# (.NET core)

  1. Cara Menjalankan Aplikasi Linux di Windows 10 dan 11 Menggunakan WSL

  2. Kali Linux di Windows App Store

  3. Tentukan versi OS, Linux dan Windows dari Powershell

  1. Pindah dari Windows ke Linux - Manajemen disk

  2. Docker Desktop untuk WSL 2 mengintegrasikan Windows 10 dan Linux lebih dekat

  3. .NET Core dan Docker