在我的Azure DevOps管道中,我想复制一个文件夹,例如从一个环境/应用程序服务说“测试”到另一个环境/应用程序服务说“实时”的媒体。将Ci / cd构建部署到TEST环境后,可以更新TEST中的Media文件夹-只是为了排除可能建议将其放入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
答案 0 :(得分:2)
可以通过Kudu管理在App Service环境中运行的任何应用程序。 Kudu有一个API,可以下载当前已部署到应用程序的任何文件夹的ZIP压缩存档。可以通过GET请求访问它:
https:// {{YOUR-APP-NAME}} .scm.azurewebsites.net / api / zip / site / {{FOLDER}}
您可以在PowerShell中使用Invoke-WebRequest
cmdlet将这些内容提取到本地存储中。
您确实需要进行身份验证才能使用Kudu API,这在浏览器中很容易,但是在进行自动化时会涉及更多一点。请参阅下面的文章,其中详细介绍了如何检索和呈现基本授权标头,以及如何使用命令API通过Invoke-RestMethod
cmdlet提取ZIP文件。您的服务主体至少需要贡献者访问您的应用程序,才能获得部署凭据以在API调用中使用。
编辑(包括有效的示例脚本):
如果您有多个订阅,并且在部署运行时环境中未正确设置上下文,则可能需要使用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"