ASP.NET 从 Visual Studio 发布的核心 3.1 Web 应用在从 Azure DevOps 发布管道部署时不起作用
ASP.NET Core 3.1 web app publishes from Visual Studio does not work when deployed from Azure DevOps release pipeline
我有一个用 dotnet core 3.1 编写的完全可用的网络 api。我一直在关注 TimCoRetailManager series。
当 运行 in Visual Studio 时,应用程序 bui 没有错误并且按预期工作。我有免费的 Azure 订阅。我在 linux 和两个基本 SQL 服务器数据库上设置了一个 F1 免费 Web 应用程序服务,它们都在同一个资源组中,防火墙设置为允许访问其他 azure 服务进行连接。我可以发布网络 api 和数据库。我可以使用 azure data studio 连接到数据库,一切看起来都很好。我更新了应用程序服务的配置,因此它使用 azure secrets 而不是我的开发环境机密。 API 从 Visual Studio 发布时按预期工作,我可以大摇大摆 ui,生活很美好。
开始使用 Azure DevOps。当我使用来自 Azure DevOps 的发布管道时,该管道会给出一条成功消息。但是,当我导航到 API(有一个简单的 MVC 登录页面 + swagger)时,它只有一个“应用程序错误 :(”页面。我在 Azure App 服务上找到了日志,他们有这个......
Ok 2022-03-01T21:44:43.8098649 \/ \/ \/
Ok 2022-03-01T21:44:43.8098677 A P P S E R V I C E O N L I N U X
Ok 2022-03-01T21:44:43.8098704
Ok 2022-03-01T21:44:43.809873 Documentation: http://aka.ms/webapp-linux
Ok 2022-03-01T21:44:43.8098757 Dotnet quickstart: https://aka.ms/dotnet-qs
Ok 2022-03-01T21:44:43.8098784 ASP .NETCore Version: 3.1.21
Ok 2022-03-01T21:44:43.809881 Note: Any data outside '/home' is not persisted
Ok 2022-03-01T21:44:44.3985103 Running oryx create-script -appPath /home/site/wwwroot -output /opt/startup/startup.sh -defaultAppFilePath /defaulthome/hostingstart/hostingstart.dll -bindPort 8080 -userStartupCommand 'dotnet TRMApi.dll'
Ok 2022-03-01T21:44:44.4498212 Cound not find build manifest file at '/home/site/wwwroot/oryx-manifest.toml'
Ok 2022-03-01T21:44:44.4499139 Could not find operation ID in manifest. Generating an operation id...
Ok 2022-03-01T21:44:44.4500119 Build Operation ID: 74cf02f2-a6c2-44a8-9077-95f1bab9d974
Ok 2022-03-01T21:44:45.5344493
Ok 2022-03-01T21:44:45.5358264 Agent extension
Ok 2022-03-01T21:44:45.5358438 Before if loop >> DotNet Runtime
Ok 2022-03-01T21:44:46.2152908 DotNet Runtime 3.1Writing output script to '/opt/startup/startup.sh'
Ok 2022-03-01T21:44:46.6953451 Running user provided startup command...
Ok 2022-03-01T21:44:46.7448258 It was not possible to find any installed .NET Core SDKs
Ok 2022-03-01T21:44:46.7453653 Did you mean to run .NET Core SDK commands? Install a .NET Core SDK from:
Ok 2022-03-01T21:44:46.7457829 https://aka.ms/dotnet-download
build 管道似乎按预期工作。它产生四个工件:一个用于 Web api 的文件夹,带有一个用于部署的 zip,一个用于数据库内容的文件夹,特别是一个 dacpac,以及一个用于前端的文件夹,其中也有一个 zip 文件。发布管道并没有发布所有这些。我把包设置为$(System.DefaultWorkingDirectory)/_Standard Continuous Integration Build/ApiDrop/TRMApi.zip
.
发布管道具有以下设置:
- Azure 订阅:选择免费试用并对其进行身份验证
- 应用类型:Linux
上的 Web 应用
- 应用服务名称:从下拉列表中选择了api的名称
- 启动命令:空白
代理工作
- 代理:Azure Pipelines
- 代理商规格:windows-2019
- 工件下载:持续集成 build > 选择所有工件
部署 Azure 应用服务步骤
- 任务版本:4.*
- 连接类型:Azure 资源管理器
- Azure 订阅:只读,由较早的应用服务选择预填充
- 应用服务类型:也是只读的,预填充的
- 应用服务名称:也是只读的,已预填
- 包或文件夹:$(System.DefaultWorkingDirectory)/_Standard 持续集成 Build/ApiDrop/TRMApi.zip
- 运行时堆栈:3.1 (DOTNETCORE|3.1)
有什么提示或建议吗?我真的很挠头。我在 pluralsight 和 youtube 上观看视频,似乎这个过程对内容创作者“有效”,但我无法重复结果。
编辑:包括如何在发布管道中配置工件的屏幕截图。
构建管道和发布管道不使用相同的系统默认工作目录。所以我认为您的发布管道可能没有在构建管道中获取工件。
有一种简单的方法可以将构建管道中生成的工件传递到发布管道:
- 在您的构建管道中,使用 publish build artifact task or publish pipeline artifact task 发布您的作品。
- 在您的发布管道中,点击“添加工件”。然后 select “构建”作为源类型并填写有关构建的信息。请注意“源别名”的值,您需要将其用作发布管道中的工件名称。
- 转到“Azure 应用服务部署”任务。在“包或文件夹”中,单击浏览按钮,您可以在那里找到您的工件路径。
FWIW,我在完全相同的代码库中遇到了完全相同的问题。
我还正确设置了构建管道工件。
我最初被消息“无法找到任何已安装的 .NET Core SDK”所困扰。
我转到应用服务“高级工具”,然后使用 Bash 并发出命令:
dotnet --list-sdks
dotnet --list-runtimes
最初,它没有报告任何 SDK。
这导致我在管道的开头添加了一个额外的 Use.NET 核心管道任务,参数如下
显示名称:
- 使用.NET Code sdk 3.1.415
要安装的包:
- SDK(包含运行时)
版本:
- 3.1.415
兼容的Visual Studio版本:
- 16.7.21
安装 .Net 核心的路径:
- $(Agent.ToolsDirectory)/网络
我选择了上面的版本,它们似乎与 linux 盒子上报告的可用版本相匹配。
但是,none 这似乎有什么不同,因为它仍然失败并出现与您相同的错误。我确实想分享到目前为止我尝试过的方法,但还不足以解决问题。
一时兴起,我启动了一个 Windows-based 应用程序服务器(免费层)以进行部署。我修改了发布管道并添加了第二个“部署到应用服务”步骤。第二个部署到 Windows 应用服务。
执行此操作后,应用程序在第二个部署步骤后在 Windows 应用服务上成功运行,但在第一个部署步骤后在 Linux 应用服务上运行失败。
事实证明问题是由于构建管道问题引起的。
它正在使用 Visual Studio 构建(即 MsBuild)项目步骤构建 API 项目。
为了定位 linux,需要将其替换为
使用参数“-r linux-x64”加上适当的输出文件夹的 dotnet 发布(或 dotnet 构建后跟发布)。
我有一个用 dotnet core 3.1 编写的完全可用的网络 api。我一直在关注 TimCoRetailManager series。 当 运行 in Visual Studio 时,应用程序 bui 没有错误并且按预期工作。我有免费的 Azure 订阅。我在 linux 和两个基本 SQL 服务器数据库上设置了一个 F1 免费 Web 应用程序服务,它们都在同一个资源组中,防火墙设置为允许访问其他 azure 服务进行连接。我可以发布网络 api 和数据库。我可以使用 azure data studio 连接到数据库,一切看起来都很好。我更新了应用程序服务的配置,因此它使用 azure secrets 而不是我的开发环境机密。 API 从 Visual Studio 发布时按预期工作,我可以大摇大摆 ui,生活很美好。
开始使用 Azure DevOps。当我使用来自 Azure DevOps 的发布管道时,该管道会给出一条成功消息。但是,当我导航到 API(有一个简单的 MVC 登录页面 + swagger)时,它只有一个“应用程序错误 :(”页面。我在 Azure App 服务上找到了日志,他们有这个......
Ok 2022-03-01T21:44:43.8098649 \/ \/ \/
Ok 2022-03-01T21:44:43.8098677 A P P S E R V I C E O N L I N U X
Ok 2022-03-01T21:44:43.8098704
Ok 2022-03-01T21:44:43.809873 Documentation: http://aka.ms/webapp-linux
Ok 2022-03-01T21:44:43.8098757 Dotnet quickstart: https://aka.ms/dotnet-qs
Ok 2022-03-01T21:44:43.8098784 ASP .NETCore Version: 3.1.21
Ok 2022-03-01T21:44:43.809881 Note: Any data outside '/home' is not persisted
Ok 2022-03-01T21:44:44.3985103 Running oryx create-script -appPath /home/site/wwwroot -output /opt/startup/startup.sh -defaultAppFilePath /defaulthome/hostingstart/hostingstart.dll -bindPort 8080 -userStartupCommand 'dotnet TRMApi.dll'
Ok 2022-03-01T21:44:44.4498212 Cound not find build manifest file at '/home/site/wwwroot/oryx-manifest.toml'
Ok 2022-03-01T21:44:44.4499139 Could not find operation ID in manifest. Generating an operation id...
Ok 2022-03-01T21:44:44.4500119 Build Operation ID: 74cf02f2-a6c2-44a8-9077-95f1bab9d974
Ok 2022-03-01T21:44:45.5344493
Ok 2022-03-01T21:44:45.5358264 Agent extension
Ok 2022-03-01T21:44:45.5358438 Before if loop >> DotNet Runtime
Ok 2022-03-01T21:44:46.2152908 DotNet Runtime 3.1Writing output script to '/opt/startup/startup.sh'
Ok 2022-03-01T21:44:46.6953451 Running user provided startup command...
Ok 2022-03-01T21:44:46.7448258 It was not possible to find any installed .NET Core SDKs
Ok 2022-03-01T21:44:46.7453653 Did you mean to run .NET Core SDK commands? Install a .NET Core SDK from:
Ok 2022-03-01T21:44:46.7457829 https://aka.ms/dotnet-download
build 管道似乎按预期工作。它产生四个工件:一个用于 Web api 的文件夹,带有一个用于部署的 zip,一个用于数据库内容的文件夹,特别是一个 dacpac,以及一个用于前端的文件夹,其中也有一个 zip 文件。发布管道并没有发布所有这些。我把包设置为$(System.DefaultWorkingDirectory)/_Standard Continuous Integration Build/ApiDrop/TRMApi.zip
.
发布管道具有以下设置:
- Azure 订阅:选择免费试用并对其进行身份验证
- 应用类型:Linux 上的 Web 应用
- 应用服务名称:从下拉列表中选择了api的名称
- 启动命令:空白
代理工作
- 代理:Azure Pipelines
- 代理商规格:windows-2019
- 工件下载:持续集成 build > 选择所有工件
部署 Azure 应用服务步骤
- 任务版本:4.*
- 连接类型:Azure 资源管理器
- Azure 订阅:只读,由较早的应用服务选择预填充
- 应用服务类型:也是只读的,预填充的
- 应用服务名称:也是只读的,已预填
- 包或文件夹:$(System.DefaultWorkingDirectory)/_Standard 持续集成 Build/ApiDrop/TRMApi.zip
- 运行时堆栈:3.1 (DOTNETCORE|3.1)
有什么提示或建议吗?我真的很挠头。我在 pluralsight 和 youtube 上观看视频,似乎这个过程对内容创作者“有效”,但我无法重复结果。
编辑:包括如何在发布管道中配置工件的屏幕截图。
构建管道和发布管道不使用相同的系统默认工作目录。所以我认为您的发布管道可能没有在构建管道中获取工件。
有一种简单的方法可以将构建管道中生成的工件传递到发布管道:
- 在您的构建管道中,使用 publish build artifact task or publish pipeline artifact task 发布您的作品。
- 在您的发布管道中,点击“添加工件”。然后 select “构建”作为源类型并填写有关构建的信息。请注意“源别名”的值,您需要将其用作发布管道中的工件名称。
- 转到“Azure 应用服务部署”任务。在“包或文件夹”中,单击浏览按钮,您可以在那里找到您的工件路径。
FWIW,我在完全相同的代码库中遇到了完全相同的问题。 我还正确设置了构建管道工件。
我最初被消息“无法找到任何已安装的 .NET Core SDK”所困扰。 我转到应用服务“高级工具”,然后使用 Bash 并发出命令:
dotnet --list-sdks
dotnet --list-runtimes
最初,它没有报告任何 SDK。 这导致我在管道的开头添加了一个额外的 Use.NET 核心管道任务,参数如下
显示名称:
- 使用.NET Code sdk 3.1.415
要安装的包:
- SDK(包含运行时)
版本:
- 3.1.415
兼容的Visual Studio版本:
- 16.7.21
安装 .Net 核心的路径:
- $(Agent.ToolsDirectory)/网络
我选择了上面的版本,它们似乎与 linux 盒子上报告的可用版本相匹配。
但是,none 这似乎有什么不同,因为它仍然失败并出现与您相同的错误。我确实想分享到目前为止我尝试过的方法,但还不足以解决问题。
一时兴起,我启动了一个 Windows-based 应用程序服务器(免费层)以进行部署。我修改了发布管道并添加了第二个“部署到应用服务”步骤。第二个部署到 Windows 应用服务。
执行此操作后,应用程序在第二个部署步骤后在 Windows 应用服务上成功运行,但在第一个部署步骤后在 Linux 应用服务上运行失败。
事实证明问题是由于构建管道问题引起的。 它正在使用 Visual Studio 构建(即 MsBuild)项目步骤构建 API 项目。 为了定位 linux,需要将其替换为 使用参数“-r linux-x64”加上适当的输出文件夹的 dotnet 发布(或 dotnet 构建后跟发布)。