Azure Pipelines:使用 Azure 应用服务部署排除文件夹

Jer*_*ney 4 continuous-integration webdeploy azure-deployment azure-web-app-service azure-pipelines

我有一个Azure DevOps Pipeline,其中包含用于部署ASP.NET Core 3.1项目的Azure 应用服务部署任务 ( ) :AzureRmWebAppDeployment

\n\n
- task: AzureRmWebAppDeployment@4\n  inputs:\n    ConnectionType: \'AzureRM\'\n    azureSubscription: \'Azure Subscription(01234567-89ab-cdef-0123-456789abcdef)\'\n    appType: \'webApp\'\n    WebAppName: \'MyStagingSite\'\n    packageForLinux: \'$(Build.ArtifactStagingDirectory)/**/*.zip\'\n    enableCustomDeployment: true\n    DeploymentType: \'webDeploy\'\n    enableXmlTransform: false\n    enableXmlVariableSubstitution: true\n    RemoveAdditionalFilesFlag: false\n
Run Code Online (Sandbox Code Playgroud)\n\n

但是, Azure应用服务目标包含多个预先建立的文件夹中的文件,这些文件夹的管理独立于持续交付过程。我们想使用“删除目标位置的附加文件”标志(RemoveAdditionalFilesFlag ),同时保持这些文件夹完好无损。

\n\n
\n

免责声明:我不认为这是最佳实践,将来我们会将这些文件移至单独的存储位置。在那之前,我想找到一个能够解决这个问题的解决方案。

\n
\n\n

Visual Studio 2019MsDeploySkipRules中,我们通过使用文件中的以下内容从发布过程中排除这些文件来实现此目的csproj

\n\n
- task: AzureRmWebAppDeployment@4\n  inputs:\n    ConnectionType: \'AzureRM\'\n    azureSubscription: \'Azure Subscription(01234567-89ab-cdef-0123-456789abcdef)\'\n    appType: \'webApp\'\n    WebAppName: \'MyStagingSite\'\n    packageForLinux: \'$(Build.ArtifactStagingDirectory)/**/*.zip\'\n    enableCustomDeployment: true\n    DeploymentType: \'webDeploy\'\n    enableXmlTransform: false\n    enableXmlVariableSubstitution: true\n    RemoveAdditionalFilesFlag: false\n
Run Code Online (Sandbox Code Playgroud)\n\n

这种方法非常适合 Visual Studio,并因其 Web 部署发布过程而受到推崇。AzureRmWebAppDeployment然而,即使使用“Web 部署”部署方法 ( ),任务似乎也不会遵守这些规则DeploymentType

\n\n

MsDeploySkipRules有没有办法在使用任务时兑现AzureRmWebAppDeployment?如果没有,是否有办法提供在部署过程中应跳过或忽略的文件夹列表?或者,在发布到 Azure 应用服务时是否有另一项任务允许使用这些选项之一?

\n\n
\n

注意:我还将其发布到DevOps Beta中,但由于该网站尚未达到临界质量,因此我将其交叉发布到此处。

\n
\n

Jer*_*ney 7

正如 @yang-shen-msft 在接受的答案中指出的那样,似乎没有办法遵守文件MSDeploySkipRules中的定义csproj相反,可以通过定义Azure 应用服务部署( ) 任务的附加参数( AdditionalArguments) 参数来跳过文件和文件夹。AzureRmWebAppDeployment

\n

由于似乎没有任何有关规则的官方文档-skip,并且Azure Pipelines 引用的文档MSDeploy.exe过时,因此以下内容提供了更多详细信息。

\n

翻译csproj格式

\n

首先,认识到当您通过 Visual Studio 部署项目时,它只是简单地获取文件MSDeploySkipRules中的配置csproj并将它们添加到msdeploy.exe作为-skip规则的内部调用中,这一点很有用。因此,考虑到 中定义的以下规则csproj

\n
<Project Sdk="Microsoft.NET.Sdk.Web">\n  \xe2\x80\xa6\n  <ItemGroup>\n    <MsDeploySkipRules Include="CustomSkipFolder">\n      <ObjectName>dirPath</ObjectName>\n      <AbsolutePath>wwwroot\\\\Uploads</AbsolutePath>\n    </MsDeploySkipRules>\n  </ItemGroup>\n</Project>\n
Run Code Online (Sandbox Code Playgroud)\n

-skip规则解释为:

\n
msdeploy.exe -skip:objectName=dirPath,absolutePath=wwwroot\\\\Uploads\n
Run Code Online (Sandbox Code Playgroud)\n

将此转换为Azure 应用服务部署( AzureRmWebAppDeployment) 任务,结果yml可能如下所示:

\n
msdeploy.exe -skip:objectName=dirPath,absolutePath=wwwroot\\\\Uploads\n
Run Code Online (Sandbox Code Playgroud)\n

-skip请注意,可以在同一个调用上定义多个规则msdeploy.exe

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

-skip规则文档

\n

不幸的是,如上所述,似乎没有任何官方的第一方文档来-skip说明msdeploy.exe. 2014 年的文档承认了它们,并提供了两个示例,但没有扩展这些选项。也就是说,早在 2012 年,@richard-szalay 就写了一篇有用的文章“揭秘 MSDeploy 跳过规则”,它为任何需要额外控制的人提供了很多详细信息。

\n

补充笔记

\n
    \n
  • ObjectName的是Web Deploy Provider,它可用于更新的不仅仅是文件系统。

    \n
  • \n
  • 我正在设置ObjectNameWebdirPath部署提供程序,以便可以跳过整个目录。如果您想跳过文件,请使用filePath改用。

    \n
  • \n
  • dirPathfilePath接受中的正则表达式AbsolutePath,可能允许合并遵循一致模式的重复规则。

    \n
  • \n
  • AbsolutePath实际上与 Azure 应用服务上的发布根\xe2\x80\x94e.g.相关。D:\\home\\site\\wwwroot

    \n
  • \n
  • 当我发布 ASP.NET Core 站点时,按照惯例,我的静态文件位于嵌套wwwroot文件夹中,因此我的设置:

    \n
    absolutePath=wwwroot\\\\Uploads\n
    Run Code Online (Sandbox Code Playgroud)\n

    实际上映射到:

    \n
    D:\\home\\site\\wwwroot\\wwwroot\\Uploads\n
    Run Code Online (Sandbox Code Playgroud)\n
  • \n
\n