Jenkins 管道 sh 在 Windows 上因“无法运行程序 nohup”而失败

Posted

技术标签:

【中文标题】Jenkins 管道 sh 在 Windows 上因“无法运行程序 nohup”而失败【英文标题】:Jenkins pipeline sh fail with "cannot run program nohup" on windows 【发布时间】:2017-12-21 18:38:59 【问题描述】:

我有 Windows 10,我想在 Jenkins 管道中使用 bash for Ubuntu for windows 执行 Jenkinsfile 中的 sh 命令,但它不起作用

我的 Jenkins 管道中有以下阶段:

stage('sh how to') 
        steps 
            sh 'ls -l'
        
    

错误信息是:

[C:\Program Files (x86)\Jenkins\workspace\pipelineascode] 运行 shell 脚本 无法运行程序“nohup”(在目录“C:\Program Files (x86)\Jenkins\workspace\pipelineascode”中):CreateProcess error=2, Le fichier spécifié est introuvable

我尝试使用

更改 Jenkins 参数->shell 可执行文件

C:\Windows\System32\bash.exe

但同样的错误...

如何使用 windows 10 的 bash 运行 sh 脚本?

【问题讨论】:

您的路径周围可能缺少引号(包含空格)。如果不仔细检查文件夹中二进制文件的存在...另外,您的阶段代码与给定错误有什么关系? 带/不带引号都不起作用...我尝试使用 shell 脚本和基本命令 (ls -l)... 这就是破坏并发送此错误消息的步骤! 我的解决方法可能会对您有所帮助:***.com/a/41610192/575643 【参考方案1】:

通过快速搜索,您的错误似乎与以下问题有关:JENKINS-33708

主要原因似乎是 Windows 不支持 sh 步骤。例如,您可以使用bat 或安装Cygwin

不过在上一个链接中提出了两种解决方案,建议您执行以下步骤:

安装git-bash 确保 Git\bin 文件夹(即:C:\Program Files\Git\bin)在全局搜索路径中,以便 Jenkins 找到 sh.exe 使 nohup 可用于 Jenkins,在 git-bash 中执行以下操作(相应地调整您的路径): 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 "

根据您的安装,您可能必须使用这些路径:

mklink "C:\Program Files\Git\cmd\nohup.exe" "C:\Program Files\git\usr\bin\nohup.exe" mklink "C:\Program Files\Git\cmd\msys-2.0.dll" "C:\Program Files\git\usr\bin\msys-2.0.dll" mklink "C:\Program Files\Git\cmd\msys-iconv-2.dll" "C:\Program Files\git\usr\bin\msys-iconv-2.dll " mklink "C:\Program Files\Git\cmd\msys-intl-8.dll" "C:\Program Files\git\usr\bin\msys-intl-8.dll "

【讨论】:

@John...上述解决方案对我不起作用,我安装了 git-bash 并设置了路径变量。还有在 bin 和 cmd 上建立的链接,我仍然有错误 非常适合我 我安装了 cygwin 但仍然出现同样的错误【参考方案2】:

使用 Git for Windows 2.16.2,我能够将 C:\Program Files\Git\usr\bin 添加到 PATH(而不是 C:\Program Files\Git\bin),因此我的 sh 命令可以在FreeStyle 和 Pipeline 构建。不需要 mklink。 (Source)

【讨论】:

将 C:\Program Files\Git\usr\bin 添加到用户路径并重新启动 Jenkins 对我有用 也为我工作(在 jenkins 重新启动后)。应该是公认的答案【参考方案3】:

使用 Windows 版 Git,我必须将 C:\Program Files\Git\bin 添加到 Jenkins 中从节点的 PATH 环境变量(以访问 sh),然后将 C:\Program Files\Git\usr\bin 添加到本地的 PATH Windows 从站也是(访问nohup)。

【讨论】:

【参考方案4】:

如果您在 Windows 上执行,只需将 sh 更改为 bat。它会按预期工作。 示例:

管道 代理任何 阶段 stage ('编译阶段')

        steps 
            withMaven(maven : 'apache-maven-3.6.1') 
                bat'mvn clean compile'
            
        
    

