'ASP.NET Core 3.1 web app publishes from Visual Studio does not work when deployed from Azure DevOps release pipeline

I have a fully working web api written in dotnet core 3.1. I've been following the TimCoRetailManager series. The application builds with no errors and works as intended when running in Visual Studio. I have a free azure subscription. I setup a F1 free web app service on linux and two basic SQL server databases, all in the same resource group with the firewall set to allow access to other azure services to connect. I can publish the web api and the databases. I can connect to the databases with azure data studio and things look fine. I updated the config on the app service so it's using the azure secrets instead of my dev environment secrets. The API works as intended when published from Visual Studio, i can get to the swagger ui, and life is good.

On to Azure DevOps. When I use a release pipeline from Azure DevOps, the pipeline gives a success message. However, when I navigate to the API (has a simple MVC landing page + swagger) it just has an "Application Error :(" page. I found the logs on the Azure App service and they have this...

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

The build pipeline appears to be working as intended. It produces four artifacts: a folder for the web api with a zip for deployment, a folder for the database stuff notably with a dacpac, and a folder for the front end with a zip file in there, too. The release pipeline isn't publishing all of this though. I set the package to $(System.DefaultWorkingDirectory)/_Standard Continuous Integration Build/ApiDrop/TRMApi.zip.

The release pipeline has the following settings:

  • Azure subscription: selected free trial and authenticated it
  • App Type: Web App on Linux
  • App Service name: selected api's name from drop down
  • Startup command: blank

Agent Job

  • Agent: Azure Pipelines
  • Agent Specification: windows-2019
  • Artifact download: continuous integration build > selected all artifacts

Deploy Azure App Service step

  • Task version: 4.*
  • Connection type: Azure Resource Manager
  • Azure subcription: read only, prefilled by app service selection earlier
  • App service type: also read only, prefilled
  • App service name: also read only, prefilled
  • Package or folder: $(System.DefaultWorkingDirectory)/_Standard Continuous Integration Build/ApiDrop/TRMApi.zip
  • Runtime Stack: 3.1 (DOTNETCORE|3.1)

Any tips or suggestions? I'm really scratching my head on this. I'm watching videos on pluralsight and youtube and it seems like the process "just works" for the content creators, but I'm not able to repeat the results.

Edit: Including screenshot of how artifact is configured in release pipeline.

enter image description here



Solution 1:[1]

FWIW, I have the exact same problem from the exact same code base. I also have the build pipeline artifact set up correctly.

I initially got caught up on the message "It was not possible to find any installed .NET Core SDKs". I went to the app service "Advanced tools" and then used Bash and issued the commands:

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

Initially, it wasnt reporting any sdk's. This led to me adding an additional Use.NET Core pipeline task at the beginning of the pipeline with the following parameters

Display Name:

  • Use .NET Code sdk 3.1.415

Package to install:

  • SDK (contains runtime)

Version:

  • 3.1.415

Compatible Visual Studio version:

  • 16.7.21

Path to Install .Net core:

  • $(Agent.ToolsDirectory)/dotnet

I chose the above versions which seemed to match what was reported being available on the linux box.

However, none of this seemed to make any difference, as it still fails with the same error as you. I did want to share what I have tried so far, but wasnt enough to solve it.

On a whim, I spun up a Windows-based App server (Free tier) to deploy to as well. I modified my Release pipeline and added a second "Deploy to App Service" step. This second one deploys to the Windows App Service.

Once I did this, the app runs successfully on the Windows App Service after the second deployment step, but not on the Linux app service after the first deployment step.

It turns out the issue was due to a Build pipeline issue. It was building the API project using a Visual Studio Build (i.e. MsBuild) project step. In order to target linux, this needs to be replaced with a dotnet publish (or a dotnet build followed by a publish) with the parameters "-r linux-x64" plus the appropriate output folder.

Solution 2:[2]

Build pipelines and release pipelines do not use the same system default working directory. So I think your release pipeline is probably not getting the artifacts in the build pipeline.

There is an easy way to pass artifacts generated in build pipelines to release pipelines:

  1. In your build pipeline, Use publish build artifact task or publish pipeline artifact task to publish your artfact.
  2. In your release pipeline, click "Add an artifact". Then select "Build" as source type and fill in the information about your build. Note the value of "Source alias", which you need to use as the name for artifacts in release pipeline.

enter image description here

  1. Go to the "Azure App Service Deploy" task. In "Package or folder", click browse button, and you can find your artifacts path there.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1
Solution 2 Oscar