Msbuild通过VS和命令行工作,但通过詹金斯失败

问题描述:

我想构建一个VS.sln,它有多个C++ .vcproj。解决方案文件是使用CMake生成的,我在Jenkins中使用了这部分工作(使用CMake builder插件)。为了构建解决方案文件,我使用了msbuild。我能够建立使用Visual Studio和在命令行中使用以下命令解决方法:Msbuild通过VS和命令行工作,但通过詹金斯失败

C:\Jenkins\workspace\SonioTest>"C:\Windows\Microsoft.NET\Framework\v4.0.30319\msbuild.exe" /t:Rebuild bin/SonIO.sln 

这成功生成(即詹金斯驻留在同一台机器上)。

但是,我试图在Jenkins中自动化构建的这部分,并且构建最终失败了几个C1083错误("Cannot open source file: '..\path\to\file.ext': No such file or directory)。我已经尝试使用Jenkins msbuild插件,并使用与终端中相同的命令作为“执行Windows批处理命令”构建步骤,结果相同。

使用Windows批处理命令生成步骤,我可以在日志中看到,正在执行的命令:

C:\Jenkins\workspace\SonioTest>"C:\Windows\Microsoft.NET\Framework\v4.0.30319 msbuild.exe" /t:Rebuild bin/SonIO.sln

...是完全一样的命令行工作的一个,包括的工作目录。

我正在运行Jenkins作为服务,并且我的服务登录为我的帐户(具有管理员权限)。任何人都知道詹金斯将执行批处理命令的目录是什么?

任何想法,为什么我看到詹金斯和命令行之间的这种行为差异?

+0

我认为你必须使用一个占位符,就像%WORKSPACE% – 2013-02-11 14:42:39

+0

指定到您的解决方案的绝对路径我已验证该命令由Jenkins从同一个工作目录运行。您的评论是否仍然适用?我不是100%确定你的意思。 – Kohanz 2013-02-11 15:00:47

在不了解VS构建知识的情况下,它看起来很像环境设置。

我的第一个建议是确保在Jenkins中将目录更改为您运行良好命令的同一目录,然后再尝试。

此外,可能想尝试将Jenkins作为独立应用程序首先运行。

作为一种服务,也许允许服务“与桌面交互”。

我希望这是一个好头......

+0

我已经验证它与成功的非Jenkins命令(请参阅我的编辑)在相同的工作目录中运行。由于我指定了我自己的(管理员)用户帐户,因此“与桌面互动”复选框呈灰色。 – Kohanz 2013-02-11 14:59:54

+0

您是否尝试过将Jenkins作为流程运行,而不是作为服务? – 2013-02-11 19:50:52

这既是一个解决办法作为一个解决方案,但我最终使用devenv代替msbuild并能正常工作。

我知道这强烈暗示它是一个环境问题,但由于在构建服务器上安装VS并不是问题,所以我决定节省在msbuild兔子洞中花费的时间。

Jenkins从属代理与您在提示中执行相同命令行时所使用的环境不同的环境。比较两种环境,注意差异,然后将它们添加到Jenkins作业中。

要获得运行时,从环境,有它做一个从Windows命令“设置”提示

+0

我这样做了(在切换到devenv之前),Jenkins从属环境几乎(不完全)是我的命令行环境的超集。我仔细研究了编译时使用的变量(VC ...),他们几乎一样,詹金斯奴隶有一些额外的变量。我很感激这个帮助,但除非我有一个令人信服的理由才能从devenv.exe切换,否则我宁愿不花更多时间参与调查。 – Kohanz 2013-02-12 14:53:40