Azure Pipelines: 如何在 Azure App Service Deploy 中排除文件夹

88次阅读
没有评论

问题描述

在使用 Azure DevOps Pipeline 部署 ASP.NET Core 3.1 项目时,使用了 Azure App Service Deploy 任务(AzureRmWebAppDeployment)。但是,目标的 Azure App Service 中包含了一些在持续交付过程中独立管理的文件夹。用户希望在部署过程中保留这些文件夹的同时,使用“删除目标处的其他文件”标志(RemoveAdditionalFilesFlag)。
在 Visual Studio 2019 中,用户可以通过在 csproj 文件中使用 MsDeploySkipRules 来实现这一点。但是,使用 AzureRmWebAppDeployment 任务时,似乎无法遵循 MsDeploySkipRules。用户想知道是否有办法在使用 AzureRmWebAppDeployment 任务时遵循 MsDeploySkipRules,或者是否有其他任务可以实现这些选项之一。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

根据 Stack Overflow 上的一位用户的回答,似乎无法直接遵循 csproj 文件中定义的 MsDeploySkipRules。但是,可以通过在 AzureRmWebAppDeployment 任务的 AdditionalArguments 参数中定义跳过规则来实现跳过文件和文件夹。
以下是具体步骤:
1. 打开 Azure DevOps Pipeline 中的 Azure App Service Deploy 任务。
2. 在任务的输入中,找到 AdditionalArguments 参数。
3. 在 AdditionalArguments 参数中添加 -skip:objectName=dirPath,absolutePath=wwwroot\\Uploads
– 这个示例中的规则是跳过名为 CustomSkipFolder 的文件夹,路径为 wwwroot\Uploads。
– 如果需要跳过多个文件夹,可以在 AdditionalArguments 参数中添加多个 -skip 规则。
4. 保存并运行 Pipeline。

以下是示例的 AzureRmWebAppDeployment 任务的 YAML 配置:

- task: AzureRmWebAppDeployment@4
  inputs:
    ConnectionType: 'AzureRM'
    azureSubscription: 'Azure Subscription'
    appType: 'webApp'
    WebAppName: 'MyStagingSite'
    packageForLinux: '$(Build.ArtifactStagingDirectory)/**/*.zip'
    enableCustomDeployment: true
    DeploymentType: 'webDeploy'
    enableXmlTransform: false
    enableXmlVariableSubstitution: true
    RemoveAdditionalFilesFlag: true
    AdditionalArguments: '-skip:objectName=dirPath,absolutePath=wwwroot\\Uploads'

请注意,这里的 AdditionalArguments 参数中的 -skip 规则与 csproj 文件中的 MsDeploySkipRules 相对应。但是,需要注意的是,官方文档中似乎没有提供关于 -skip 规则的详细说明,因此可以参考其他资源中的说明来了解更多选项。

方案2

如果 AdditionalArguments 参数无法满足需求,用户还可以考虑使用其他任务或脚本来实现跳过文件夹的功能。例如,可以使用 PowerShell 脚本或其他自定义脚本来在部署过程中排除特定文件夹。
以下是一个示例 PowerShell 脚本,可以在部署之前排除文件夹:

# 部署前排除文件夹
$excludeFolders = @(
    "wwwroot\\Uploads",
    "wwwroot\\Logs"
)

# 获取要部署的文件列表
$filesToDeploy = Get-ChildItem -Recurse -File

# 排除指定文件夹中的文件
$filesToDeploy = $filesToDeploy | Where-Object { $file = $_; $excludeFolders | ForEach-Object { $file.FullName -notlike "*\$_\*" } }

# 执行部署操作
foreach ($file in $filesToDeploy) {
    # 执行部署操作,例如使用 Azure PowerShell 或其他命令行工具
    # ...
}

在这个示例中,我们首先定义了要排除的文件夹列表 $excludeFolders。然后,我们使用 PowerShell 的 Get-ChildItem 命令获取要部署的文件列表,并使用 Where-Object 过滤掉指定文件夹中的文件。最后,我们可以使用 Azure PowerShell 或其他命令行工具执行实际的部署操作。

请注意,这只是一个示例,具体的脚本实现可能因用户的需求和环境而有所不同。用户可以根据自己的情况进行调整和扩展。

以上是两种可能的解决方案,用户可以根据自己的需求选择适合的方法来排除文件夹。

正文完