Windows 上的 Hudson - 错误:java.io.IOException:无法运行程序“sh”
Posted
技术标签:
【中文标题】Windows 上的 Hudson - 错误:java.io.IOException:无法运行程序“sh”【英文标题】:Hudson on Windows - Error: java.io.IOException: Cannot run program "sh" 【发布时间】:2013-02-14 15:47:20 【问题描述】:我正在尝试与 Hudson 和 MSTest 进行持续集成。
当我尝试运行此作业时,我收到以下错误:
1 Warnung(en)
0 Fehler
Verstrichene Zeit 00:00:00.13
[workspace] $ sh -xe C:\Windows\TEMP\hudson4419897732634199534.sh
The system cannot find the file specified
FATAL: Befehlsausführung fehlgeschlagen
java.io.IOException: Cannot run program "sh" (in directory "C:\Users\Markus\.hudson\jobs\Test1 Unit TEst\workspace"): CreateProcess error=2, Das System kann die angegebene Datei nicht finden
at java.lang.ProcessBuilder.start(Unknown Source)
at hudson.Proc$LocalProc.<init>(Proc.java:187)
at hudson.Proc$LocalProc.<init>(Proc.java:157)
at hudson.Launcher$LocalLauncher.launch(Launcher.java:649)
at hudson.Launcher$ProcStarter.start(Launcher.java:266)
at hudson.Launcher$ProcStarter.join(Launcher.java:273)
at hudson.tasks.CommandInterpreter.perform(CommandInterpreter.java:79)
at hudson.tasks.CommandInterpreter.perform(CommandInterpreter.java:54)
at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:34)
at hudson.model.AbstractBuild$AbstractRunner.perform(AbstractBuild.java:646)
at hudson.model.Build$RunnerImpl.build(Build.java:181)
at hudson.model.Build$RunnerImpl.doRun(Build.java:136)
at hudson.model.AbstractBuild$AbstractRunner.run(AbstractBuild.java:434)
at hudson.model.Run.run(Run.java:1390)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:40)
at hudson.model.ResourceController.execute(ResourceController.java:81)
at hudson.model.Executor.run(Executor.java:137)
Caused by: java.io.IOException: CreateProcess error=2, Das System kann die angegebene Datei nicht finden
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.<init>(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
... 17 more
Processing tests results in file results.trx
FATAL: No MSTest TRX test report files were found. Configuration error?
[DEBUG] Skipping watched dependency update for build: Test1 Unit TEst #5 due to result: FAILURE
Finished: FAILURE
我的配置如下所示:
Buildverfahren
Build a Visual Studio project or solution using MSBuild
MSBuild Version MS Build .NET 4
MSBuild Build File trunk\UnitTestWithNHibernate\UnitTestWithNHibernate.sln
Command Line Arguments /p:Configuration=Release
我的命令行如下所示:
"C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\IDE\MSTest.exe"
/runconfig: trunk\UnitTestWithNHibernate\UnitTest\LocalTestRun.testrunconfig /testcontainer: trunk\UnitTestWithNHibernate\UnitTest\bin\Debug\UnitTest.dll /resultsfile:results.trx
【问题讨论】:
发现问题。必须将 shell 指定为 C\windows\system32\cmd.exe 请回答您自己的问题,以便将来可以帮助其他人,因此人们不会为了发现问题已经解决而阅读您的整个问题。 【参考方案1】:这是因为 Jenkins 不知道 shell 路径。 在 Manage Jenkins -> Configure System -> Shell 中,将 shell 路径设置为
C:\Windows\system32\cmd.exe
【讨论】:
难道不应该从PATH
算出来吗?
你好,我有windows和linux机器作为奴隶。如果我设置 cmd.exe 的路径,那么它将停止在 linux 机器上工作
@ajith:我在 Windows 机器上设置了这个路径,并在作业中将 shell 命令设置为 echo 'HelloWorld' 但不打印
我得到了和@Swift一样的结果,构建成功但是我认为它没有执行命令【参考方案2】:
只需使用“windows 批处理命令”并输入 windows 命令,就像在命令行中键入它们一样。
【讨论】:
【参考方案3】:这个问题将通过尝试这个命令让 jenkins 作业运行来解决 对我来说它有效,只需尝试在管理 jenkins --> 配置系统 --> 搜索 shell --> 并在 shell 可执行文件中给出以下命令来更新它。有帮助!!!
C:\Program Files\Git\bin\sh.exe
【讨论】:
【参考方案4】:解决问题的方法是将C:\Windows\system32\cmd.exe
的值放入Hudson系统配置中的“Shell executable”配置中。
在你的工作的构建部分,你可以在编译项目后放置windows命令来执行 例如:
copy target\pmd-rules-extensions-0.0.1-SNAPSHOT.jar D:\projects\sonar\sonar-3.4.1\extensions\rules\pmd\
【讨论】:
【参考方案5】:在我的情况下,构建在执行系统重新启动和迁移之前使用“执行 shell”工作,并在之后提供 Cannot run program "sh"
。问题是系统路径意外变短。不清楚原因,但是路径丢失了C:\Program Files (x86)\Git\bin
,而我使用的Git版本带有sh.exe
。
当然,您可以按照@funkybro 的建议在所有作业中将所有“执行 shell”构建步骤更改为“执行 Windows 批处理命令”。如果您的工作可以在 Windows 系统或 Linux 上运行,并且出于其他原因同时拥有这两个系统,这并不能解决您的问题。
或者,您可以按照@ajith 的建议将此设置更改为使用cmd.exe
:管理 Jenkins -> 配置系统 -> 外壳 -> 外壳可执行文件 = C:\Windows\system32\cmd.exe
但是,我喜欢使用 linux 命令并使用更类似于 Bash 的东西。这是我自己的偏好,但我认为这也可能会有所帮助。从头开始,我使用Chocolatey NuGet 安装Git。我还推荐 GnuWin 为您提供一些非常有用的 Unix 命令。
安装Chocolatey NuGet 在 CMD 或 PowerShell 中:cinst gnuwin git
然后您可以使用 Windows 用户界面通过将C:\Program Files (x86)\Git\bin\
添加到系统路径来解决此问题。
或者你可以在 Jenkins 全局配置中修复它:Manage Jenkins -> Configure System -> Shell -> Shell executable = C:\Program Files (x86)\Git\bin\sh.exe
【讨论】:
谢谢@Nate。我遇到过同样的问题。问题是我的 git install 只添加了 \Git\cmd\ 而不是 \Git\bin.. 我还必须重置与节点的连接以使 Jenkins 重新加载 PATH。 如果我在全局 Jenkins 的配置中指定 shell 可执行文件,即使我的 Linux 和 OSX 从站也会尝试使用它,这会导致它们都失败?!有没有办法只为我的 Windows 从站指定 shell 可执行路径? 这是一个很好的问题,但不幸的是我不知道答案,我也没有设置 Jenkins 来进行实验。我建议您尝试寻找特定从站的设置或寻找其他解决方案。抱歉,我帮不上忙。【参考方案6】:如果您将 Windows 命令指定为“执行 shell”而不是“执行 Windows 批处理命令”,则会发生这种情况。
【讨论】:
以上是关于Windows 上的 Hudson - 错误:java.io.IOException:无法运行程序“sh”的主要内容,如果未能解决你的问题,请参考以下文章
如何在hudson服务器的slave中配置java.home?
Hudson 3.1.0 + Maven 2.2.1 + sonar 3.7.3 [错误] 加载程序约束违规:解析字段“VISIBLE”时
Jenkins - git.exe init#timeout = 10错误:克隆远程repo‘origin‘时出错hudson.plugins.git
Jenkins - git.exe init#timeout = 10错误:克隆远程repo‘origin‘时出错hudson.plugins.git