Любое приложение, работающее в среде службы приложений, может управляться через Kudu. У Kudu есть API для загрузки сжатого ZIP-архива любой папки, развернутой в данный момент в приложении. Доступ к нему можно получить с помощью запроса GET по адресу:
https://{{YOUR -APP-NAME}}. Scm.azurewebsites.net/api/zip/site/ndomndomFOLDER‹‹
Выможно использовать командлет Invoke-WebRequest
в PowerShell для перетаскивания этого содержимого в локальное хранилище.
Вам необходимо пройти проверку подлинности, чтобы использовать API Kudu, который прост в браузере, но при автоматизации это немного сложнее. Ознакомьтесь со следующей статьей, в которой подробно описано, как получить и представить заголовок Basic Authorization, а также как использовать командный API для извлечения ZIP-файла с помощью командлета Invoke-RestMethod
. Участнику службы потребуется как минимум доступ участника к вашим приложениям, чтобы получить учетные данные развертывания для использования в вызовах API.
https://blogs.msdn.microsoft.com/waws/2018/06/26/powershell-script-to-execute-commands-in-scm-website-on-all-instances/
РЕДАКТИРОВАТЬ (включая работающий пример сценария):
Если у вас несколько подписок, и контекст не был задан должным образом в среде выполнения развертывания, вам может потребоваться использовать Set-AzContext -Subscription "<SubsciptionName>"
, чтобы установить контекст для получения WebApp
$srcResGroupName = "Test"
$srcWebAppName = "tstest12"
$srcDirectory = "/site/wwwroot/myFolder/"
$dstResGroupName = "Test"
$dstWebAppName = "tstest123"
$dstDirectory = "/site/wwwroot/myFolder/"
# Get publishing profile for SOURCE application
$srcWebApp = Get-AzWebApp -Name $srcWebAppName -ResourceGroupName $srcResGroupName
[xml]$publishingProfile = Get-AzWebAppPublishingProfile -WebApp $srcWebApp
# Create Base64 authorization header
$username = $publishingProfile.publishData.publishProfile[0].userName
$password = $publishingProfile.publishData.publishProfile[0].userPWD
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password)))
$apiBaseUrl = "https://$($srcWebApp.Name).scm.azurewebsites.net/api"
# Download the ZIP file to ./tmp.zip
Invoke-RestMethod -Uri "$apiBaseUrl/zip$($srcDirectory)" `
-Headers @{UserAgent="powershell/1.0"; `
Authorization=("Basic {0}" -f $base64AuthInfo)} `
-Method GET `
-OutFile ./tmp.zip
# Get publishing profile for DESTINATION application
$dstWebApp = Get-AzWebApp -Name $dstWebAppName -ResourceGroupName $dstResGroupName
[xml]$publishingProfile = Get-AzWebAppPublishingProfile -WebApp $dstWebApp
# Create Base64 authorization header
$username = $publishingProfile.publishData.publishProfile[0].userName
$password = $publishingProfile.publishData.publishProfile[0].userPWD
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $username,$password)))
$apiBaseUrl = "https://$($dstWebApp.Name).scm.azurewebsites.net/api"
# Upload and extract the ZIP file
Invoke-RestMethod -Uri "$apiBaseUrl/zip$($dstDirectory)" `
-Headers @{UserAgent="powershell/1.0"; `
Authorization=("Basic {0}" -f $base64AuthInfo)} `
-Method PUT `
-InFile ./tmp.zip `
-ContentType "multipart/form-data"