Jenkins: no tool named MSBuild found
Asked Answered
K

5

10

Setting up a Pipeline build in Jenkins (Jenkins 2.6), copying the sample script for a git-based build gives: "no tool named MSBuild found". I have set MSBuild Tool in Manage Jenkins -> Global Tool Configuration. I am running pipeline on the agent node.

In the agent configuration, I have set MSBuild tool path in Node Properties -> Tool Locations.
While build process it is not able to get MSBuild tool path, if i run same source without pipeline (without using Jenkinsfile) it works fine.


Please see Jenkinsfile Syntax

pipeline {
    agent { label 'win-agent-node' }
    stages {
           stage('build') {
           steps {
    
           bat "\"${tool 'MSBuild'}\" SimpleWindowsProject.sln /t:Rebuild /p:Configuration=Release"
           }
    }
   }
}



I have also tried to change environment variable for windows agent it not refreshed.


NOTE: I have installed MS Build tool for on agent node

Kierstenkieselguhr answered 31/7, 2017 at 14:14 Comment(7)
Have you checked the console on which agent it was running while you are building.Pineal
Can you check this once "node('win-slave-node') { def MSBuild MSBuild= tool 'MSBuild' stage('Build') { bat(/"${MSBuild}" SimpleWindowsProject.sln /t:Rebuild /p:Configuration=Release/) } }"Pineal
Above is the same code with minor changes try once to check whether working/notPineal
Can you check to make sure you called the tool MSBuild? You have it referenced one I'm above as "MBuild", without an S.Clammy
@Chandra Sekhar: Thanks for the code, but it is not working, the issue is not with code, it showing empty string on MSBuild variable. I have set vs2017 env variable by running vcvars64.bat in JenkinsfileKierstenkieselguhr
@Clammy it was a typo in the question, I have updated question. still facing the same problem.Kierstenkieselguhr
Hmm... Have you checked the console output like the first commenter recommended to make sure it is actually building on the node that you think it's building on? Maybe provide some screenshots of your global and node tool config?Clammy
C
15

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-agent-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-agent-node') {
  def msbuild = tool name: 'MSBuild', type: 'hudson.plugins.msbuild.MsBuildInstallation'

  stage('Checkout') {
    checkout scm
  }

  stage('Build') {
    bat "${msbuild} SimpleWindowsProject.sln"
  }
}
Ching answered 9/8, 2017 at 13:56 Comment(6)
Thanks @nick for above solution, finally it is working with msbuild tool, with small modification in command bat "\"${msbuild}\" SimpleWindowsProject.sln" As i was getting error C:\Program' is not recognized as an internal or external command due to space in MSBuild pathKierstenkieselguhr
Yes, we avoided that particular space problem by using the old-style folder name, e.g., the 32-bit MSBuild from Visual Studio 2013 is here: C:\PROGRA~2\MSBuild\12.0\Bin\MSBuild.exe.Ching
Can't you just use the msbuild definition from Global Tools?Mcneil
@Mcneil the msbuild definition from Global Tools is exactly what def msbuild = tool name: 'MSBuild', type: 'hudson.plugins.msbuild.MsBuildInstallation' is using.Ching
@NickJones How is that different to ‘${tool 'MSBuild'}’ which seems a lot easier? Genuine questionMcneil
@Mcneil there's not a major difference; your example syntax is not explicitly specifying the type of tool so would pick up whatever tool has the name 'MSBuild' (regardless of type), and you're using a ${} expression to evaluate it to a string immediately. Your example could specify the type too: ${tool name: 'MSBuild', type: 'msbuild'}. (My syntax uses a fully-qualified tool type, which is just a product of the age of my original answer.)Ching
A
8

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:
Global Tool Configuration


Scroll down to MSBuild and click the button to expand the section:
MSBuild tool installations


Here you can see what tool name to use to reference MSBuild (or add one):
MSBuild tool name


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)

Ado answered 3/12, 2018 at 11:31 Comment(2)
please rather use a more descriptive name (not only a version number!): ${tool 'MSBuild 15.0 [32bit]'}Threefold
Jenkins complains when you put the full path to the exe into the tool configuration. If you put just the path to the folder instead it won't complain but you then have to append \\msbuild.exe in the JenkinsFile as per some of the other answers and comments on this page.Mcneil
S
5

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: How to use Jenkins tool paths in scripts

Sunset answered 18/1, 2019 at 18:19 Comment(0)
O
3

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]'}

Overmantel answered 6/6, 2018 at 9:31 Comment(1)
in our case, it was ${tool '14.0'}, and returned path to msbuild, so we used it like this \"${tool '14.0'}\\msbuild.exe\"Stanislaus
P
0

We have to define msbuild which is installed in Global Tool Configuration in script block

stage('App_Build'){ steps{ tool name: 'MsBuild', type: 'msbuild' bat ""${tool 'MsBuild'}"My.Service.sln /t:Rebuild /p:Configuration=Release" } }

This will work

Pilot answered 29/8, 2019 at 7:17 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.