如何使用 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。
我在 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。