JJJCoder
JJJCoder

Reputation: 16916

Use Powershell to Publish to a WebApp Virtual Directory

I have an Azure WebApp, that is split into two virtual directories - UI and API.

I've managed to create the virtual directories in code, but cannot find a means of publishing to them.

Here's my code so far:

# Set UI Virtaul Directory (call /ui )
$website = Get-AzWebApp -Name $appsvWebAppName -ResourceGroupName $resourceGroupName
 $VDApp = New-Object Microsoft.Azure.Management.WebSites.Models.VirtualApplication 
 $VDApp.VirtualPath = "/ui" 
 $VDApp.PhysicalPath = "site\wwwroot\ui" 
 $VDApp.PreloadEnabled ="YES" 
 $website.siteconfig.VirtualApplications.Add($VDApp) 
 $website | Set-AzWebApp -Verbose

# Set API Virtual Directory (call /api )
$website = Get-AzWebApp -Name $appsvWebAppName -ResourceGroupName $resourceGroupName
 $VDApp = New-Object Microsoft.Azure.Management.WebSites.Models.VirtualApplication 
 $VDApp.VirtualPath = "/api" 
 $VDApp.PhysicalPath = "site\wwwroot\api" 
 $VDApp.PreloadEnabled ="YES" 
 $website.siteconfig.VirtualApplications.Add($VDApp) 
 $website | Set-AzWebApp -Verbose

 $website.SiteConfig.VirtualApplications

# Dotnet publish & convert to zip here, removed for brevity ...

$uiZipPath = $zipFilesFolder + "\ui.zip"


 $publishprofile = Get-AzWebAppPublishingProfile -ResourceGroupName $resourceGroupName `
 -Name $appsvWebAppName `
 -OutputFile $publishProfileFileName


 Publish-AzWebApp -ArchivePath $uiZipPath `
 -ResourceGroupName $resourceGroupName `
 -Name $appsvWebAppName 

I can't see how to point Publish-AzWebApp at a virtual directory.

The publish can be done manually, but I really want to automate it (using Publish-AzWebApp or another means).

How can I do this please?

Upvotes: 0

Views: 789

Answers (1)

Joy Wang
Joy Wang

Reputation: 42043

The Publish-AzWebApp does not support that, you could use Kudu API in powershell to automate it.

In my sample, it uses VFS to create the directory first, then upload the zip file via Zip.

$appsvWebAppName = "xxxxxxx"
$resourceGroupName = "xxxxxxx"

$resource = Invoke-AzResourceAction -ResourceGroupName $resourceGroupName -ResourceType Microsoft.Web/sites/config -ResourceName "$appsvWebAppName/publishingcredentials" -Action list -ApiVersion 2018-02-01 -Force

$username = $resource.Properties.publishingUserName
$password = $resource.Properties.publishingPassword
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username, $password)))
$userAgent = "powershell/1.0"

# Create the folder, not lose `/` after `ui`
$apiUrl = "https://$appsvWebAppName.scm.azurewebsites.net/api/vfs/site/wwwroot/ui/"
Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -UserAgent $userAgent -Method PUT

#Upload the zip file
$apiUrl = "https://$appsvWebAppName.scm.azurewebsites.net/api/zip/site/wwwroot/ui"
$filePath = "C:\Users\joyw\Desktop\testdep.zip"
Invoke-RestMethod -Uri $apiUrl -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} -UserAgent $userAgent -Method PUT -InFile $filePath -ContentType "multipart/form-data"

For the site\wwwroot\api, it is the same logic, just change ui to api in the script.

Upvotes: 1

Related Questions