将Jenkins中的Windows shell更改为Git Bash/msys(从Cygwin)

13
我有一台装有Jenkins代理程序和Cygwin的Windows 7和Windows Server 2012从机。我想避免使用Cygwin,而是使用随Git for Windows(我认为它被称为msysgit)一起提供的Git Bash shell。因此,我将“C:\cygwin64”重命名为“C:\cygwin64.bak”,从路径中删除“C:\cygwin64 \ bin”,然后重新启动。

Windows 2012工作正常,(Unix) shell脚本运行,$OSTYPE = msys,uname = MSYS_NT-6.3(表示正在运行Git Bash shell)。

Windows 7不会运行任何东西,并显示以下错误:

  

在C:\Users\Jenkins\workspace\TEST上远程构建win7
  [win7] $ sh -xe C:\Users\jenkins\AppData\Local\Temp\hudson5047939025129374618.sh
  系统找不到指定的文件
  严重:命令执行失败
  java.io.IOException:无法运行程序“sh”(位于目录“C:\Users\Jenkins\workspace\TEST”):CreateProcess
  error=2,系统找不到指定的文件。
       at java.lang.ProcessBuilder.start(ProcessBuilder.java:1041)

因此,我的问题是,如何配置Jenkins使用“C:\Program Files\ Git \ bin \ sh.exe”或“C:\Program Files\ Git \ usr \ bin \ bash.exe”来运行shell脚本?

4个回答

21

我已经解决了。 Jenkins将简单地选择路径中的第一个 sh.exe。 Git Bash在 C:\Program Files\Git\usr\bin 有一个exe文件,因此如果将其添加到路径的开头,则会被Jenkins拾取。

在进行此更改后,您必须重新启动与Jenkins的slave连接,否则路径不会传播。 如果使用Java Web Start,请关闭java窗口并重新启动它。


C:\Program Files\Git\bin 里也有一个 sh.exe。有什么理由不使用它吗? - BitwiseMan
@BitwiseMan 没有头绪。那是一个符号链接吗? - gib
在Windows上创建符号链接?我有点怀疑。 :) 无论如何,我只是想知道你是否尝试使用较短的路径。 - BitwiseMan
所以我刚刚在一台机器上查看了一下,Git\bin中的bash.exesh.exe都是32kb,所以我怀疑它们只是指向真实位置的指针。我认为Git\bin是更好的默认路径,这似乎是你应该使用的路径。我尝试了另一台安装较旧的Git(在Program Files (x86)中)的机器,\usr\bin实际上并不存在。 - gib
5
当使用 Pipeline 构建时,Jenkins 要求在使用 sh 时需要使用 nohup(参见 JENKINS-33708)。因此,我必须将 C:\Program Files\Git\usr\bin 添加到 PATH 中,以便它能正常工作,因为 nohup.exe 在那里。请注意,这句话涉及一些技术术语,可能需要相关背景知识才能完全理解。 - Nick Jones
显示剩余3条评论

11
如果您只使用Windows代理,并且它们都已将Git for Windows安装到相同位置,则可以在Jenkins系统配置中为所有代理设置Shell可执行文件。请转到“管理Jenkins”>“配置系统”,向下滚动至“Shell”并将“Shell可执行文件”设置为指向要使用的 Shell,以开始“执行shell”构建步骤。以下是如何设置安装了Git for Windows的Shell的示例:

Jenkins shell configuration

注意:如果您的代理程序是混合的 Windows 和非 Windows 代理程序(JENKINS-38211),则此方法不起作用。如果您有安装 sh.exe 不同位置的 Windows 代理程序(例如在默认安装位置上使用了 32 位和 64 位 Windows 的混合),将会导致类似问题。只有当您的环境仅包含完全相同配置的 Windows 节点时才使用此方法。

谢谢你的回复,这真的很有趣。你知道那个设置应用于什么吗?它是主机上的全局设置,所以我不确定它只适用于主机还是所有从机。 - gib
1
好的,听起来这在任何部署中都可以工作,只要你始终将 shell 放在同一个位置(并且你想在所有机器上使用相同的 shell)。很好知道,谢谢! - gib
1
@apa64 - 如果你的Linux机器没有sh.exe,那么这个程序会出问题,对吗? - BitwiseMan
@BitwiseMan 是的,我预计它会出问题,在仅限于Windows环境下,这个功能可以正常工作。如果您可以为每个从机配置shell可执行文件,则可以拥有混合环境,但在Jenkins v.1.651.3中无法完成此操作(至少不能从UI中完成)。 - apa64
1
是的 - 这确实会在混合操作系统从机环境中出现问题(刚刚添加了第一个Linux从机...)。最好按照接受的答案指示,在Windows从机上将Git usr/bin添加到PATH中。 - apa64
显示剩余4条评论

6

安装git-bash

确保Git\bin文件夹(例如:C:\Program Files\Git\bin)在全局搜索路径中,以便Jenkins能找到sh.exe

要在Windows上更新路径,请使用以下命令:

setx path "%path%;C:\Program Files\Git\bin"

或者参考这里:https://www.windows-commandline.com/set-path-command-line/

使nohup对Jenkins可用

  • mklink "C:\Program Files\Git\bin\nohup.exe" "C:\Program Files\git\usr\bin\nohup.exe"

  • mklink "C:\Program Files\Git\bin\msys-2.0.dll" "C:\Program Files\git\usr\bin\msys-2.0.dll"

  • mklink "C:\Program Files\Git\bin\msys-iconv-2.dll" "C:\Program Files\git\usr\bin\msys-iconv-2.dll"

  • mklink "C:\Program Files\Git\bin\msys-intl-8.dll" "C:\Program Files\git\usr\bin\msys-intl-8.dll"

现在您可以运行shell命令了

享受吧


2
这个答案比下一个更好,因为它允许在Jenkinsfile中运行Windows批处理和Unix shell脚本。 - Jean-François Larvoire
我仍然遇到了Jenkins无法识别bash命令的问题,即使重新启动后对我来说似乎仍然存在问题。致命错误:无法运行程序“bash”: - bnns

0

关于节点代理配置: 检查工具位置, 添加git的主目录路径, 例如C:\Program Files\Git\cmd\git.exe 保存更改, 重新连接客户端,即可生效


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