GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Verschieben eines ASP.NET Core von Azure App Service unter Windows zu Linux, indem zuerst in WSL und Docker getestet wird

Ich habe diese Woche eine meiner Websites von ASP.NET Core 2.2 auf die neueste LTS-Version (Long Term Support) von ASP.NET Core 3.1 aktualisiert. Jetzt möchte ich dasselbe mit meiner Podcast-Site machen UND sie gleichzeitig auf Linux verschieben. Azure App Service für Linux hat einige sehr gute Preise und ermöglichte mir, von Standard auf einen Premium v2-Plan umzusteigen, der mir doppelt so viel Arbeitsspeicher zu einem Preisnachlass von 35 % bietet.

Mein Podcast wurde in der Vergangenheit auf ASP.NET Core in Azure App Service für Windows ausgeführt. Woher weiß ich, ob es unter Linux läuft? Nun, ich werde es versuchen, sehen!

Ich verwende WSL (Windows Subsystem for Linux) und Sie sollten es auch tun. Es ist sehr wahrscheinlich, dass Sie WSL auf Ihrem Computer betriebsbereit haben, aber Sie haben es nur nicht eingeschaltet. Kombinieren Sie WSL (oder das neue WSL2) mit dem Windows Terminal und Sie befinden sich an einem wunderbaren Ort auf Windows mit der Möglichkeit, alles für überall zu entwickeln.

Sehen wir uns zunächst an, ob ich meine vorhandene ASP.NET Core-Podcast-Site (jetzt auf .NET Core 3.1 aktualisiert) unter Linux ausführen kann. Ich starte Ubuntu 18.04 unter Windows und führe dotnet --version aus, um zu sehen, ob ich bereits etwas installiert habe. Sie können nichts haben. Ich habe anscheinend 3.0:

$ dotnet --version
3.0.100

Ok, ich möchte .NET Core 3.1 auf der Ubuntu-Instanz von WSL installieren. Denken Sie daran:Nur weil ich .NET 3.1 unter Windows installiert habe, heißt das nicht, dass es auch in meinen Linux/WSL-Instanzen installiert ist. Diese muss ich selbst pflegen. Eine andere Möglichkeit, darüber nachzudenken, ist, dass ich die Win-x64-Installation von .NET 3.1 habe und jetzt die Linux-x64-Version benötige.

  • HINWEIS: Es ist wahr, dass ich "dotnet publish -r linux-x64 " und dann die resultierenden vollständig veröffentlichten Dateien nach Linux/WSL scp. Es hängt davon ab, wie ich die Verantwortung aufteilen möchte. Möchte ich auf Windows bauen und unter Linux/Linux laufen? Oder möchte ich unter Linux bauen und laufen. Beide sind gültig, es hängt nur von Ihren Entscheidungen, Ihrer Geduld und Ihrer Vertrautheit ab.
  • GOTCHA: Auch wenn Sie unter WSL auf Windows-Dateien unter /mnt/c zugreifen, die mit Git von Windows geklont wurden, beachten Sie, dass es Feinheiten gibt, wenn Git für Windows und Git für Ubuntu gleichzeitig auf den Index/die Dateien zugreifen. Es ist einfacher, sicherer und schneller, einfach eine weitere Kopie innerhalb des WSL/Linux-Dateisystems zu klonen.

Ich gehe zu https://dotnet.microsoft.com/download und hole .NET Core 3.1 für Ubuntu. Wenn Sie apt verwenden, und ich nehme an, dass Sie das tun, gibt es einige vorläufige Einstellungen und dann ist es einfach

sudo apt-get install dotnet-sdk-3.1

Kein Schweiß. Lassen Sie uns "dotnet build " und hoffen das Beste!

