Jenkins:找不到名为MSBuild的工具。

10
在Jenkins(Jenkins 2.6)中设置一个Pipeline构建,复制基于git的构建的示例脚本时出现了“找不到名为MSBuild的工具”。我已经在“管理Jenkins -> 全局工具配置”中设置了MSBuild工具。我正在代理节点上运行Pipeline。

在代理配置中,我已经在“节点属性 -> 工具位置”中设置了MSBuild工具路径。
在构建过程中,它无法获取MSBuild工具路径,如果我在没有使用Jenkinsfile的情况下运行相同的源代码,它可以正常工作。


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

我还尝试过更改Windows代理的环境变量,但它没有刷新。 注意:我已在代理节点上安装了MS Build工具。

你在构建时有检查运行的控制台是哪个代理吗? - Chandra Sekhar Y
以上是具有轻微更改的相同代码,请尝试一次以检查其是否正常工作。 - Chandra Sekhar Y
@Chandra Sekhar:感谢您提供的代码,但是它并没有起作用,问题不在于代码本身,而是MSBuild变量显示为空字符串。我已经通过在Jenkinsfile中运行vcvars64.bat来设置了vs2017环境变量。 - Atul N
@Kdawg,问题是错别字,我已经更新了问题。仍然面临同样的问题。 - Atul N
嗯...你有像第一位评论者建议的那样检查控制台输出以确保它实际上正在构建你认为正在构建的节点吗?也许提供一些全局和节点工具配置的截图会更好? - Kdawg
显示剩余2条评论
5个回答

15
声明性流水线语法中,MSBuild的工具有点笨重。这是我处理它的方式,使用一个script块:
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"
        } 
      } 
    } 
  } 
} 

在旧的Scripted Pipeline语法中,可以像这样:
node('win-agent-node') {
  def msbuild = tool name: 'MSBuild', type: 'hudson.plugins.msbuild.MsBuildInstallation'

  stage('Checkout') {
    checkout scm
  }

  stage('Build') {
    bat "${msbuild} SimpleWindowsProject.sln"
  }
}

4
感谢@nick提供的解决方案,最终使用msbuild工具进行了修改,并在命令中添加了小的修改bat "\"${msbuild}\" SimpleWindowsProject.sln"。因为MSBuild路径中有空格,导致出现错误C:\Program' is not recognized as an internal or external command - Atul N
1
是的,我们通过使用旧式文件夹名称来避免了特定的空间问题,例如,来自Visual Studio 2013的32位MSBuild在这里:C:\PROGRA~2\MSBuild\12.0\Bin\MSBuild.exe。 - Nick Jones
你不能直接使用全局工具中的msbuild定义吗? - Caltor
@Caltor,全局工具中的MSBuild定义正是def msbuild = tool name: 'MSBuild', type: 'hudson.plugins.msbuild.MsBuildInstallation'所使用的。 - Nick Jones
@NickJones 这与“${tool 'MSBuild'}”有什么不同呢?后者似乎更容易使用。这是一个真正的问题。 - Caltor
@Caltor,没有太大的区别;您的示例语法未显式指定工具的类型,因此会选择具有名称“MSBuild”的任何工具(无论类型如何),并且您使用${}表达式立即将其评估为字符串。您的示例也可以指定类型:${tool name: 'MSBuild', type: 'msbuild'}。(我的语法使用了完全限定的工具类型,这只是我的原始答案的产物。) - Nick Jones

8

如果您遇到此问题,想知道“工具”在Jenkins中代表什么以及它在哪里配置,请参阅以下屏幕截图:

转到“管理Jenkins” ->“全局工具配置”:
全局工具配置


滚动到MSBuild并单击按钮展开该部分:
MSBuild工具安装


在这里,您可以看到要用于引用MSBuild的工具名称(或添加一个):
MSBuild工具名称


然后,您可以像这样引用它:bat "\"${tool '15.0'}\" solution.sln /p:Configuration=Release /p:Platform=\"x86\"(示例不是声明性语法,但应显示其思想)


1
请使用更具描述性的名称(不仅仅是版本号!):${tool 'MSBuild 15.0 [32位]'} - Alexander Stohr
当你在工具配置中输入exe的完整路径时,Jenkins会抱怨。如果你只输入文件夹的路径,它就不会抱怨,但是你需要在JenkinsFile中添加\msbuild.exe,这是根据本页面上其他答案和评论的建议。 - Caltor

5

您需要在Jenkins中定义MSBuild => 管理Jenkins => 全局工具配置,或使用已经定义好的不同工具名称。

${tool 'toolname'}  returns the path defined for a tool in Global Tool Configuration.

警告:注意所定义的路径。它是指向文件夹还是msbuild.exe?您可能需要添加msbuild.exe:

 ${tool 'VS2017'}\msbuild.exe

简单的快照来解释这个概念: 如何在脚本中使用Jenkins工具路径

3

虽然提供的答案肯定有效,但你只需要提供正确的完整工具名称。

在我们的安装中,有三个不同的MSBuild版本可用,我可以使用以下内容:

${tool 'MSBuild 15.0 [32bit]'}


4
在我们的情况下,${tool '14.0'}返回了msbuild的路径,因此我们这样使用它:\"${tool '14.0'}\\msbuild.exe\" - d.Candela

0

我们需要在脚本块中定义已安装在全局工具配置中的msbuild

阶段('App_Build'){ 步骤{ 工具名称:'MsBuild',类型:'msbuild' bat ""${tool 'MsBuild'}"My.Service.sln /t:Rebuild /p:Configuration=Release" } }

这将起作用


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接