dotnet cicd in gitlab


The .NET core is a powerful framework for developing an array of applications, and when paired with CI/CD practices, it can bolster productivity, code quality, and speed of delivery.

GitLab, in particular, accommodates .NET CI/CD excellently, given its extensive suite of developer tools and state-of-the-art automation capabilities.

This is because of GitLab’s version control, automated testing, and continuous deployment facilities to craft resilient .NET applications.

This post delves deeper into .NET CI/CD with GitLab, exploring how developers can leverage its benefits, navigate potential challenges, and optimize .NET application development.

Let’s Jump In.

Understanding GitLab CI/CD and .NET

Before jumping into .NET and .Net projects, let’s double check we understand what GitLab is.

GitLab is a popular platform that hosts repositories and provides CI/CD pipelines to automate the process of building, testing, and deploying applications.

With the emergence of .NET Core (now just .NET in version 6), developers can use GitLab CI/CD tools to streamline their development workflow.

We must understand how to configure GitLab CI/CD for a .NET project.

To do this, we create a .gitlab-ci.yml file in the root of our repository. This file contains instructions and configurations for our GitLab pipeline.

This file defines stages, such as build, test, and deploy, and describes what should happen in each stage.

For example, in the build stage, we might use the dotnet build command to compile our .NET project.

Similarly, in the test stage, we might use dotnet test to run unit tests.

By configuring our pipeline correctly, we can automatically build, test, and deploy our .NET application whenever we push code to our GitLab repository.

One essential step for .NET projects is to use the dotnet publish command to generate release-ready DLLs and executables.

Including this command in our pipeline configuration ensures the compiled code is ready for deployment to various environments, such as staging or production.

To further improve our pipeline, we can adapt our CI/CD rules to match our desired workflow.

For instance, we can define conditions that must be met before deployment is triggered, like passing tests or code review approval.

the answer

Integrating .NET, Git, and The GitLab Repository (The Process)

By utilizing .NET with GitLab for continuous integration and deployment, we can automate our build, test, and deploy processes right in our own Git repository.

To start, we should create a GitLab CI configuration file (.gitlab-ci.yml) in the root folder of our repository.

This file will define the CI/CD pipeline and tell GitLab Runner which tasks will be executed.

To work with .NET, we should first set up a GitLab Runner to execute our CI/CD tasks.

This can be done by installing a GitLab Runner on a machine with the necessary .NET framework or runtime.

Once the Runner is installed and configured, it will be associated with our Git repository automatically.

With our Runner in place, it’s time to define our CI pipeline in the .gitlab-ci.yml file.

For a .NET project, we typically need to include build, test, and deploy stages.

The build stage compiles our code and creates the necessary build artifacts. We can define a simple build job in our configuration file as follows:

Note: This config assumes you have tagged your runner as “dotnet.”

  stage: build
    - dotnet build
    - dotnet

The test stage will execute automated tests to ensure our code works as expected.

We can add a test job to our configuration file similar to the following:

  stage: test
    - dotnet test
    - dotnet

Finally, the deployment stage will deploy our application to the desired environment to either a staging or production server. 

This step may vary depending on the target platform and our deployment strategy.

For more information on deploying .NET applications using GitLab, you might find this article about debugging CI/CD in GitLab helpful.

With these changes, our .NET CI/CD pipeline is ready.


Whenever we push changes to our repository, GitLab Runner will automatically execute our pipeline to build, test, and deploy our application.

This way, we ensure that our code stays reliable, robust, and up-to-date throughout development.

Working with Docker and Kubernetes

When working with .NET CI/CD in GitLab, we can leverage the power of Docker and Kubernetes to streamline and supercharge our pipeline. 

First, we must create a Docker image or multiple images for our application. 

For this demo, we’re just going to build one image. Most production-level software will be multiple images. To build out more containers, you must utilize a docker-compose file with multiple dockerfiles. Read more about that here.

To accomplish this, we will write a Dockerfile that specifies the base image, dependencies, and build steps.

Once our Dockerfile is ready, we can execute docker build command to create the image.

We’ll utilize this Docker image in our GitLab CI/CD pipeline to test, build, and deploy our application.

Here is an example of how we can use the previously created image in our .gitlab-ci.yml file:

Note, that this assumes you’ve pushed your image to your relevant registry.

Since GitLab comes with a container registry, (within your repo!), we recommend pushing and storing it there.

  stage: build
  image: your-docker-image
    - docker pull your-docker-image
    - docker run your-docker-image
      - /build-output

In this example, we pull our Docker image from our container registry and run it as part of the build stage.

Once the stage is completed successfully, any build artifacts will be collected as specified in the artifacts section.

Kubernetes Role 

Kubernetes plays a crucial role in managing the deployment of our application.

We can use GitLab CI/CD to interact with our Kubernetes cluster and deploy the application safely.

To do this, we need to ensure that we’ve installed an agent in our cluster.

With the agent installed, we can access a Kubernetes context and run Kubernetes API commands in our pipeline.

We can then use kubectl to manage the deployment, ensuring the application reaches the desired state.

An example of using kubectl to deploy our application might look like this:

  stage: deploy
  image: your-docker-image (Could also use a Linux distro here, and deploy multiple images)
    - kubectl apply -f kubernetes-deployment.yaml
    - kubectl rollout status deployment/your-app
    name: production

In this example, the deployment is managed by a Kubernetes manifest file kubernetes-deployment.yaml.

The kubectl apply command deploys the application while kubectl rollout status monitoring the progress of the deployment.

Building and Testing with .NET

GitLab CI/CD is a powerful tool for automating the testing, building, and deployment of code changes.

