如何使用 Azure DevOps Release Pipelines 在 Azure Web App 的 wwwroot 目录外部署文件

How to deploy a file outside wwwroot directory in Azure Web App using Azure DevOps Release Pipelines

我在 Azure 中托管了一个 Web 应用程序,一些文件位于 wwwroot 文件夹中。我在 wwwroot 之外还有其他人,实际上在同一级别的名为 components 的目录中。

到目前为止,我一直在使用 Kudu 控制台手动更新文件,在 components 中放置一个 ZIP 文件。我已经开始将我的流程转移到 Azure Pipelines;我设法配置了一个自动生成和压缩 files/artifacts 的构建管道,以放入 components.

现在我正在尝试配置发布管道以将文件从构建部署到 components。问题是我无法找到允许我将目标路径配置为 components 的默认任务或来自市场的任务;默认情况下,它们都针对 wwwroot 进行部署。

是否有任何类型的任务或脚本可以实现此目的?

这是我第一次面对 CI/CD 与 Azure Pipelines 的设置,也许我忽略了一些东西。

您可以使用调用 Kudu api 的脚本来实现此目的。您需要在发布管道和 运行 kudu api 中添加一个 azure powershell 任务。以下脚本为例。

1、脚本创建目录components

$WebApp = Get-AzWebApp -Name '<appname>' -ResourceGroupName '<resourcegroupname>'
[xml]$publishingProfile = Get-AzWebAppPublishingProfile -WebApp $WebApp
# 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)))

$bodyToPOST = @{  
command = "md components"
                 dir = "D:\home\site"  
}  
# Splat all parameters together in $param  
$param = @{  
            # command REST API url  
            Uri = "https://<appname>.scm.azurewebsites.net/api/command"  
            Headers = @{Authorization=("Basic {0}" -f $base64AuthInfo)}  
            UserAgent = "powershell/1.0"  
            Method = "POST"  
            Body = (ConvertTo-Json $bodyToPOST)  
            ContentType = "application/json"  
}  
# Invoke REST call  
Invoke-RestMethod @param  

以上脚本将首先从您应用的发布配置文件中获取用户名和密码,稍后将在调用 kudu api 时用作验证。并且 api 将 运行 您自定义的命令在 "d:\home\site" 中创建目录组件

2,使用 kudu api 部署您的应用程序

创建组件目录后,您可以调用 kudu api 将您的应用程序部署到组件目录。请参考下面的例子。

$param = @{  
            # zipdeploy api url  
            Uri = "https://<appname>.scm.azurewebsites.net/api/zip/site/components"  
            Headers = @{Authorization=("Basic {0}" -f $base64AuthInfo)}  
            UserAgent = "powershell/1.0"  
            Method = "PUT"  
            # Deployment Artifact Path  
            InFile = "$(System.DefaultWorkingDirectory)\<artifacts_alias>\drop\<artifacts_name>.zip"  
            ContentType = "multipart/form-data"  
}  
# Invoke REST call  
Invoke-RestMethod @param  

InFile 应指向由您的发布管道下载的工件文件的位置。通常它位于 "$(System.DefaultWorkingDirectory)\<artifacts_alias>\drop\<artifacts_name>.zip"

关于Kudu的更多信息Api,可以参考这篇blog