Hur Du Kör Din Azure Web App Från Zipfil
Att köra dina Azure Web Apps (App Services) från paket (zipfiler) är ett alternativt till den vanliga deployment modellen. Här nedan kommer jag att beskriva hur du sätter upp en paket deployment modell ("Run From Package") och vad fördelarna/nackdelarna är.
Microsoft har en beskrivning här: Run your app from a zip package. Jag kommer att förtydliga deras beskrivning här, samt även visa hur du automatiserar publiceringen.
Fördelar
Att köra dina Azure Web App (App Services) från ett paket (zipfil) ger dig ett antal fördelar:
- Det eliminerar låsningskonflikter för filer mellan din deployment och runtime.
- Garanterar att det alltid är endast fullt deployade appar som körs.
- Kan användas för att deploya till produktionsmiljö (med app restart).
- Förbättrar prestandan för Azure Resource Manager deployments.
- Kan reducera cold-start tider, särskilt för JavaScript functions med stora npm package träd.
Tyvärr innebär det också vissa nackdelar/begränsningar:
- Det är något mer komplicerat att sätta up.
- Det blir inte möjligt att deploya inkrementellt. Du måste alltid göra en full deploy.
- Det gör hela wwwroot katalogen read-only. Detta förhindrar vissa webappar, exempelvis Wordpress, från att fungera.
- Jag har också stött på andra sällsynta fall där webappar inte beter sig som de skall när de körs från zipfiler. Du måste testa!
Sätta Upp Package Deployment i Visual Studio
Jag kommer att beskriva hur man sätter upp det för Visual Studio publishing. Det kan också sätta upp för CI/CD på ett liknande sätt.
Steg 1 - Installera Azure CLI (om du inte har det redan)
Mina instruktioner baseras på Azure CLI. Du kan ladda ned det från Microsoft här.
Steg 2 - Aktivera Package Deployment i Application Settings
Först måste du konfigurera dina Application Settings. Lägg till en ny inställning som heter WEBSITE_RUN_FROM_PACKAGE
och sätt värdet till 1
. Detta kan du antingen göra från Azure Portal:

Eller med hjälp av Azure CLI:
1az webapp config appsettings set --resource-group <group-name> --name <app-name> --settings WEBSITE_RUN_FROM_PACKAGE="1"
Steg 3 - Skapa en ny Publish Profile i Visual Studio
Välj Folder
typen och kör vidare med defaultinställningar. Detta placerar outputen i bin\Release\netcoreapp3.1\publish\
i din projektmapp.

Steg 4 - Testa Manual Package Deployment
Publicera din app (med din nya Publish Profile). Gå sedan till mappen {Your project folder\bin\Release\netcoreapp3.1\publish}
och skapa en zipfil med allt innehåll i mappen. Du kan göra detta i Windows genom att välja alla filer och sedan Högermusklick ≫ Skicka Till ≫ Komprimerad Mapp. Se till att zipfilen har filerna direkt i rooten.

Öppna sedan en kommandoprompt och kör följande kommandon:
1az login
2az account set --subscription "your subscription name"
3az webapp deployment source config-zip --resource-group <group-name> --name <app-name> --src <your-zipfile-name>.zip
(az login
och az account set
är bara nödvändiga om du inte redan är inloggad genom Azure CLI)
Nu skall din zipfil vara uppladdad i mappen /home/data/SitePackages
på din app service. Du kan använda SSH eller Command Prompt i Azureportalen för att kontrollera:

Notera att du också har fått packagename.txt
-filen. Den innehåller namnet på din zipfil (och kommer alltid att innehålla namnet på zipfilen som webservern skall använda).
Din zipfil skall ha monterats i read-only läge på /home/site/wwwroot
. Du kan testa att försöka skapa en undermapp där. Det skall misslyckas.
Steg 5 - Automatisera Package Deployment
I Visual Studio, leta upp din Folder Publish-fil. Öppna den för redigering genom att dubbelklicka på den. Jag föreslår också att du döper om den från FolderProfile till något liknande PackageDeployment.

I publishfilen, lägg till en Target sektion som i bilden nedan.

Här är koden som du skall lägga till inuti Target:
1 <Target Name="CustomActionsAfterPublish" AfterTargets="AfterPublish">
2 <PropertyGroup>
3 <ZipfileName>$([System.DateTime]::Now.ToString("yyyyMMddHHmmss")).zip</ZipfileName>
4 </PropertyGroup>
5 <ZipDirectory SourceDirectory="$(PublishUrl)" DestinationFile="$(MSBuildProjectDirectory)\bin\Release\$(ZipfileName)"/>
6 <Exec Command='az account show' WorkingDirectory="C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin\" ContinueOnError="true" StandardOutputImportance="low" StandardErrorImportance="low"/>
7 <Exec Command='az login' WorkingDirectory="C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin\" Condition="$(MSBuildLastTaskResult) == false" StandardOutputImportance="low" StandardErrorImportance="low" />
8 <Exec Command='az webapp deployment source config-zip --resource-group "my resource group" --name "my app name" --src $(MSBuildProjectDirectory)\bin\Release\$(ZipfileName)' WorkingDirectory="C:\Program Files (x86)\Microsoft SDKs\Azure\CLI2\wbin\" />
9 </Target>
I koden ovanför:
- Byt ut
my resource group
mot ditt eget resource group namn. - Byt ut
my app name
mot ditt eget appnamn. - Ändra WorkingDirectory om din Azure CLI är installerad på någon annan sökväg.
Kör din Publishing Profile. Kolla in resultatet!
Ytterligare Steg
Håll koll på /home/data/SitePackages
biblioteket. Du kan behöva radera gamla zipfiler där för att undvika att få slut på lagringsutrymme.
Notera också att din website inte öppnas i din webbrowser efter publicering. Jag har inte kikat med på hur du automatiskt öppnar din Site URL, men jag tror det går att klara sig utan.