Es mag überraschend sein, aber wenn Sie nichts Kompliziertes oder Windows-spezifisches tun, sollte Ihre .NET Core-App unter Windows genauso erstellt werden wie unter Linux. Wenn Sie etwas Interessantes oder OS-spezifisches tun, können Sie #ifdef sich Ihren Weg zum Ruhm bahnen, wenn Sie darauf bestehen.

Bonuspunkte, wenn Sie Unit-Tests haben – und ich habe sie –, also werde ich als Nächstes meine Unit-Tests durchführen und sehen, wie es läuft.

OPTION: Ich schreibe Dinge wie build.ps1 und test.ps1, die PowerShell verwenden, da PowerShell bereits unter Windows verfügbar ist. Dann installiere ich PowerShell (nur für das Skripting, nicht das Shelling) unter Linux, damit ich meine .ps1-Skripte überall verwenden kann. Dieselben test.ps1 und build.ps1 und dockertest.ps1 usw. funktionieren einfach auf allen Plattformen. Stellen Sie sicher, dass Sie einen Shebang #!/usr/bin/pwsh haben oben in deinen PS1-Dateien, damit du sie einfach ausführen kannst (chmod +x ) unter Linux.

Ich führe test.ps1 aus, das diesen Befehl ausführt

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

mit Bettdecke für Codeabdeckung und ... es funktioniert! Auch dies mag überraschend sein, aber wenn Sie keine hartcodierten Pfade haben, gehen Sie davon aus, dass ein Laufwerk C:\ vorhanden ist, und vermeiden Sie die Registrierung und andere Windows-spezifische Dinge, die Dinge funktionieren.

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% |
+--------------------------+--------+--------+--------+

Ich kann bauen, ich kann testen, aber kann ich es ausführen? Was ist mit dem Ausführen und Testen in Containern?

Ich führe WSL2 auf meinem System aus und mache das alles in Ubuntu 18.04 UND ich führe die Docker WSL Tech Preview aus. Warum nicht mal schauen, ob ich meine Tests auch unter Docker ausführen kann? In Docker für Windows aktiviere ich die experimentelle WSL2-Unterstützung und dann im Menü „Ressourcen“ die WSL-Integration. Ich aktiviere Docker in meiner Ubuntu 18.04-Instanz (Ihre Instanzen und ihre Namen sind Ihre eigenen).

Ich kann bestätigen, dass es mit "docker info" unter WSL funktioniert und mit einer funktionierenden Instanz spricht. Ich sollte in der Lage sein, "docker info" sowohl in Windows als auch in WSL auszuführen.

$ 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...

Kühl. Ich erinnerte mich, dass ich auch mein Dockerfile vom 2.2 SDK auf dem Docker-Hub auf das 3.1 SDK von Microsoft Container Registry aktualisieren musste, also änderte sich diese eine Zeile:

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

sowie die endgültige Laufzeitversion für die App später im Dockerfile. Stellen Sie grundsätzlich sicher, dass Ihr Dockerfile die richtigen Versionen verwendet.

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

Ich lade die Testergebnisse auch auf Volume, also gibt es diese anstößige If-Anweisung in der test.ps1. JA, ich weiß, ich sollte einfach alle Pfade mit / machen und sie relativ machen.

#!/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
}

Egal, es funktioniert und es funktioniert wunderbar. Jetzt habe ich Tests in Windows und Linux und in Docker (in einem Linux-Container) ausgeführt, der von WSL2 verwaltet wird. Alles funktioniert überall. Jetzt, da es auf WSL gut läuft, weiß ich, dass es in Azure unter Linux hervorragend funktionieren wird.

Wechsel von Azure App Service unter Windows zu Linux

Das war auch ziemlich einfach.

Als Nächstes werde ich im Detail bloggen, wie ich die Sites in Azure DevOps aufbaue und einsetze und wie ich von .NET 2.2 mit klassischen „Wizard Built“ DevOps-Pipelines zu einem .NET Core 3.1 und einer YAML-Pipeline mit eingecheckter Quellcodeverwaltung gewechselt bin Woche.

