【问题标题】:Azure Pipelines: Exclude folders using Azure App Service DeployAzure Pipelines:使用 Azure App Service Deploy 排除文件夹
【发布时间】:2020-03-05 01:31:55
【问题描述】:

我有一个 Azure DevOps Pipeline,其中包括一个 Azure App Service Deploy 任务 (AzureRmWebAppDeployment),用于部署 ASP.NET Core 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),同时保持这些文件夹不变。

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

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 部署”部署方法 (DeploymentType)。

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

注意:我也将其发布到 DevOps Beta,但由于该站点尚未达到临界质量,因此我将其交叉发布在这里。

【问题讨论】:

    标签: continuous-integration azure-pipelines azure-web-app-service webdeploy azure-deployment


    【解决方案1】:

    正如@yang-shen-msft 在the accepted answer 中指出的那样,似乎没有办法兑现csproj 文件中定义的MSDeploySkipRules。相反,可以通过定义 Azure App Service Deploy (AzureRmWebAppDeployment) 任务的 Additional Arguments (AdditionalArguments) 参数来跳过文件和文件夹。

    由于-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 承认它们,并提供了两个示例,但没有扩展选项。也就是说,早在 2012 年,@richard-szalay 写了一篇有用的文章“Demystifying MSDeploy skip rules”,它为任何需要额外控制的人提供了很多细节。

    补充说明

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

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

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

    • AbsolutePath 实际上与您的发布根目录相关——例如,Azure 应用服务上的D:\home\site\wwwroot

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

      absolutePath=wwwroot\\Uploads
      

      实际上映射到:

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

    【讨论】:

    • 在 Kudu 上,这是我的路径:D:\home\site\wwwroot。那么是D:\home 而不是dirPathsite\wwwroot 而不是wwwroot\Uploads
    • @Cataster:由于您使用.NET Core,您可能只想将absolutePath 设置为web.dev.config。这将映射到D:\home\site\wwwroot\web.dev.config
    • nvm 我想通了,我必须使用 \\ 和通配符 \\*.zip
    • @Cataster:很高兴听到!仅供参考:我现在已经更新了我的答案,包括了这次交流的笔记,这样未来的读者就可以很容易地获得这些信息。
    • 再次非常感谢 Jeremy,自从我发布的一个问题被打开以来,在 MSFT 闲逛了 3 天时,你真的把它搞定了。至少我可以给你点赞来奖励你:)
    【解决方案2】:

    在使用 AzureRmWebAppDeployment 任务时,是否有办法遵守 MsDeploySkipRules?

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

    详情请查看Exclude/Skip files in VSTS Build and release

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

    在跳过参数中填写您的文件路径。更多信息请访问Azure App Service Deploy task(按 Ctrl+F 搜索additional arguments)和Web Deploy Operation Settings 以获取语法。

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

    【讨论】:

    • 这是否有助于跳过或忽略您的文件夹?如果是这样,你可以接受。或者如果您在实施时遇到一些问题,请随意告诉。谢谢!
    • 我绝对希望找到一种方法来集中这个配置,但至少这让我有机会恢复RemoveAdditionalFilesFlag 而不必担心这些异常。谢谢!我已经实现了这一点并确认它按预期工作。我也很抱歉花了这么长时间将其标记为已接受的答案;我想在这样做之前确认它是否有效。
    • 另外,您知道msdeploy.exe 的最新文档在哪里吗?我一直找不到它,每个来源(包括 Azure Pipelines 任务)都指向您链接到的 2014 文档。问题是它实际上并没有记录使用-skip: 规则的参数或语法。我能够根据我的csproj&lt;MsDeploySkipRules /&gt; 指令推断出这一点,并且我找到了third-party documentation,但找不到来自Microsoft 的官方文档。
    猜你喜欢
    • 1970-01-01
    • 2017-08-17
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 2015-09-17
    相关资源
    最近更新 更多