Azure Pipelines:使用 Azure App Service Deploy 排除文件夹

Azure Pipelines: Exclude folders using Azure App Service Deploy

我有一个 Azure DevOps Pipeline,其中包括一个 Azure App Service Deploy 任务 (AzureRmWebAppDeployment),用于部署 ASP.NET核心3.1项目:

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

但是,Azure App Service 目标包含几个预先建立的文件夹中的文件,这些文件夹的管理独立于持续交付过程。我们想使用 Remove additional files at destination 标志 (RemoveAdditionalFilesFlag),同时保留这些文件夹不变。

Disclaimer: I don't consider this a best practice and, in the future, we will be moving these files off to a separate storage location. Until then, I'd like to find a solution that will work resolve this.

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

<Project Sdk="Microsoft.NET.Sdk.Web">
  …
  <ItemGroup>
    <MsDeploySkipRules Include="CustomSkipFolder">
      <ObjectName>dirPath</ObjectName>
      <AbsolutePath>wwwroot\Uploads</AbsolutePath>
    </MsDeploySkipRules>
  </ItemGroup>
</Project>

这种方法适用于 Visual Studio,并以其 Web 部署发布过程而著称。 AzureRmWebAppDeployment 任务似乎不遵守这些规则,但是,即使使用 "Web Deploy" 部署方法 (DeploymentType)。

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

Note: I also posted this to the DevOps Beta, but as the site hasn't reached critical mass yet, I'm cross-posting it here.

Is there a way to honor the MsDeploySkipRules when using the AzureRmWebAppDeployment task?

不确定是否有应用 MsDeploySkipRules 的方法,但在部署过程中有跳过特定文件的现有方法。

详细信息请查看VSTS Build and release中的Exclude/Skip文件 .

按照上述主题中的建议,将 additional arguments 添加到您的任务以跳过特定文件。

在跳过参数中填写您的文件路径。有关语法的更多信息,请参见 Azure App Service Deploy task (press Ctrl+ F to search for additional arguments) and Web Deploy Operation Settings

请试一试,希望对您有所帮助。

正如@yang-shen-msft 在 中指出的那样,似乎没有办法遵守csproj 文件中定义的MSDeploySkipRules。相反,可以通过定义 Azure App Service DeployAzureRmWebAppDeployment) 任务。

由于 -skip 规则似乎没有任何官方文档,并且 the MSDeploy.exe documentation that Azure Pipelines references 已过时,下面提供更多详细信息。

翻译 csproj 格式

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

<Project Sdk="Microsoft.NET.Sdk.Web">
  …
  <ItemGroup>
    <MsDeploySkipRules Include="CustomSkipFolder">
      <ObjectName>dirPath</ObjectName>
      <AbsolutePath>wwwroot\Uploads</AbsolutePath>
    </MsDeploySkipRules>
  </ItemGroup>
</Project>

-skip 规则解释为:

msdeploy.exe -skip:objectName=dirPath,absolutePath=wwwroot\Uploads

将其转换为 Azure App Service Deploy (AzureRmWebAppDeployment) 任务,生成的 yml 可能如下所示:

- 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'

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

    AdditionalArguments: '-skip:objectName=dirPath,absolutePath=wwwroot\Uploads -skip:objectName=dirPath,absolutePath=wwwroot\Downloads'

-skip 规则文档

不幸的是,如上所述,似乎 没有关于 msdeploy.exe-skip 规则的任何官方第一方文档。 2014 documentation acknowledges them, and provides two examples, but doesn't expand on the options. That said, way back in 2012, @richard-szalay wrote a useful article, "Demystifying MSDeploy skip rules”,它为需要额外控制的任何人提供了大量详细信息。

补充说明

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

  • 我正在将 ObjectName 设置为 dirPath Web 部署提供程序,这样我就可以跳过整个 目录 。如果您想跳过 个文件 ,请改用 filePath

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

  • AbsolutePath 实际上是相对于您的 发布根 ——例如,D:\home\site\wwwroot 在 Azure 应用服务上。

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

    absolutePath=wwwroot\Uploads
    

    实际映射到:

    D:\home\site\wwwroot\wwwroot\Uploads