Tento týden jsem aktualizoval jeden ze svých webů z ASP.NET Core 2.2 na nejnovější verzi LTS (Long Term Support) ASP.NET Core 3.1. Nyní chci udělat totéž se svým podcastovým webem A zároveň jej přesunout do Linuxu. Azure App Service pro Linux má velmi dobré ceny a umožnila mi přejít na plán Premium v2 ze Standardu, který mi poskytuje dvojnásobnou paměť s 35% slevou.
Můj podcast historicky běžel na ASP.NET Core na Azure App Service pro Windows. Jak zjistím, jestli to půjde na Linuxu? No, zkusím to, uvidím!
Používám WSL (Windows Subsystem for Linux) a vy byste také měli. Je velmi pravděpodobné, že máte na svém počítači připraveno WSL a právě jste ho nezapnuli. Zkombinujte WSL (nebo nové WSL2) s Windows Terminal a jste na krásném místě ve Windows s možností vyvíjet cokoli a kdekoli.
Nejprve se podíváme, zda mohu spustit svůj stávající web podcastů ASP.NET Core (nyní aktualizovaný na .NET Core 3.1) v systému Linux. Spustím Ubuntu 18.04 na Windows a spustím dotnet --version, abych zjistil, jestli už mám něco nainstalovaného. Možná nemáte nic. Zdá se, že mám 3.0:
$ dotnet --version
3.0.100
Dobře, budu chtít nainstalovat .NET Core 3.1 na instanci Ubuntu WSL. Pamatujte, že to, že mám .NET 3.1 nainstalované ve Windows, neznamená, že je nainstalováno v mých instancích Linux/WSL. Musím je udržovat sám. Jiný způsob, jak o tom přemýšlet, je, že mám win-x64 instalaci .NET 3.1 a teď potřebuji linux-x64.
- POZNÁMKA: Je pravda, že jsem mohl "
dotnet publish -r linux-x64
" a poté scp výsledné kompletní publikované soubory do Linuxu/WSL. Záleží na tom, jak chci rozdělit odpovědnost. Chci stavět na Windows a běžet na Linuxu/Linuxu? Nebo chci stavět a spouštět z Linuxu. Obojí platí, záleží jen na vašem výběru, trpělivosti a znalosti. - GOTCHA: Také pokud přistupujete k souborům Windows v /mnt/c pod WSL, které byly git klonovány z Windows, uvědomte si, že existují jemnosti, pokud Git pro Windows a Git pro Ubuntu přistupují k indexu/souborům současně. Je jednodušší, bezpečnější a rychlejší jednoduše git klonovat další kopii v rámci souborového systému WSL/Linux.
Zamířím na https://dotnet.microsoft.com/download a získám .NET Core 3.1 pro Ubuntu. Pokud používáte apt, a předpokládám, že ano, existuje nějaké předběžné nastavení a pak je to jednoduché
sudo apt-get install dotnet-sdk-3.1
Žádný pot. Pojďme "dotnet build
“ a doufám v to nejlepší!
Může to být překvapivé, ale pokud neděláte nic složitého nebo specifického pro Windows, vaše aplikace .NET Core by měla být ve Windows postavena stejně jako v Linuxu. Pokud děláte něco zajímavého nebo specifického pro OS, můžete #ifdef svou cestu ke slávě, pokud na tom trváte.
Bonusové body, pokud máte testy jednotek – a já je mám – tak příště provedu testy jednotek a uvidím, jak to půjde.
MOŽNOST: Píšu věci jako build.ps1 a test.ps1, které používají PowerShell, protože PowerShell je již ve Windows. Potom nainstaluji PowerShell (jen pro skriptování, ne pro shellování) na Linux, abych mohl všude používat své skripty .ps1. Stejný test.ps1 a build.ps1 a dockertest.ps1 atd. funguje na všech platformách. Ujistěte se, že máte shebang
#!/usr/bin/pwsh
v horní části souborů ps1, takže je můžete jednoduše spustit (chmod +x
) v systému Linux.
Spouštím test.ps1, který spouští tento příkaz
dotnet test /p:CollectCoverage=true /p:CoverletOutputFormat=lcov /p:CoverletOutput=./lcov .\hanselminutes.core.tests
s krytem pro pokrytí kódu a...funguje to! Opět to může být překvapivé, ale pokud nemáte žádné pevně zakódované cesty, udělejte jakékoli předpoklady o existenci jednotky C:\ a vyhněte se registru a dalším věcem specifickým pro Windows, věci fungují.
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% |
+--------------------------+--------+--------+--------+
Mohu stavět, mohu testovat, ale mohu to spustit? Co spuštění a testování v kontejnerech?
Na svém systému používám WSL2 a to vše dělám v Ubuntu 18.04 A spouštím Docker WSL Tech Preview. Proč se nepodívat, jestli mohu své testy spustit také pod Dockerem? Z Dockeru pro Windows povolím experimentální podporu WSL2 a poté z nabídky Zdroje, Integrace WSL povolím Docker v rámci své instance Ubuntu 18.04 (vaše instance a jejich názvy budou vaše).
Mohu potvrdit, že pracuje s „docker info“ pod WSL a mluví s fungující instancí. Měl bych být schopen spustit "docker info" ve Windows I 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...
Chladný. Vzpomněl jsem si, že jsem také potřeboval aktualizovat svůj Dockerfile z 2.2 SDK v centru Docker na 3.1 SDK z Microsoft Container Registry, takže změna o jeden řádek:
#FROM microsoft/dotnet:2.2-sdk AS build
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 as build
stejně jako finální runtime verzi aplikace později v Dockerfile. V zásadě se ujistěte, že váš Dockerfile používá správné verze.
#FROM microsoft/dotnet:2.1-aspnetcore-runtime AS runtime
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime
Také připojuji výsledky testů, takže v test.ps1 je toto urážlivé prohlášení If. ANO, vím, že bych měl udělat všechny cesty pomocí / a udělat je relativními.
#!/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 }
Bez ohledu na to to funguje a funguje to úžasně. Nyní mám testy spuštěné ve Windows a Linuxu a v Dockeru (v linuxovém kontejneru) spravovaném WSL2. Všechno funguje všude. Teď, když to dobře běží na WSL, vím, že to bude skvěle fungovat v Azure na Linuxu.
Přechod z Azure App Service v systému Windows na Linux
To bylo také docela jednoduché.
Dále budu podrobně blogovat o tom, jak stavím a používám weby v Azure DevOps a jak jsem přešel z .NET 2.2 s klasickými „Wizard Built“ DevOps Pipelines na .NET Core 3.1 a začleněním do kanálu YAML pro ovládání zdroje. týden.
Krátká verze je, vytvořte si plán služeb Linux App Service (nezapomeňte, že „Plán App Service Plan“ je virtuální počítač, o který se nemusíte starat. Podívejte se na výběr níže, že plán Linux má ikonu tučňáka. Pamatujte také, že můžete mít ve svém plánu tolik aplikací, kolik chcete (a vejde se do paměti a prostředků). Když vyberete „zásobník“ pro svou aplikaci v rámci Azure App Service pro Linux, efektivně vybíráte obrázek Dockeru, pro který Azure spravuje vy.
Začal jsem nasazením na staging.mydomain.com a vyzkoušel jsem to. Ke správě provozu a následné výměně DNS můžete použít Azure Front Door nebo CloudFlare. Chvíli jsem testoval na Stagingu, pak jsem změnil přímo DNS. Počkal jsem několik hodin, než se provoz z webu Windows podcast odčerpá, a pak jsem jej zastavil. Po dni nebo dvou bez provozu jsem to smazal. Pokud jsem udělal svou práci správně, nikdo z vás si nevšiml, že se web přesunul z Windows na Linux, z .NET Core 2.2 na .NET Core 3.1. Mělo by to být stejně rychlé nebo rychlejší bez prostojů.
Zde je snímek mého Azure Portal. Ode dneška jsem přesunul svou domovskou stránku, portál pro řízení hladiny cukru v krvi a web s podcasty do jediného plánu služeb aplikací pro Linux. Každý je hostován na GitHubu a každý se nasazuje automaticky pomocí Azure DevOps.
Další velkou migrací do cloudu bude tento blog, na kterém stále běží .NET Framework 4.x. Příští týden uvedu blog o tom, jak bude podcast zkontrolován na GitHubu a poté nasazen s Azure DevOps.
Jaké skvělé migrace jsi v poslední době provedl, milý čtenáři?
Sponzor :Jako C#? My taky! Proto jsme vyvinuli rychlé, chytré, multiplatformní .NET IDE, které vám dává ještě větší kódovací výkon. Chytrá analýza kódu, bohaté doplňování kódu, okamžité vyhledávání a navigace, pokročilý debugger... S JetBrains Rider máte vše, co potřebujete, na dosah ruky. Kódujte C# rychlostí myšlenky na Linuxu, Macu nebo Windows. Vyzkoušejte JetBrains Rider ještě dnes!