MSBuild has a lot of command line options that are relevant when building in a Jenkins pipeline.
A useful command argument to set is /nodeReuse:false
. This ensures that MSBuild.exe
exits after being called. The default is true
and is meant to reduce the startup time for subsequent builds. In a Jenkins pipeline, this isn't really useful since all processes are killed off at the end of a build. In fact, the default true
option can be problematic in cases where you have later stages in your pipeline that might do a cleanup or a git clean -fdx
but can't because a MSBuild.exe
process is holding a file open (like a DLL from a Nuget package).
At work we use declarative pipelines for everything and based on our experience building Visual Studio projects, a simple pipeline would look something like this:
#!/usr/bin/env groovy
pipeline {
environment {
MSBUILD = "C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\MSBuild\15.0\Bin"
CONFIG = 'Release'
PLATFORM = 'x64'
}
stages {
stage('Build') {
steps {
bat "NuGet.exe restore your_project.sln"
bat "\"${MSBUILD}\" your_project.sln /p:Configuration=${env.CONFIG};Platform=${env.PLATFORM} /maxcpucount:%NUMBER_OF_PROCESSORS% /nodeReuse:false"
}
}
}
}
It's pretty bare bones, and doesn't include tests, but you get the idea.