Как скопировать папку из службы приложений TEST в службу приложений LIVE в Azure - PullRequest
0 голосов
/ 27 октября 2019

В моем конвейере Azure DevOps я хотел бы скопировать папку, например, Media из 1 среды / службы приложения, например, TEST, в другую среду / службу приложения, например Live. Папка «Медиа» в TEST может обновляться ПОСЛЕ того, как сборка Ci / cd была развернута в среде TEST - только для исключения ответов, которые могли бы предложить поместить ее в Git и включить в нее как артефакт сборки.

РЕДАКТИРОВАТЬ - Уточнениепри использовании принятого ответа.

Мое хранилище содержит данный сценарий powershell в принятом ответе как:

azure/Copy-Media-Test-To-Live.ps1

Затем я добавляю папку Azure в качестве артефакта вконвейер сборки, т.е.

Отредактируйте azure-pipelines.yml и добавьте:

- task: PublishPipelineArtifact@1 inputs: path: $(System.DefaultWorkingDirectory)/azure/ artifact: azure

В конвейере выпуска - укажите скрипт для выполнения копирования:

steps: - task: AzurePowerShell@4 displayName: 'Azure PowerShell script: FilePath' inputs: azureSubscription: 'Your subscription ' ScriptPath: '$(System.DefaultWorkingDirectory)/_your-artifact-path/azure/Copy-Media-Test-To-Live.ps1' azurePowerShellVersion: LatestVersion

1 Ответ

2 голосов
/ 27 октября 2019

Любое приложение, работающее в среде службы приложений, может управляться через 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"
...