在 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的主要内容,如果未能解决你的问题,请参考以下文章

以root用户运行jenkins中shell命令 重要

是否有任何 Maven 命令可以在 Jenkins shell 上运行来分析 SonarQube 中的打字稿代码?

远程(jenkins)调用shell 不能正常结束

如何在 shell 命令中发送 Jenkins 版本号作为参数,该命令将在构建结束后执行

sbt dist在终端中工作但不与Jenkins一起作为shell脚本

jenkins跳过shell执行错误