10
votes

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 slave node.

In Slave 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-slave-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 slave it not refreshed.


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

5
Have you checked the console on which agent it was running while you are building.Chandra Sekhar Y
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/) } }"Chandra Sekhar Y
Above is the same code with minor changes try once to check whether working/notChandra Sekhar Y
Can you check to make sure you called the tool MSBuild? You have it referenced one I'm above as "MBuild", without an S.Kdawg
@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 JenkinsfileAtul N

5 Answers

14
votes

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"
  }
}
8
votes

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)

4
votes

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

3
votes

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

0
votes

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