专栏首页汪宇杰博客解决Azure DevOps部署到Azure后.NET Core网站无法启动的问题

解决Azure DevOps部署到Azure后.NET Core网站无法启动的问题

最近我遭遇了一个奇怪的问题。使用Azure DevOps配置CI/CD管线,自动部署到Azure App Service以后,.NET Core的网站竟然会启动失败。我们来看看如何解决这个问题。

查找问题

首先,幸好,这是个staging环境。爆了以后,我发现网站竟然没有log,连log的目录都找不到,这非常奇怪。于是我决定在Azure启用开发模式,让网站输出详细错误信息。熟悉经典ASP.NET的同学可能知道,只要在web.config里设置个customError就行了。但是.NET Core没有这个东西,怎么办呢?我教大家一个猥琐小技巧:

.NET Core的设置,是优先用环境变量覆盖的。所以我们可以利用这点,在Azure App Service的设置里加这么一个环境变量:

ASPNETCORE_ENVIRONMENT:Development

更改设置的地方在Application settings页面

朋友们可能会问:我怎么知道这个值的?其实这个设置来源于Visual Studio

打开开发模式以后,输出了宇宙大爆炸的详细信息:

发现执行的代码路径竟然不是在App Service应有的网站根目录!于是我的代码找不到依赖项,就爆了。

怎么回事

我尝试了手动从VS部署,也是爆的。在Azure DevOps重新部署,也是爆的。甚至停用CD管线,用kudu直接build git的代码,也是爆的!我陷入了循环懵逼:

最终我删除并重建了一个新的App Service实例,用VS发布,居然就好了。但是我再次用CI/CD管线部署以后,又产生了大爆炸。细心的我,保留了网站运行正常时候的配置信息,与爆炸以后的配置对比发现,是多了这么一个设置:

这是个啥玩意儿

我追溯到一个微软Azure的announcement:https://github.com/Azure/app-service-announcements/issues/84

发现它是针对Azure Function设计的,这是App Service进一步包装以后的服务。与传统部署的差别就是,传统部署会把新文件覆盖到wwwroot目录,也就是我们的网站根目录,而用了RUN_FROM_PACKAGE的话,网站执行的时候会指向一个zip文件,压缩包的内容会映射到wwwroot目录,但会变成只读

使用这个功能有一些好处,比如可预测、更快速的部署、更快速的启动性等等,具体大家可以去看微软公告的介绍。

恢复网站运行

想要临时恢复网站运行,非常简单,只要将WEBSITE_RUN_FROM_PACKAGE这个设置整个删除,重启网站,就可以恢复到部署前的良好版本。但是Azure DevOps将来的部署,将不会起作用。因为真实的wwwroot目录不会被更新了。

恢复至CD部署前版本:6980

那如何自动部署呢

我们需要修改Azure DevOps部署任务的默认值

编辑你的Release定义,在Tasks下找到Deploy Azure App Service子任务。

展开Additional Deployment Options,勾选 Select deployment method,然后手工选择为 Web Deploy,保存设置。

然后重新提交一个Release,等待成功部署。完成之后就可以看到正确的新版本被部署在wwwroot物理路径下了,网站也能正常启动:

本文分享自微信公众号 - 汪宇杰博客(ediwangblog)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-02-15

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • ASP.NET Core Windows服务开发技术实战演练

    跟着阿笨一起玩NET
  • 网站被攻击怎么办? 如何查找攻击源与网站漏洞

    很多企业网站被攻击,导致网站打开跳转到别的网站,尤其一些彩票等非法网站上去,甚至有些网站被攻击的打不开,客户无法访问首页,给客户造成了很大的经济损失,很多客户找...

    技术分享达人
  • 微软发布ML.NET 1.0

    原文地址:https://devblogs.microsoft.com/dotnet/announcing-ml-net-1-0/

    张善友
  • .NET和Docker ,比翼双飞

    DockerCon 2019本周将在旧金山举行 ,DockerCon 是从业者、贡献者、维护者、开发者和容器生态系统学习、网络和创新的一站式活动。 .NET 团...

    张善友
  • win2003 64位系统IIS配置方法

    64位系统IIS配置方法,主要是在 32与64位下运行iis的一些常见问题与方法,推荐服务器配置者参考。1、因用模版安装ASP.NET 2.0需先卸载64位的....

    习惯说一说
  • ML.NET 发布0.11版本:.NET中的机器学习,为TensorFlow和ONNX添加了新功能

    微软发布了其最新版本的机器学习框架:ML.NET 0.11带来了新功能和突破性变化。

    张善友
  • .NET 机器学习生态调查

    机器学习是一种允许计算机使用现有数据预测未来行为、结果和趋势的数据科学方法。 使用机器学习,计算机可以在未显式编程的情况下进行学习。机器学习的预测可以使得应用和...

    张善友
  • ASP.NET Core中GetService()和GetRequiredService()之间的区别

    上篇文章《在.NET Core 3.0中的WPF中使用IOC图文教程》中,我们尝试在WPF中应用.NET Core内置的IOC进行编程,在解析MainWindo...

    依乐祝
  • 开源的类似于Apache ab的压力测试命令行工具SuperBenchmarker

    SuperBenchmarker 是ㄧ个开源的类似于Apache ab的压力测试命令行工具。可以在 .NET 4.52+ 或者 .NET Core 2.0+ 平...

    张善友
  • 机器学习 ML.NET 发布 1.0 RC

    ML.NET 是面向.NET开发人员的开源和跨平台机器学习框架(Windows,Linux,macOS),通过使用ML.NET,.NET开发人员可以利用他们现有...

    张善友

扫码关注云+社区

领取腾讯云代金券