Jenkins: no tool named MSBuild found
While the provided answer certainly works, you just have to provide the correct complete tool name.
In our Installation, we had three different MSBuild versions available and I could just use the following
${tool 'MSBuild 15.0 [32bit]'}
For anyone having this problem and just trying to figure out what 'Tool' represents in Jenkins and where it is configured, see following screenshots:
Go to Manage Jenkins -> Global Tool Configuration:
Scroll down to MSBuild and click the button to expand the section:
Here you can see what tool name to use to reference MSBuild (or add one):
Then you can reference it for example like this: bat "\"${tool '15.0'}\" solution.sln /p:Configuration=Release /p:Platform=\"x86\"
(example is not declarative syntax, but should show the idea)
You have to define MSBuild in Jenkins => Manage Jenkins => Global Tool Configuration or use a different toolname which is already defined.
${tool 'toolname'} returns the path defined for a tool in Global Tool Configuration.
Warning: Pay attention to the path defined. Does it point to a folder or to msbuild.exe? You might have to append msbuild.exe:
${tool 'VS2017'}\msbuild.exe
A simple snapshot for explaining the concept:
In Declarative Pipeline syntax, the tooling for MSBuild is a little clunkier. Here's how I've had to handle it, using a script
block:
pipeline {
agent {
label 'win-slave-node'
}
stages {
stage('Build') {
steps {
script {
def msbuild = tool name: 'MSBuild', type: 'hudson.plugins.msbuild.MsBuildInstallation'
bat "${msbuild} SimpleWindowsProject.sln"
}
}
}
}
}
In the older Scripted Pipeline syntax, it could be like this:
node('win-slave-node') {
def msbuild = tool name: 'MSBuild', type: 'hudson.plugins.msbuild.MsBuildInstallation'
stage('Checkout') {
checkout scm
}
stage('Build') {
bat "${msbuild} SimpleWindowsProject.sln"
}
}