【问题标题】:Azure webapp deployment using kudu ZipDeploy fails due to structure of ZIP由于 ZIP 的结构,使用 kudu ZipDeploy 的 Azure webapp 部署失败
【发布时间】:2019-09-12 03:59:34
【问题描述】:

我正在尝试将 .NET Framework 站点的部署过程更新为 Azure WebApp。我们之前使用的是Publish-AzureWebsiteProject PowerShell cmdlet,但它正在被逐步淘汰。因此,我们尝试通过最近发布的Publish-AzWebApp PowerShell cmdlet 使用 kudu 的 zipdeploy 功能。就将文件传输到 Azure 而言,一切正常,但在将 ZIP 解压到正确位置时却失败了。

当我在构建服务器上使用“Package”目标构建站点时,它会生成一个 ZIP 结构以供 MSDeploy 使用。这不是 zipdeploy 方法所期望的格式。 MSDeploy ZIP 文件包含部署 XML,实际内容被深度嵌套到表示原始位置的路径中。 Zipdeploy 似乎想要一个网站内容根目录的简单存档,因此它在提取后将文件从存档复制到文字路径中。

因此,例如,如果我的 Visual Studio 解决方案位于 d:\builds\solution 中,那么用于打包的构建文件将放在 d:\builds\solution\project\obj\debug\Package\PackageTemp 中。该站点的内容进入以下路径D_C\builds\solution\project\obj\debug\Package\PackageTemp\Content 下的ZIP。因此,当 zipdeploy 运行时,它会将内容放入 webapp 中的wwwroot/Content/D_C/builds/solution/project/obj/debug/Package/PackageTemp/Content/

我正在运行的构建项目的命令是:

msbuild.exe /nologo /v:minimal /T:Package /p:Configuration="Debug;VisualStudioVersion=12.0" project.csproj

我希望有人知道如何使用以下方法之一(优先顺序)来实现这一目标:

  • 用于构建站点并创建简单内容 ZIP 的 msbuild 参数
  • 将使用 msdeploy 而不是直接复制部署当前 ZIP 的 kudu 设置
  • 一个自定义 kudu 部署脚本,将通过 msdeploy 而不是文件副本进行部署
  • 将创建兼容 ZIP 的 msbuild 目标自定义

【问题讨论】:

    标签: .net azure deployment msbuild kudu


    【解决方案1】:

    我意识到这是一篇旧帖子,但我在使用 Powershell 压缩部署 Azure Functions 时也遇到了这个问题。 在我的例子中,现有的 Azure Functions 已被删除,但没有创建新的。 我正在使用 Compress-Archive 创建部署包。如果我用 7Zip 创建了这个包,它工作得很好。 那是在 Powershell v5.1.18362.752 上

    在 Powershell 7.0.3 上运行相同的代码效果很好。我还没有尝试过 PowerSHell 6。 这是代码sn-p:

    $files = Get-ChildItem -Path $path -Exclude $exclude
    # check the powershell version because v5.1 has a Compress-Archive that won't deploy to Azure
    if($PSVersionTable.PSVersion.Major -lt 7){
        Write-Host -ForegroundColor Red "Incompatible PowerShell version."
        return
    }
    # compress
    Compress-Archive -Path $files -DestinationPath $publish_archive -CompressionLevel Optimal
    
    $headers = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
    $headers.Add("Authorization", ("Basic {0}" -f $base64AuthInfo))
    $headers.Add("Content-Type", "application/zip")
    
    $ret = Invoke-RestMethod -Method Post -Headers $headers -Uri $url -InFile $publish_archive
    

    $publish_archive 是 zip 文件的完整路径(不是相对路径)

    【讨论】:

    • 旧但仍然相关。我们主要切换到 Azure DevOps,但仍有一些作业在 Jenkins 实例上运行。我一定会试一试的。
    【解决方案2】:

    我了解到您正在尝试使用 CI CD 管道在 Azure Web 应用程序中部署 Web 应用程序。

    以下网址将帮助您部署 Zip

    https://docs.microsoft.com/en-us/azure/app-service/deploy-zip

    注意:MSBUILD Zip 可能不适用于所有部署模型

    压缩配置 MSBuild.exe /p:configuration="release";platform="any cpu";WebPublishMethod=Package;PackageFileName="\MyFolder\package.zip";DesktopBuildPackageLocation="\MyFolder\package.zip";PackageAsSingleFile=true;PackageLocation ="\MyFolder\package.zip";DeployOnBuild=true;DeployTarget=Package

    【讨论】:

    • 感谢您的反馈。我已通读该 URL,它很有帮助,但没有解决我的特定问题。不幸的是,事实上,我遇到了这种部署方法的 ZIP 结构的问题。
    • 你能告诉我你的 CI CD 管道工具是什么吗?
    • Jenkins 1.5,我们使用 MSBuild 任务和 powershell 脚本来部署包。
    • 使用 MSBuild 任务不要压缩文件,而是使用另一个步骤使用“压缩存档”压缩文件。请按照docs.microsoft.com/en-us/azure/app-service/deploy-zip关注。注意:包的大小有限制
    • 是的,这是我希望使用的一种方法。我遇到的一个问题是使用上述构建配置生成的工件不会自动应用 .config 转换。所以我认为我需要做的是1)构建; 2) 应用转换和/或“部署到目录”; 3)压缩输出; 4) 部署到 Azure
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    相关资源
    最近更新 更多