CI for .NET 5 with BitBucket Pipelines

CI for .NET 5 with BitBucket Pipelines

DevOps is one of those things that I don't know enough about. For that reason, I try not to avoid it in the hopes that I will understand it. So today, I decided to setup a BitBucket Pipeline for a .NET 5 application. The documentation online seemed pretty straightforward and my starting bitbucket-pipelines.yml file contained the following:

image: mcr.microsoft.com/dotnet/sdk:5.0

pipelines:
  default:
    - step:
        name: Build and Test
        script:
          - dotnet restore
          - dotnet build --no-restore
          - dotnet test --no-build --logger:trx

Unfortunately, every time the tests ran, the following error would appear.

System.IO.FileNotFoundException: Could not find 'mono' host. Make sure that 'mono' is installed on the machine and is available in PATH environment variable.
   at Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.Helpers.DotnetHostHelper.GetMonoPath()
   at Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.Hosting.DefaultTestHostManager.GetTestHostProcessStartInfo(IEnumerable`1 sources, IDictionary`2 environmentVariables, TestRunnerConnectionInfo connectionInfo)
   at Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.Client.ProxyOperationManager.SetupChannel(IEnumerable`1 sources, String runSettings)
   at Microsoft.VisualStudio.TestPlatform.CrossPlatEngine.Client.ProxyExecutionManager.StartTestRun(TestRunCriteria testRunCriteria, ITestRunEventsHandler eventHandler)

After some research, it turns out that the docker container is running on a Linux host and the dotnet sdk doesn't contain the mono-complete dependency. Switching the dotnet sdk to an explicit Linux based container allowed for the installation of mono-complete. The final working BitBucket Pipeline is as follows:

image: mcr.microsoft.com/dotnet/sdk:5.0-focal

pipelines:
  default:
    - step:
        name: Build and Test
        script:
          - apt update
          - apt install -y mono-complete
          - dotnet restore
          - dotnet build --no-restore
          - dotnet test --no-build --logger:trx

I'm pretty clueless when it comes to DevOps, so if there's a better way to do this, please let me know in the comments! Thanks!

References