Publishing ASP.NET to Azure app service on Debian CICD runner - c#

I'm trying to migrate an old azure deployment that was previously run on windows and relied on using msdeploy into our CICD pipeline that is using a debian dotnet sdk. Is there a easy way to do this with a publish profile? I can no longer use the old MSDeploy profile, and it appears that using an FTP profile is not supported through the cli, it will only generate a local release folder.
My goal is to be able to call the follwing without additional steps
dotnet publish WebService/WebService.csproj -c Release /p:PublishProfile="sandbox"
I tried converting to an FTP profile using the ftps credentials in azure, however it only publishes into a local folder on the runner when using this profile.

Related

What is the difference between dotnet build and dotnet publish commands?

I am a little confused regarding dotnet build vs dotnet publish topic.
When I say difference, I mean what is the physical difference among them.
I see that dotnet build generates the same files as dotnet publish unless it is self-contained.
dotnet build will generate dll files in folder bin in your local project folder
dotnet publish will build, generate dll files and deploy in where you want.
For example, you can deploy to a hosting provider, to a file folder on your network (you can manually copy from there to a folder used by IIS), to IIS on your development computer as a testing environment, to a server on your company's internal network.
Read more "How to: Deploy a Web Project Using One-Click Publish in Visual Studio": https://learn.microsoft.com/en-us/previous-versions/aspnet/dd465337(v=vs.110)?redirectedfrom=MSDN

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.
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.
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:
In your build pipeline, Use publish build artifact task or publish pipeline artifact task to publish your artfact.
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.
Go to the "Azure App Service Deploy" task. In "Package or folder", click browse button, and you can find your artifacts path there.

Publish .Net Core 5 Web Api and deploy on Centos 7

I'm having a problem publishing and deploying my backend on centos.
First related to publishing the backend. Below attached a picture of the project of my web API.
I am not sure if this is the correct wayI've published them by using this code below:
dotnet publish -c debug -r linux-x64 --self-contained
on each one of the folders except the Test. So I have 3 published projects.
I then transfer it to my centos 7 servers using scp.
Then I open the published OamrBackend.Web server and give permission to the app using chmod 777 ./OamrBackend.Web and then run it.
This is what it shows:
(I am not sure if this is the correct way)
When trying to access this API from my PC it shows a page error This site can’t be reached ERR_CONNECTION_REFUSED.
What was the error here? Is it the way I try to publish is incorrect or they deploy was incorrect?

Failed to publish to Google Cloud Service with asp.net

I was flowing this guide Quickstart, so i instaled all the things i was supposed to and created ASP.NET on Google Cloud Platform created project.
Then i created VM:
VM
And when i'm trying to publish i have that:
Publishing GcpProject1 to Compute Engine.
msbuild.exe "C:\Users\peter\source\repos\GcpProject1\GcpProject1\GcpProject1.csproj" /p:Configuration=Release /p:Platform=AnyCPU /t:WebPublish /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:publishUrl="C:\Users\peter\AppData\Local\Temp\fflssbvg.hc0"
Failed to publish project GcpProject1.
I turned off firewall and i have same versions of .net framework on server and locally.
Help me please to find the solution.
I just face the same problem, the error message from asp.net is short and hard to figure out.
dotnet publish -o "C:\Users\Puzzle\AppData\Local\Temp\v1opor1f.mdb" -c Release
Failed to deploy project HelloWorld to App Engine Flex.
I check other solutions , and find this works for me : https://cloudplatform.googleblog.com/2017/10/4-ways-you-can-deploy-an-ASP.NET-Core-app-to-GCP.html
just use powershell to send command and that works. hope it helps

VSTS deploy to non-Azure cloud platform

I've currently got an ASP.NET Core web application with EF that I am deploying to GearHost (a non-Azure cloud platform that was recommended by a user here) using a web deploy publish profile directly from Visual Studio. I'm looking to get CI/CD set up via VSTS so that the publish ability isn't restricted to one machine.
So far I've got the build stage set up, as the .NET Core template is all that's really needed. It's the deploy part that has got me stuck - all the templates (and indeed articles) that I can find relating specifically to .NET Core are focused on Azure or an IIS deployment, neither of which are really applicable here, and indeed Azure uses deploy tasks that are created specifically for it.
If it's relevant, GearHost provides FTP credentials which could potentially be used for a manual copy. Alternatively, is there any way I could use the VS2017 publish profile to create a release definition including appsettings.json transforms and EF migrations?
There are many ways to deploy app to GearHost server, such as FTP, Publish Profile.
So, you can upload the published files (e.g. Create a publish profile with file system publish method) to GearHost server by using FTP Upload task.
You also could download the publish profile with Web Deploy method and import to VS, then deploy app by using this publish profile. (MSBuild Arguments: /p:DeployOnBuild=true /p:PublishProfile=[publish profile file name])
Regarding appsettings.json transforms, you don’t need to transform appsettings.json file, the .net core project can retrieve the values from appsettings.[environment].json file per to the value of ASPNETCORE_ENVIRONMENT system environment variable. Working with multiple environments
Regarding EF migrations, you can configure it in publish profile and publish/deploy app with that publish profile.
Update:
Steps to call GearHost cloudsite:
Log in GearHost
Click API tab >Create a new API Key
Using Invoke-RestMethod
Simple code:
$url="https://api.gearhost.com/v1/cloudsites/[could site id]/stop"
$APIID="[step 2]"
$result=Invoke-RestMethod -Method POST -Uri $url -Headers #{Authorization=("bearer {0}" -f $APIID)} -ContentType "application/json"

Categories

Resources