A picture of me
Automatic Deployment of .NET Applications to IIS with Github Self-Hosted Runners
Automatic Deployment of .NET Applications to IIS with Github Self-Hosted Runners
January 17, 2023
cover image
How to setup Github Self-Hosted Runners to automatically build, publish and deploy your .NET Applications to an IIS
CD/CDGitHub Runners.NETIIS

At work we've got a single Windows Server that hosts our websites using IIS. It has more than enough power to build our .NET projects alongside hosting and would free up time manually having to build projects and publish them to the IIS, whenever finished features are pushed to our master branch.

What I came up with was to use a GitHub Self-Hosted Actions Runner on the Windows Server, which would build, publish and restart the server automatically, whenever we push changes to the master branch.

Installing the Actions Runner instance

Navigate to your GitHub organization's settings page, then navigate to Actions > Runners.

Then click on New Runner > New self-hosted runner as seen below.


Choose Windows and follow the installations options on the page.

When running the configuration, you will be promptet to setup a Windows Service, choose yes. When asked what user should be running the service set it to NT AUTHORITY\SYSTEM, this can be a huge security risk, only do this if you're aware of the risks. It is however required to be able to start and stop your website when publishing.

Actions configuration

Now that the Actions Runner service is setup and running, we'll have to configure our .NET repository with a GitHub action.

Start by creating a file in your repository at the following directory .github/workflows/my-dotnet-action.yml you can change the name of the file to whatever you'd like.

Now let's edit the action like the following

name: My .NET Action

    branches: [ master ]

    runs-on: self-hosted
        shell: cmd

    - uses: actions/[email protected]
    - name: Restore dependencies
      run: dotnet restore
    - name: Build
      run: dotnet build --no-restore
    - name: Test
      run: dotnet test --no-build --verbosity normal
    - name: Stop example.com
      run: appcmd stop sites "example.com"
    - name: Publish Release
      run: dotnet publish example.com --configuration Release -o C:\Path\To\Website\www\example.com
    - name: Start example.com
      run: appcmd start sites "example.com"

What this configuration does, is that it listens on the master branch, whenever changes are pushed it will start our self-hosted runner and begin the build process using cmd as the preffered shell as I've previously had issues with using Windows Powershell and Powershell 7.

The build steps starts off by running a git checkout followed by a restoring, building and testing the project. Once that's all done it will stop our website (in this case example.com) to ensure that the following publish will work without issues. At the very end we start the website again once again utilising appcmd.

Once you're done, just commit your GitHub action to master and watch it build and deploy your project. Hope it helped!