Post

ASP.Net 7 deployment to Azure App Services using GitHub Actions

This is a simple reference post of the GitHub Actions yaml that I’m using to deploy a simple ASP.Net 7.0 to Azure App Services.

I was not planning to post anything today as this task was supposed to be a very simple Deployment Center configuration. But I ended up spending close to two hours troubleshooting due to the ff:

  • The deployment center will generate an older GitHub actions YAML template (old .Net version and old action step versions)
  • The same dotnet <command> that executes locally does not always result in the same behavior in actions. Part of the reason is because the generated YAML defaulted to the v1 of actions/setup-dotnet when the latest is v3.
  • Online references I found at this time assume the source to be in the root directory of the repo. Setting working-directory to a src still resulted in some challenges.

For context, my repo file structure is as follows:

1
2
3
4
5
6
7
8
root
└───.github
│   └───workflows
│       │   ci.yml
└───src
    │   RazType.csproj
    │   RazType.sln
    |   **

So this is the yaml file that eventually worked. I added my learnings as in-line YAML comments. Hope this helps someone other than me :)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
name: Build and deploy ASP.Net Core app to Azure Web App

on:
  push:
    branches: [ main ]
    paths-ignore:
      - '**.md'
  pull_request:
    branches: [ main ]

env:
  DOTNET_VERSION: '7.0.x' # Azure App Services Deployment Center defaults to 3.1. Docs mention 5.x and 6.x, but 7.0.x works for as of today (Jan 2023)
  DOTNET_QUALITY: 'preview'
  WORKING_DIR: src
  BUILD_CONFIG: Debug
  PROJECT_FILE: RazType.csproj # `dotnet publish` requires the does not work when specifying the .sln file
  APPSERVICE_NAME: raztype
  APPSERVICE_SLOT: Production
  PACKAGE_PATH: '/publish' # Specifying '/' at the beginning of the path is required due to differences in action working-directory.

jobs:
  build:
    runs-on: windows-latest
    defaults:
      run:
        # Since the directory is not in root, specify working directory for the dotnet commands to work.
        working-directory: $

    steps:
      - uses: actions/checkout@v3

      - name: Set up .NET 7.0.x
        uses: actions/setup-dotnet@v3
        with:
          dotnet-version: $
          dotnet-quality: $

      - name: Restore Dependencies
        # Split build step to restore and build (with --no-restore)
        run: dotnet restore

      - name: Build the .NET Solution
        run: dotnet build -c $ --no-restore

      - name: Test
        run: dotnet test --no-build --no-restore --verbosity normal

      - name: dotnet publish
        # Azure App Services defaults to '-o $/myapp'
        run: dotnet publish -c $ -o $

      - name: Upload artifact for deployment job
        uses: actions/upload-artifact@v3
        with:
          name: .net-app
          # Azure App Services defaults to $/myapp
          path: $

  deploy:
    runs-on: windows-latest
    defaults:
      run:
        working-directory: $
    needs: build
    environment:
      name: 'Production'
      url: $

    steps:
      - name: Download artifact from build job
        uses: actions/download-artifact@v3
        with:
          name: .net-app

      - name: Deploy to Azure Web App
        id: deploy-to-webapp
        uses: azure/webapps-deploy@v2
        with:
          app-name: $
          slot-name: $
          publish-profile: $
          # Path = "." is the default and is the one that's working. The downloaded artifact does not contain the package folder of $PACKAGE_PATH
          package: .
This post is licensed under CC BY 4.0 by the author.

© Rafferty Uy. Some rights reserved.

Using the Chirpy theme for Jekyll.

The views and opinions on this blog are my own and do not represent those of my employer. Many of the articles here are proof-read and edited with generative AI, following my own system prompts and writing style. Everything published has been reviewed by me.