Azure WEBSITE_RUN_FROM_PACKAGE 真的意味着不要解压 zip 存档吗?

Does Azure WEBSITE_RUN_FROM_PACKAGE really mean don't unpack the zip archive?

我正在通过 GitHub 工作流将 .NET Framework Web 应用压缩部署到 Azure 应用服务。

我在 Azure 控制台的 Settings / Configuration / Application settings 页面中将 WEBSITE_RUN_FROM_PACKAGE 设置为 1。我也尝试过将 WEBSITE_RUN_FROM_ZIP 设置为 1 以防万一(尽管我认为这是一个过时的标志)。

包在 GitHub 中正确构建,我可以在我的 Kudu 调试控制台中看到它,在 C:\home\site\wwwroot(如 MyPackageName.zip)下以及 [=20 中=](例如 20220512205318.zip)。

我的 YAML 的部署部分是:

deploy:
  runs-on: windows-latest
  needs: build
  environment:
    name: 'Test'
    url: ${{ steps.deploy-to-webapp.outputs.webapp-url }}

  steps:
    - name: Download artifact from build job
      uses: actions/download-artifact@v2
      with:
        name: ASP-app

    - name: Deploy to Azure Web App
      id: deploy-to-webapp
      uses: azure/webapps-deploy@v2
      with:
        app-name: ${{ env.AZURE_WEBAPP_NAME }}
        publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_XYZsecret }}
        package: .

我上传到 GitHub 的 .PublishSettings 看起来像:

<publishData>
    <!-- Which one of these 3 profiles is my YAML using?  I don't actually know. -->
    <publishProfile profileName="mywebappname-test - Web Deploy" publishMethod="MSDeploy"  etc="foobar">
        <databases/>
    </publishProfile>
    <publishProfile profileName="mywebappname-test - FTP" publishMethod="FTP" etc="foobar">
        <databases/>
    </publishProfile>
    <publishProfile profileName="mywebappname-test - Zip Deploy" publishMethod="ZipDeploy" etc="foobar">
        <databases/>
    </publishProfile>
</publishData>

zip 包不会自动解压。与我交谈的 MSFT 支持代表建议这就是问题所在,事实上,当我将包下载到我的机器并将其放入 Kudu 的 Tools/Zip Push Deploy 页面时,我看到包已解压,我可以获取该站点通过设置适当的物理路径来匹配“/”虚拟路径来工作。特别是 Kudu Tools Zip Push 导致我的 web.config 和 favicon.ico 等文件显示在:

C:\home\site\wwwroot\Content\D_C\a\foo\bar\good\boy\obj\Test\Package\PackageTmp

我可以转到我的应用程序服务的 Azure 控制台,导航到 Settings / Configuration/ Path Mappings, Virtual applications and directories,然后将现有条目编辑为:

Virtual path: /
Physical Path: site\wwwroot\Content\D_C\a\foo\bar\good\boy\obj\Test\Package\PackageTmp
Type: Application

然后在浏览器中看到我的网站。

但是,当解压缩存档时,我将条目保留为:

Virtual path: /
Physical Path: site\wwwroot
Type: Application

我无法在浏览器中看到我的站点,而只看到“您无权查看此目录或页面”。然后,当我深入查看 Kudo 中的日志时,我在我的主站点上看到 403.14 - Forbidden 错误,在 C:\home\site\wwwroot\favicon.ico 上看到 404.0 - Not Found 错误。 (与我的其他文件一样,favicon.ico 仍在 [...]\foo\bar\good\boy\obj\Test\Package\PackageTmp\favicon.ico 的 zip 存档中。)

我的问题是:

  1. 我的 Web 应用程序是否应该能够 运行 只用我的 zip 文件作为 C:\home\site\wwwroot\MyPackageName.zip? 或者它是否真的需要像 MSFT 代表指示的那样解压?
  2. 如果它应该 运行 这样,关于我缺少什么的任何想法?我假设它在我的 YAML 中(它实际上在这里选择了 3 个 publishProfile 设置中的哪一个?)或在 Settings / Configuration/ Path MappingsApplication settings 中,但我现在不知道是什么,我是 运行想出点子。

谢谢,埃里克

  1. Should my web app be able to run at all with just my zip file sitting there as C:\home\site\wwwroot\MyPackageName.zip?

差不多,是的,只是不在 wwwroot 中。启用 WEBSITE_RUN_FROM_PACKAGE 后,应用程序将 运行 从存档中直接作为只读目录挂载。没有任何内容被复制到 wwwwroot 或其他任何地方。

  1. If it is supposed to run this way, any ideas on what am I missing?

我的理解是不支持来自 GitHub 的包部署,或者更确切地说 GitHub 存档与来自 App Service 包的 运行 不兼容。

dwellman 的回答是对我最初问题的正确回答,但我将在此处添加更多详细信息,说明我如何使用这些信息使我的部署正常工作。我觉得无法读取 zip 存档的内部索引 XML 文件以找到正确的相对路径是 Azure 的一个缺陷,但在它被解决之前,我希望其他人可能会发现它有用。

我的第一步是放弃部署为 zip 文件的想法。有可能我仍然可以通过做一些 post-processing 以不同的格式压缩东西而不使用嵌套文件夹来完成这项工作,但我决定在我的情况下 single-file 部署的好处不是物有所值。为了停止作为 zip 文件部署,我手动编辑了作为 msbuild 选项传入的 .pubxml 文件 /p:PublishProfile=AzureCI.pubxml。我所做的更改是将 PackageAsSingleFile 从 true 更改为 false,并将 DesktopBuildPackageLocation 从 zip 文件路径更改为文件夹路径。

仅此一项就足以让我的站点作为单个文件而不是 zip 存档部署到 Azure。这些文件仍然隐藏在丑陋的文件夹结构中,但我至少可以在 Kudu 中看到它们,并通过应用我在原始问题中描述的相同 Settings / Configuration/ Path Mappings, Virtual applications and directories 调整来使网站正常工作。

我本可以就此打住,但我希望能够只使用默认虚拟路径,而不是让我的 Azure 配置如此依赖于我的上游进程。换句话说,我只想让我的 web.config 和 favicon.ico 等直接放在 C:\home\site\wwwroot 中,而不是深入到子文件夹结构的杂草中。为了完成这项工作,我在我的 YAML 中将包参数从 .到适当的路径如下:

- name: Deploy to Azure Web App
  id: deploy-to-webapp
  uses: azure/webapps-deploy@v2
  with:
    app-name: ${{ env.AZURE_WEBAPP_NAME }}
    publish-profile: ${{ secrets.AZUREAPPSERVICE_PUBLISHPROFILE_XYZsecret }}
    package: .\Archive\Content\D_C\a\foo\bar\good\boy\obj\Test\Package\PackageTmp

这导致部署过程只从构建中提取我需要的文件并将它们放入 C:\home\site\wwwroot。然后我可以恢复路径映射拼凑并继续前进。