【讨论】:

为我工作。谢谢。 感谢您的回答,它为我节省了很多时间。【参考方案5】:

将 sh 切换为 bat 对我有用 - 我在 Windows 上运行 Jenkins。但只有在我解决了由于我没有在 Jenkins 中正确配置我的工具(maven 和 JDK)而导致的问题之后。

【讨论】:

【参考方案6】:

在我的例子中,我在 Pipeline 脚本中将 'sh' 替换为 'bat' 并开始工作。

【讨论】:

【参考方案7】:

Windows 不理解“sh”命令。要启用此功能,请添加

C:\Program Files\Git\bin &

C:\Program Files\Git\usr\bin

到系统环境变量 PATH,然后重新启动系统。

比在 jenkins 中执行你的命令,它会起作用。

【讨论】:

【参考方案8】:

我的观察是,代理似乎试图在运行 agent.jar 的上下文中运行 nohup,而不是在容器中。我在容器中放了什么并不重要,错误信息是一样的。通过将 nohup 和 sh 放在运行 jenkins 代理的 PATH 中,我看到了行为的变化。

git config core.sparsecheckout # timeout=10 git checkout -f c64c7bf905b6a4f5a8f85eb23bbd108f4c805386 sh:/home/jenkins/workspace/projname/simple_docker@tmp/durable-9fedc317/jenkins-log.txt:没有这样的文件或目录 sh:/home/jenkins/workspace/projname/simple_docker@tmp/durable-9fedc317/jenkins-result.txt.tmp:没有这样的文件或目录 mv: cannot stat '/home/jenkins/workspace/projname/simple_docker@tmp/durable-9fedc317/jenkins-result.txt.tmp': 没有这样的文件或目录

我看到一个文件夹 /home/jenkins/workspace/projname/simple_docker@tmp/durable-9fedc317 包含一个文件“script.sh”,内容为“docker inspect -f .repositoryname:tagname”

当在命令行上手动运行此 docker 命令时,它始终会生成由单个句点字符组成的单行输出。我毫不怀疑这不是 jenkins 系统所要寻找的。​​p>

【讨论】:

【参考方案9】:

因此,您希望作业在 WSL 下运行。如果您希望所有作业都在 WSL 下运行,您是否考虑过在 WSL 下安装 Jenkins?那么一切都已经在 GNU 领域了,您不必在 Jenkins 配置中将 windows 的环境/文化与 GNU 联系起来。

【讨论】:

【参考方案10】:

我在 Windows 10 中遇到了上述问题,只是将路径 "C:\Program Files\Git\usr\bin" 添加到系统变量中,然后它就开始工作了。

【讨论】:

【参考方案11】:

在对我有用的解决方案下面我遇到了同样的错误..

    安装 git-bash

    对于 Windows 使用“bat”而不是“sh”

    将“C:\Program Files\Git\usr\bin”设置为 PATH(用户变量)

【讨论】:

【参考方案12】:

sh 不是 windows 命令。在 windows 中启用“sh”命令的简单方法是安装GIT BASH

安装 GIT BASH 后,需要在下面设置环境变量路径。

    C:\Program Files\Git\bin : 此路径包含 sh.exe、bash.exe 和 git.exe C:\Program Files\Git\usr\bin :此路径包含几个基于 Linux 的 exe 和 dll(cat.exe、find.exe 等)

通过设置上述配置,您将能够在安装在 Windows 机器上的 Jenkins 上的 Jenkinsfiles 中执行“sh”命令。

【讨论】:

以上是关于Jenkins 管道 sh 在 Windows 上因“无法运行程序 nohup”而失败的主要内容,如果未能解决你的问题,请参考以下文章

Jenkins:管道 sh 错误替换错误

如何使用声明性 Jenkins 管道在同一节点上运行多个阶段?

在 Kubernetes 上的 Jenkins 管道中使用 npm 构建 ReactJs 应用程序

在Jenkins管道shell中运行嵌套命令

如何在 Jenkins 声明式管道中设置声纳扫描仪

使用 jenkins 在 Windows 远程环境 (VM) 上触发脚本