在 jenkins 中运行命令 shell
Posted
技术标签:
【中文标题】在 jenkins 中运行命令 shell【英文标题】:Run a command shell in jenkins 【发布时间】:2015-08-03 04:41:38 【问题描述】:我正在尝试在 Jenkins 中执行命令外壳,我正在使用 Windows 7。在控制台输出中我有这个:
Building in workspace C:\Program Files (x86)\Jenkins\workspace\test
[test] $ sh -xe C:\Windows\TEMP\hudson6299483223982766034.sh
The system cannot find the file specified
FATAL: L'exécution de la commande a échoué.
java.io.IOException: Cannot run program "sh" (in directory "C:\Program Files (x86)\Jenkins\workspace\test"): CreateProcess error=2, Le fichier spécifié est introuvable
at java.lang.ProcessBuilder.start(Unknown Source)
at hudson.Proc$LocalProc.<init>(Proc.java:244)
at hudson.Proc$LocalProc.<init>(Proc.java:216)
at hudson.Launcher$LocalLauncher.launch(Launcher.java:816)
at hudson.Launcher$ProcStarter.start(Launcher.java:382)
at hudson.tasks.CommandInterpreter.perform(CommandInterpreter.java:97)
at hudson.tasks.CommandInterpreter.perform(CommandInterpreter.java:66)
at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:779)
at hudson.model.Build$BuildExecution.build(Build.java:205)
at hudson.model.Build$BuildExecution.doRun(Build.java:162)
at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:537)
at hudson.model.Run.execute(Run.java:1744)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
at hudson.model.ResourceController.execute(ResourceController.java:98)
at hudson.model.Executor.run(Executor.java:374)
Caused by: java.io.IOException: CreateProcess error=2, Le fichier spécifié est introuvable
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.<init>(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
... 16 more
Build step 'Exécuter un script shell' marked build as failure
[BFA] Scanning build for known causes...
[BFA] No failure causes found
[BFA] Done. 0s
Finished: FAILURE
有什么想法吗?
【问题讨论】:
出于某种原因,我认为尝试运行sh
shell 无法在 Windows 上运行。也许您应该尝试运行 .bat
脚本,因为您在 Windows 上?
这里的分步说明 - ***.com/a/60326671/6648326
【参考方案1】:
对于Windows slave,请使用Execute Windows batch command
.
对于像 linux 或 Mac 这样的类 Unix 从站,Execute shell
是选项。
【讨论】:
对我来说,使用 shell 命令更简单,这就是为什么我希望在 Windows 上执行 shell 命令 好吧,尝试将 'sh' 的完整路径提供给 jenkins。像这样:C:\Windows\sh myfile.sh
要清楚我正在尝试使用 curl 命令,我无法使用 windows 命令执行此操作,我不确定是否可以使用 jenkins 上的 shell 命令执行此操作,知道吗?跨度>
@Medbraim 这不是关于什么对你来说“更简单”,而是关于你的系统支持什么。在 Windows 上,没有本机 sh
可执行文件,因此您不能使用“执行 Shell”构建步骤。时期。如果你想使用“Execute Shell”构建步骤,你需要安装 Cygwin(或类似的)并确保 sh
可执行文件位于 PATH
@Medbraim 安装 Cygwin 可能对您来说太痛苦了。如果您只需要在 windows 中运行 cURL 命令,那么您只需要在 windows 中下载并安装 cURL,然后确保 cURL 可执行文件位于 PATH 中的某个位置。【参考方案2】:
据我所知,Windows 不支持开箱即用的 shell 脚本。您可以为 Windows 安装 Cygwin 或 Git,转到 Manage Jenkins > Configure System Shell 并将其指向在其安装中找到的 sh.exe 文件的位置。例如:
C:\Program Files\Git\bin\sh.exe
我发现了另一种选择。这个更好,因为它允许我通过简单的sh "something"
在管道脚本中使用 shell。
将文件夹添加到系统 PATH。右键单击计算机,单击属性> 高级系统设置> 环境变量,将C:\Program Files\Git\bin\
添加到系统路径属性中。
重要提示:出于某种原因,我不得不将它添加到系统范围的路径中,添加到用户路径不起作用,即使 Jenkins 正在此用户上运行。
重要说明(感谢 bugfixr!):
这行得通。应该注意的是,您需要重新启动 Jenkins 才能获取新的 PATH 变量。我只是去我的服务并从那里重述它。
免责声明:由于我使用的不是英文 Windows,因此名称可能略有不同。
【讨论】:
我就是这么做的。在 C:\cygwin 下安装 Cygwin。然后在 Manage Jenkins > Configure > Shell (Shell Executable) 我输入: c:\cygwin\bin\sh.exe 谢谢。这最终对我有用。我以前没有遇到过这个问题,但我认为这可能是因为这一次我将 Jenkins 安装在与 git 安装位置不同的驱动器中。 这行得通。应该注意的是,您需要重新启动 Jenkins 才能获取新的 PATH 变量。我只是去了我的服务并从那里重述。 我可以用 WinSCP 代替 cygwin 或 Git 你可以试试 WinSCP.com 文件。我没有尝试过这种方法。【参考方案3】:这是因为 Jenkins 不知道 shell 路径。 在 Manage Jenkins -> Configure System -> Shell 中,将 shell 路径设置为
C:\Windows\system32\cmd.exe【讨论】:
感谢您的提示,但不适用于混合 Linux 和 Windows 从站?这应该可以在从属级别进行配置。【参考方案4】:错误表明脚本不存在
文件不存在。检查您的完整路径
C:\Windows\TEMP\hudson6299483223982766034.sh
The system cannot find the file specified
此外,要将 .sh 脚本启动到 Windows 中,您需要安装 CYGWIN 并将其配置到您的路径中
确认脚本存在。
进入 jenkins 脚本,执行以下操作以确认您确实拥有该文件
cd C:\Windows\TEMP\
ls -rtl
sh -xe hudson6299483223982766034.sh
【讨论】:
【参考方案5】:转到 Jenkins -> 管理 Jenkins -> 配置系统 -> 全局属性 选中“环境变量”框并添加 JAVA_HOME 路径 = "C:\Program Files\Java\jdk-10.0.1"
*不要在最后写bin
【讨论】:
【参考方案6】:我正在运行一个在 Windows 机器上运行 Jenkins 中的 shell 脚本的作业。由于下面给出的错误,作业失败。感谢Andrejz's answer 中的线索,我能够修复错误。
错误:
Started by user james
Running as SYSTEM
Building in workspace C:\Users\jamespc\.jenkins\workspace\myfolder\my-job
[my-job] $ sh -xe C:\Users\jamespc\AppData\Local\Temp\jenkins933823447809390219.sh
The system cannot find the file specified
FATAL: command execution failed
java.io.IOException: CreateProcess error=2, The system cannot find the file specified
at java.base/java.lang.ProcessImpl.create(Native Method)
at java.base/java.lang.ProcessImpl.<init>(ProcessImpl.java:478)
at java.base/java.lang.ProcessImpl.start(ProcessImpl.java:154)
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1107)
Caused: java.io.IOException: Cannot run program "sh" (in directory "C:\Users\jamespc\.jenkins\workspace\myfolder\my-job"): CreateProcess error=2, The system cannot find the file specified
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1128)
at java.base/java.lang.ProcessBuilder.start(ProcessBuilder.java:1071)
at hudson.Proc$LocalProc.<init>(Proc.java:250)
at hudson.Proc$LocalProc.<init>(Proc.java:219)
at hudson.Launcher$LocalLauncher.launch(Launcher.java:937)
at hudson.Launcher$ProcStarter.start(Launcher.java:455)
at hudson.tasks.CommandInterpreter.perform(CommandInterpreter.java:109)
at hudson.tasks.CommandInterpreter.perform(CommandInterpreter.java:66)
at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:741)
at hudson.model.Build$BuildExecution.build(Build.java:206)
at hudson.model.Build$BuildExecution.doRun(Build.java:163)
at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:504)
at hudson.model.Run.execute(Run.java:1853)
at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
at hudson.model.ResourceController.execute(ResourceController.java:97)
at hudson.model.Executor.run(Executor.java:427)
Build step 'Execute shell' marked build as failure
Finished: FAILURE
解决方案:
1 - 安装 Cygwin 并记下它的安装目录。
就我而言,它是 C:\cygwin64。运行 shell 脚本所需的 sh.exe 位于“bin”子目录中,即 C:\cygwin64\bin。
2 - 告诉 Jenkins sh.exe 所在的位置。
Jenkins web 控制台 > 管理 Jenkins > 配置系统 > 在 shell 下,设置“Shell executable” = C:\cygwin64\bin\sh.exe > 点击应用并点击保存。
这就是我为了让我的工作顺利通过所做的一切。我从一个战争文件运行 Jenkins,我不需要重新启动它来完成这项工作。
【讨论】:
以上是关于在 jenkins 中运行命令 shell的主要内容,如果未能解决你的问题,请参考以下文章
是否有任何 Maven 命令可以在 Jenkins shell 上运行来分析 SonarQube 中的打字稿代码?
如何在 shell 命令中发送 Jenkins 版本号作为参数,该命令将在构建结束后执行