c# - 从 Azure DevOps 发布管道部署时,从 Visual Studio 发布的 ASP.NET Core 3.1 Web 应用程序不起作用

标签 c# azure asp.net-core azure-devops azure-pipelines-release-pipeline

我有一个用 dotnet core 3.1 编写的完全可用的 Web api。我一直在关注TimCoRetailManager series 。 该应用程序构建时没有错误,并且在 Visual Studio 中运行时按预期工作。我有免费的 Azure 订阅。我在 Linux 上设置了一个 F1 免费 Web 应用程序服务和两个基本 SQL Server 数据库,所有这些都位于同一资源组中,并且防火墙设置为允许访问其他 Azure 服务进行连接。我可以发布 Web api 和数据库。我可以使用 azure data studio 连接到数据库,一切看起来都很好。我更新了应用程序服务上的配置,因此它使用 azure secret 而不是我的开发环境 secret 。当从 Visual Studio 发布时,API 按预期工作,我可以访问 swagger ui,一切都很好。

转向 Azure DevOps。当我使用 Azure DevOps 的发布管道时,该管道会显示成功消息。但是,当我导航到 API(有一个简单的 MVC 登录页面 + swagger)时,它只有一个“应用程序错误:(”页面。我在 Azure 应用程序服务上找到了日志,它们有这个...

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

构建管道似乎正在按预期工作。它生成四个工件:一个用于 Web api 的文件夹,其中包含用于部署的 zip;一个用于数据库内容的文件夹(特别是带有 dacpac);以及一个用于前端的文件夹,其中也包含一个 zip 文件。不过,发布管道并未发布所有这些内容。我将包设置为 $(System.DefaultWorkingDirectory)/_Standard Continuous Integration Build/ApiDrop/TRMApi.zip

发布管 Prop 有以下设置:

  • Azure 订阅:选择免费试用并进行身份验证
  • 应用类型:Linux 上的 Web 应用
  • 应用服务名称:从下拉列表中选择的 API 名称
  • 启动命令:空白

代理工作

  • 代理:Azure Pipelines
  • 代理规范:windows-2019
  • 工件下载:持续集成构建 > 选择所有工件

部署 Azure 应用服务步骤

  • 任务版本:4.*
  • 连接类型:Azure 资源管理器
  • Azure 订阅:只读,由之前选择的应用服务预先填充
  • 应用服务类型:也是只读、预填充
  • 应用服务名称:也是只读的,已预填充
  • 程序包或文件夹:$(System.DefaultWorkingDirectory)/_Standard Continuous Integration Build/ApiDrop/TRMApi.zip
  • 运行时堆栈:3.1 (DOTNETCORE|3.1)

有什么提示或建议吗?我对此实在是摸不着头脑。我正在pluralsight 和 youtube 上观看视频,似乎这个过程对内容创建者来说“正好有效”,但我无法重复结果。

编辑:包括如何在发布管道中配置工件的屏幕截图。

enter image description here

最佳答案

FWIW,我在完全相同的代码库中遇到了完全相同的问题。 我还正确设置了构建管道工件。

我最初遇到了“无法找到任何已安装的 .NET Core SDK”消息。 我转到应用程序服务“高级工具”,然后使用 Bash 并发出命令:

dotnet --list-sdks
dotnet --list-runtimes

最初,它没有报告任何 SDK。 这导致我在管道的开头添加了一个额外的 Use.NET Core 管道任务,并使用以下参数

显示名称:

  • 使用.NET代码sdk 3.1.415

要安装的包:

  • SDK(包含运行时)

版本:

  • 3.1.415

兼容的 Visual Studio 版本:

  • 21.7.16

.Net core安装路径:

  • $(Agent.ToolsDirectory)/dotnet

我选择的上述版本似乎与 Linux 机器上可用的版本相匹配。

但是,这似乎没有任何区别,因为它仍然失败并出现与您相同的错误。我确实想分享到目前为止我所尝试过的方法,但还不足以解决问题。

一时兴起,我启动了一个基于 Windows 的应用服务器(免费层)来部署。我修改了发布管道并添加了第二个“部署到应用程序服务”步骤。第二个部署到 Windows 应用服务。

完成此操作后,应用程序在第二个部署步骤后在 Windows 应用服务上成功运行,但在第一个部署步骤后无法在 Linux 应用服务上运行。

事实证明,该问题是由于构建管道问题造成的。 它使用 Visual Studio Build(即 MsBuild)项目步骤构建 API 项目。 为了针对 Linux,需要将其替换为 使用参数“-r linux-x64”加上适当的输出文件夹进行 dotnet 发布(或 dotnet 构建后发布)。

关于c# - 从 Azure DevOps 发布管道部署时,从 Visual Studio 发布的 ASP.NET Core 3.1 Web 应用程序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71315662/

相关文章:

c# - 通过 .NET Azure SDK 扩展云服务实例计数?

c# - 如何返回 OkObjectResult 和 BadObjectResult - C# Azure Function

c# - 如何使用 ASP.NET Core/Razor 通过单击按钮运行在 Razor 页面上编写的 C#?

c# - 使用 asp.net core 2.2 恢复 nuget 包时出现问题

c# - 通过 SWIG 为 C# 编译 Quantlib

c# - C# 和 Java 之间的主要区别是什么?

c# - 如何确保 winform 被垃圾收集?

c# - 帮助处理finally block 中的异常

azure - 如何使用ARM模板部署Azure Function时添加project.json和run.csx

entity-framework - 循环/反射(reflect)所有 EF 模型中的所有属性以设置列类型