【问题标题】:Change Windows shell in Jenkins (from Cygwin to Git Bash/msys)在 Jenkins 中更改 Windows shell(从 Cygwin 到 Git Bash/msys)
【发布时间】:2016-05-04 18:38:19
【问题描述】:

我有一个 Windows 7 和一个 Windows Server 2012 从站,Jenkins 代理和 Cygwin 已经设置。我想避免使用 Cygwin,只使用 Git for Windows 附带的 Git Bash shell(我认为它称为 msysgit)。所以我将C:\cygwin64 重命名为C:\cygwin64.bak,从路径中删除C:\cygwin64\bin,然后重新启动。

Windows 2012 机器现在可以正常工作,(Unix) shell 脚本运行,$OSTYPE = msysuname = 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, 系统找不到指定的文件。
在 java.lang.ProcessBuilder.start(ProcessBuilder.java:1041)

所以我的问题是,如何配置 Jenkins 以使用 C:\Program Files\Git\bin\sh.exeC:\Program Files\Git\usr\bin\bash.exe 运行 shell 脚本?

【问题讨论】:

    标签: windows bash jenkins cygwin msysgit


    【解决方案1】:

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

    进行此更改后,您必须重新启动从站与 Jenkins 的连接,否则路径将不会传播。如果您使用的是 Java Web Start,只需关闭 Java 窗口并重新启动即可。

    【讨论】:

    • C:\Program Files\Git\bin 里面也有一个 sh.exe。有什么理由不使用它?
    • @BitwiseMan 不知道。那是符号链接吗?
    • Windows 上的符号链接?对此感到怀疑。 :) 无论哪种方式,我只是想知道您是否尝试过使用较短的路径。
    • 所以我只是在一台机器上看了一下,Git\bin 中的 bash.exesh.exe 都是 32kb,所以我怀疑它们只是指向真实位置的指针。我确实认为Git\bin 是一个更好的默认值,这似乎是您应该使用的路径。我尝试了另一台安装较旧 Git 的机器(在 Program Files (x86) 中),而 \usr\bin 实际上并不存在。
    • Jenkins 在将 sh 用作流水线构建的一部分时需要 nohup(请参阅 JENKINS-33708),因此我必须在 PATH 中使用 C:\Program Files\Git\usr\bin 才能使其工作,因为存在 nohup.exe .
    【解决方案2】:

    如果您只有 Windows 代理并且它们都将 Git for Windows 安装到同一位置,您可以在 Jenkins 系统配置中为所有代理设置 shell 可执行文件。

    转到 Manage Jenkins > Configure System,向下滚动到 Shell 并将 Shell 可执行文件 设置为指向到你想从 Execute shell 构建步骤开始的任何 shell。

    这是一个如何设置与 Git for Windows 一起安装的 shell 的示例:

    注意:如果您同时使用 Windows 和非 Windows 代理 (JENKINS-38211),这将不起作用。如果您的 Windows 代理将 sh.exe 安装到不同的位置(例如 32 位和 64 位 Windows 的混合使用这些平台的默认安装位置),则会导致类似的问题。仅当您的环境仅包含配置相同的 Windows 节点时才使用此选项。

    【讨论】:

    • 谢谢你,这真的很有趣。您知道该设置适用于什么吗?这是master机器上的全局设置,所以我不清楚它是只适用于master还是适用于所有slave。
    • 全局设置似乎也适用于所有奴隶,@gibfahn。我有三个从属服务器,我在所有服务器(和主服务器)上都安装了 Git for Windows,并将 Shell 可执行文件 设置为指向 sh.exe。现在我可以使用 Execute shell 构建步骤在所有从属设备上运行作业。
    • 好的,听起来这在任何部署中都可以使用,只要您始终将 shell 放在同一个位置(并且您想在所有机器上使用相同的 shell)。很高兴知道,谢谢!
    • @apa64 - 如果你有没有 sh.exe 的 linux 机器,这会中断,对吧?
    • 是的 - 这确实打破了混合操作系统从属环境(刚刚在这里添加了第一个 linux 从属......)。最好按照接受的答案中的说明将 Git usr/bin 添加到 Windows 从属服务器上的 PATH。
    【解决方案3】:

    安装 git-bash

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

    在 windows 中更新路径使用以下命令

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

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

    为 Jenkins 提供 nohup

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

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

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

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

    就是这样,你现在可以运行 shell 命令了

    玩得开心

    【讨论】:

    • 这个答案比下一个要好,因为它允许在你的 Jenkinsfile 中运行 Windows 批处理和 Unix shell 脚本。
    • 我仍然对 Jenkins 看到 bash 命令有疑问,即使在重新启动后对我来说似乎也有问题。 致命:无法运行程序“bash”:
    【解决方案4】:

    关于节点代理配置: 检查工具位置, 添加git的主路径, 例如 C:\Program Files\Git\cmd\git.exe 并保存 重新连接客户端。它会工作

    【讨论】:

      猜你喜欢
      • 2011-02-14
      • 2016-09-05
      • 2018-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-28
      • 2018-05-12
      相关资源
      最近更新 更多