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 存档中。)
我的问题是:
- 我的 Web 应用程序是否应该能够 运行 只用我的 zip 文件作为
C:\home\site\wwwroot\MyPackageName.zip?
或者它是否真的需要像 MSFT 代表指示的那样解压?
- 如果它应该 运行 这样,关于我缺少什么的任何想法?我假设它在我的 YAML 中(它实际上在这里选择了 3 个 publishProfile 设置中的哪一个?)或在
Settings / Configuration/ Path Mappings
或 Application settings
中,但我现在不知道是什么,我是 运行想出点子。
谢谢,埃里克
-
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 或其他任何地方。
-
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
。然后我可以恢复路径映射拼凑并继续前进。
我正在通过 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 存档中。)
我的问题是:
- 我的 Web 应用程序是否应该能够 运行 只用我的 zip 文件作为
C:\home\site\wwwroot\MyPackageName.zip?
或者它是否真的需要像 MSFT 代表指示的那样解压? - 如果它应该 运行 这样,关于我缺少什么的任何想法?我假设它在我的 YAML 中(它实际上在这里选择了 3 个 publishProfile 设置中的哪一个?)或在
Settings / Configuration/ Path Mappings
或Application settings
中,但我现在不知道是什么,我是 运行想出点子。
谢谢,埃里克
-
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 或其他任何地方。
-
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
。然后我可以恢复路径映射拼凑并继续前进。