Die Kurzversion lautet:Machen Sie einen Linux-App-Service-Plan (denken Sie daran, dass ein „App-Service-Plan“ eine VM ist, um die Sie sich keine Sorgen machen müssen. Sehen Sie in der Auswahl unten, dass der Linux-Plan ein Pinguin-Symbol hat. Denken Sie auch daran, dass Sie das können Sie können so viele Apps in Ihrem Plan haben, wie Sie möchten (und in Arbeitsspeicher und Ressourcen passen).Wenn Sie in Azure App Service für Linux einen „Stack“ für Ihre App auswählen, wählen Sie effektiv ein Docker-Image aus, für das Azure verwaltet wird Sie.

Ich begann mit der Bereitstellung auf staging.mydomain.com und probierte es aus. Sie können Azure Front Door oder CloudFlare verwenden, um den Datenverkehr zu verwalten und dann das DNS auszutauschen. Ich habe eine Weile auf Staging getestet und dann direkt DNS geändert. Ich habe ein paar Stunden gewartet, bis der Datenverkehr von der Windows-Podcast-Site abgelassen wurde, und ihn dann gestoppt. Nach ein oder zwei Tagen ohne Verkehr habe ich es gelöscht. Wenn ich meine Arbeit richtig gemacht habe, hat keiner von Ihnen bemerkt, dass die Website von Windows auf Linux, von .NET Core 2.2 auf .NET Core 3.1 umgezogen ist. Es sollte genauso schnell oder schneller ohne Ausfallzeiten sein.

Hier ist ein Ausschnitt aus meinem Azure-Portal. Ab heute habe ich meine Homepage, mein Blutzuckermanagement-Portal und meine Podcast-Site auf einen einzigen Linux-App-Service-Plan umgestellt. Jede wird auf GitHub gehostet und automatisch mit Azure DevOps bereitgestellt.

Die nächste große Migration in die Cloud wird dieser Blog sein, der immer noch .NET Framework 4.x ausführt. Ich werde bloggen, wie der Podcast in GitHub eingecheckt und dann nächste Woche mit Azure DevOps bereitgestellt wird.

Welche coolen Migrationen haben SIE in letzter Zeit durchgeführt, lieber Leser?

Sponsor :Wie C#? Wir auch! Aus diesem Grund haben wir eine schnelle, intelligente, plattformübergreifende .NET-IDE entwickelt, die Ihnen noch mehr Programmierleistung bietet. Clevere Codeanalyse, umfassende Codevervollständigung, sofortige Suche und Navigation, ein fortschrittlicher Debugger ... Mit JetBrains Rider haben Sie alles, was Sie brauchen, immer zur Hand. Programmieren Sie C# in Gedankengeschwindigkeit unter Linux, Mac oder Windows. Probieren Sie JetBrains Rider noch heute aus!

Linux
  1. Zugriff auf Linux-Dateisysteme in Windows 10 und WSL 2

  2. Zeigen Sie die DELL-Service-Tag-Nummer und den Express-Servicecode unter Linux und Windows an

  3. Kali-Linux im Windows App Store

  4. Bestimmen Sie die Betriebssystemversion, Linux und Windows aus Powershell

  5. Datei von Linux auf Windows Share mit C# (.NET Core) kopieren

Klassische Path.DirectorySeparatorChar-Probleme beim Wechsel von .NET Core unter Windows zu Linux

Offizieller Support für das Remotedebuggen einer .NET Core-Linux-App in WSL2 von Visual Studio unter Windows

Remotedebuggen einer .NET Core-Linux-App in WSL2 von Visual Studio unter Windows

Ruby on Rails auf Azure App Service (Websites) mit Linux (und Ubuntu auf Windows 10)

Veröffentlichen einer ASP.NET Core-Website auf einem günstigen Linux-VM-Host

So kompilieren Sie die .NET Core-App für Linux auf einem Windows-Computer