如何从 Azure DevOps 中的文件夹(不是 zip)部署 WebApp

Posted

技术标签:

【中文标题】如何从 Azure DevOps 中的文件夹(不是 zip)部署 WebApp【英文标题】:How to deploy a WebApp from a folder (not a zip) in Azure DevOps 【发布时间】:2020-05-20 09:56:06 【问题描述】:

我无法让 DevOps 使用文件夹进行部署,它给了我这个错误:

[错误]错误:找不到具有指定模式的包: d:\a\1\a*.deploy.cmd检查任务中提到的包是否 在构建或先前阶段中作为工件发布,并且 在当前作业中下载。

Azure App Service Deploy Task 文档说明了 Package 参数:

包的文件路径,或包含应用服务的文件夹 MSBuild 生成的内容,或者压缩到压缩的 zip 或 war 文件中。

这是我的发布任务:

  - task: DotNetCoreCLI@2
    inputs:
      command: publish
      publishWebProjects: false
      arguments: '--configuration $(BuildConfiguration) --output $(Build.ArtifactStagingDirectory)'
      zipAfterPublish: false
      modifyOutputPath: true
      projects: |
        src/Company/Project.csproj 

和我的部署任务:

  - task: AzureRmWebAppDeployment@4
    inputs:
      ConnectionType: 'PublishProfile'
      PublishProfilePath: '$(System.DefaultWorkingDirectory)/src/Company/Properties/PublishProfiles/WebDeploy.pubxml'
      PublishProfilePassword: '$(password)'
      Package: '$(Build.ArtifactStagingDirectory)/Company'

为什么要查找 deploy.cmd?我做错了什么?

【问题讨论】:

一年多之后,您是否设法解决了这个问题? 【参考方案1】:

错误:找不到具有指定模式的包:d:\a\1\a*.deploy.cmd

从错误信息来看,这个问题的根本原因可能是你的路径中没有这样的文件(xxx.deploy.cmd)。

“Dotnet Publish”任务不会生成此文件。

要解决这个问题,您需要添加一个“Dotnet build”任务。此任务将生成必要的文件(例如 deploy.cmd):

同时,您还需要在arguments字段中添加配置参数。

/p:DeployOnBuild=true /p:WebPublishMethod=package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactstagingdirectory)

这是一个例子:

- task: DotNetCoreCLI@2
  displayName: Build
  inputs:
    projects: '**/*.csproj'
    arguments: '/p:DeployOnBuild=true /p:WebPublishMethod=package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactstagingdirectory)'

- task: DotNetCoreCLI@2
  displayName: Publish
  inputs:
    command: publish
....

然后会添加xxx.deploy.cmd。

希望这会有所帮助。

【讨论】:

添加 /p:PackageAsSingleFile=true 是否会改为部署 zip?那么发布命令是否必要? 如果您查看我的发布任务,那正是我正在做的事情。问题是“AzureRmWebAppDeployment”尝试部署文件夹失败。这实际上不支持吗? 来自这个关于azure app service deploy task的文档:“包:包含由MSBuild生成的应用服务内容的文件夹”。该文件夹受任务支持。但必要的配置文件需要包含在 artifacts 文件夹中(例如 deploy.cmd 文件)。 MsDeploy 能够在没有 cmd 文件的情况下部署文件夹,但是当您使用 Visual Studio 发布时它会这样做。这也是not how it's documented 根据您的要求,我建议您可以使用 "ConnectionType:AzureRM" (Azure Resource Manager) 。在这种情况下,默认部署方法是 web deploy。您可以尝试将文件夹直接部署到 webapp。请测试它并检查它是否可以工作。如果需要部署。默认为cmd文件,部署方式可以是zip deploy。【参考方案2】:

请尝试

  - task: AzureRmWebAppDeployment@4
    inputs:
      ConnectionType: 'PublishProfile'
      PublishProfilePath: '$(System.DefaultWorkingDirectory)/src/Company/Properties/PublishProfiles/WebDeploy.pubxml'
      PublishProfilePassword: '$(password)'
      Package: '$(Build.ArtifactStagingDirectory)/Company/*'

区别在于Package输入。

【讨论】:

错误:多个包与指定模式匹配:d:\a\1\a\Company*。请限制搜索模式。我需要将其指向 .dll 吗?

以上是关于如何从 Azure DevOps 中的文件夹(不是 zip)部署 WebApp的主要内容,如果未能解决你的问题,请参考以下文章

如何获取从 Azure Devops / VSTS / TFS 中的“Windows 机器文件复制”任务复制的文件总数?

如何从 Azure Devops 服务器迁移到 Azure Devops 服务中的现有组织

如何从 Azure DevOps Pipeline 读取 Azure 文件共享文件

作业终止后如何将生成的文件从 Azure Databricks 导出到 Azure DevOps?

如何从 Azure DevOps 中的部署后批准/部署后门调用 Powershell 脚本

如何请求访问 Azure DevOps 中的项目?