In this section, we’ll describe how to set up and utilize GitLab CI/CD to ensure our .NET applications are built and tested efficiently.

First, as we’ve already explained above, we’ll need to create a .gitlab-ci.yml configuration file in our repository’s root directory.

Inside this file, we’ll define the stages and jobs involved, such as building and testing our .NET projects.

We’ll need to specify the .NET commands necessary to run those processes.

For the building stage, we’ll use the dotnet build command, which will build our entire solution.

In our .gitlab-ci.yml file, we’ll define the build job like this:

  stage: build
    - dotnet restore
    - dotnet build

Notice that we also included the dotnet restore command. This step is essential because it restores the dependencies needed for the project to build correctly.

Now, let’s move on to testing.

We should have one or more test projects in our solution to validate the application’s functionality. We can use the dotnet test command to run the tests in those projects.

Add the test job to the .gitlab-ci.yml file, like this:

  stage: test
    - dotnet test

With our build and test jobs defined, GitLab CI/CD will automatically run these jobs whenever we push changes to the repository.

This way, we can quickly identify any issues arising from our code changes, ensuring that our .NET applications remain stable and high-quality.

Publishing and Deploying with .NET

In setting up CI/CD with GitLab for a .NET project, publishing and deploying your application is crucial.

We can automate this process using the dotnet publish command in our GitLab CI/CD pipeline.

We begin by adding a new stage for publishing in the .gitlab-ci.yml file. It should include the following script commands:

  - publish

  stage: publish
    - dotnet publish -c release --no-restore
      - path/to/published/directory

In this example, we use the dotnet publish -c release command to publish the application in release mode.

The --no-restore option is used to skip restoring packages to speed up the process.

After the successful execution of the dotnet publish command, we want to store the published files as an artifact in GitLab.

Artifacts are files passed between pipeline stages or stored to be used later (use the link above for a deep dive into artifacts)

To store the published directory as an artifact, add the following to our .gitlab-ci.yml file:

    - path/to/published/directory

Finally, we must also consider our application’s dependencies. Often, .NET projects rely on NuGet packages, so we need to restore them before building and publishing our application.

The dotnet restore command ensures that all NuGet dependencies are installed properly.

Frequently Asked Questions:

In quick succession, we’ll answer some of the questions that readers have chimed in and asked us.

How can I use Docker and GitLab runners for CI/CD of ASP.NET Core applications?

To use Docker and GitLab runners for CI/CD of ASP.NET Core applications, you need to install Docker on your runner and start up a new Docker daemon. Then, download the GitLab Runner binary (gitlab-runner.exe) and register it with your GitLab instance by running the ‘register’ command. Following the registration, you’ll need to update the config.toml file with the runner’s details. Now, you can use the runner to execute your .NET Core CI/CD pipeline. Use the ‘dotnet tool install’ command to install any necessary tools in your Docker environment, or add them into a Dockerfile as dependencies.

How can I integrate my .NET Core CI/CD pipeline with AWS?

Integrating your .NET Core CI/CD pipeline with AWS starts with setting up your pipeline in GitLab. Once setup is complete, you can use the AWS CLI or SDKs to interact with AWS services from your pipeline. You will need to download and configure AWS credentials to use their endpoints. Furthermore, the ‘aws deploy’ command can be useful for deploying AWS infrastructure as part of your pipeline.

I personally like to build the project into docker containers and make those containers available for something like EKS (assuming a Kubernetes build).

How to leverage Azure DevOps for managing .NET Core projects?

With Azure DevOps, you can leverage several features for managing your .NET Core projects. This includes Azure Boards for tracking work, Azure Pipelines for CI/CD, Azure Repos for managing Git repositories, and Azure Test Plans for managing, tracking, and running your tests. Azure DevOps can be integrated with GitLab CI, allowing you to trigger pipeline runs upon code pushes and manage your project from one place.

How can I use Angular applications in my .NET Core projects?

Angular applications can be used with .NET Core API projects, providing a nice frontend for your application. The Angular CLI can help you understand how to build and serve your Angular application alongside your .NET Core API. You can integrate your Angular app within your pipeline in the GitLab CI/CD process to test, build, and deploy your Angular application in parallel with your .NET Core project.

How to improve code quality in .NET Core projects using SonarQube?

SonarQube can be set up as part of your GitLab CI/CD pipeline to help improve the code quality of your .NET Core projects. It is a tool that can analyze your source code for bugs, code issues, and security vulnerabilities. Once you install SonarQube, you can add a new stage in your pipeline to run SonarQube analysis on your code. After the analysis, SonarQube provides detailed reports which you can use to improve your code quality.

How can NuGet be used in .NET pipelines?

NuGet is a package manager for .NET and can be used in your CI/CD pipelines to manage your project’s dependencies. You can use the ‘dotnet restore’ command in your pipeline before the build stage to download any necessary NuGet packages. You can also use Nuget to publish your libraries as packages, which can be consumed by other developers or in different stages of your pipeline.

How do you generate artifacts from .NET Core SDK?

After successfully deploying your application by running ‘dotnet publish -c Release -o {output directory},’ an artifact representing your published application will be generated. This artifact includes everything needed to run your app, and you can use CI tools such as GitLab to store and manage these artifacts. You can define ‘artifacts’ in your gitlab-ci.yml file to specify which files and directories should be included as artifacts.

How do you configure SSH in GitLab CI for .NET Core projects?

Configuring SSH in GitLab CI involves generating a new SSH key pair and adding the public SSH key to your GitLab account. Then, you can use this SSH key in your pipeline to securely connect to other servers. Specifically, in .NET Core projects, SSH can securely deploy your application to a remote server as an advanced deployment strategy.

Stewart Kaplan