我在尝试让Jenkinsfile工作时遇到了很多麻烦。 我一直在尝试运行这个测试脚本:
#!/usr/bin/env groovy
node {
stage('Build') {
echo 'Building....'
// Create virtualenv
sh 'echo "hi"'
}
stage('Test') {
echo 'Building....'
}
stage('Deploy') {
echo 'Deploying....'
}
}
但是我在尝试构建时遇到了这个错误:
Warning: JENKINS-41339 probably bogus PATH=/usr/lib64/ccache:/usr/lib64/ccache:$PATH; perhaps you meant to use ‘PATH+EXTRA=/something/bin’?
[test-job-jenkinsfile-pipeline] Running shell script
nohup: failed to run command `sh': No such file or directory
我将所有管道插件更新到最新版本,但仍然遇到此错误。有什么帮助吗?
答案 0 :(得分:24)
Jonathan的回答是正确的,因为使用Jenkins环境变量设置修改$ PATH会导致此问题 - 但只是删除您拥有的PATH自定义项可能会导致您失去功能,尤其是如果您的Jenkins中有任何Freestyle类型的项目。
在整个宇宙的其余部分中,通过将$ PATH设置为新的东西加上现有的$ PATH来编辑$ PATH非常常见,如下所示:
PATH=/opt/blah/bin:$PATH
这会将/opt/blah/bin
添加到$PATH
中已有的内容中。所以最终的$PATH
可能看起来像:/opt/blah/bin:/usr/local/bin:/usr/sbin:/bin
(当然这只是一个例子)
这实际上适用于Jenkins Freestyle项目。但是,对于Pipeline项目,Jenkins由于某种原因实际上并没有评估和替换您设置的变量中的$ PATH变量。所以你最终得到了/opt/blah/bin:$PATH
的路径 - 所以之前没有任何东西仍然在你的$ PATH中!
显然,Jenkins项目决定(1)检测条件并显示一个奇怪的警告(“警告:JENKINS-41339可能是虚假的”),而不是仅仅修复那个bug,暗示你应该检查那张票并且(2)创建一种全新的方式来定义PATH的附加功能,这是解决问题的最佳方法,因为它允许您自定义$ PATH而不会破坏所有内容。您可以在Jenkins->配置系统中执行此操作。
定义一个名为PATH+EXTRA
的变量,其中EXTRA显然可以是任何东西。
在该变量中,只需添加PATH的附加内容即可。所以在我上面的例子中,我根本不会设置PATH
,而是设置:
PATH+EXTRA=/opt/blah/bin
现在删除任何已定义的PATH
变量。
根据related ticket,这在Jenkins的某处记录,但未在需要的地方记录,在Manage Jenkins-> Configure System中。
答案 1 :(得分:14)
所以似乎原因是全局属性PATH
导致了这个问题。转到Manage Jenkins
- > Configure System
并删除PATH
全局属性解决了我的问题。请参阅JENKINS-41339。
答案 2 :(得分:10)
为了解决此问题,如果您无法从“管理Jenkins - >配置系统”中删除PATH全局属性,则应添加以下步骤:
withEnv(['PATH+EXTRA=/usr/sbin:/usr/bin:/sbin:/bin'])
如下: for Scripted Pipeline:
node {
stage ('STAGE NAME') {
withEnv(['PATH+EXTRA=/usr/sbin:/usr/bin:/sbin:/bin']) {
sh '//code block'
}
}
}
或声明性管道:
pipeline {
agent {
label 'master'
}
stages {
stage ('STAGE NAME') {
steps {
withEnv(['PATH+EXTRA=/usr/sbin:/usr/bin:/sbin:/bin']) {
sh '''
//code block
'''
}
}
}
我希望这会有所帮助。我也为此寻找解决方案而苦苦挣扎。
答案 3 :(得分:2)
答案 4 :(得分:1)
Jenkins不知道sh
nohup: failed to run command `sh': No such file or directory
这意味着您的shell的可执行文件不在您的路径中。转到Manage Jenkins -> Configure System
向下滚动,直到找到标记为Shell
在调用sh时,添加要用于shell的可执行文件的路径。或者,确保sh的可执行文件的位置在Jenkins实例使用的路径中(取决于其他因素,可能与系统路径相同或不同)。
一些例子
在Windows上,您可能希望sh
表示powershell
*。您可以通过将shell路径设置为指向powershell来实现此目的。
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe
如果你在* nix上,Jenkins可能会默认使用已经定义的任何shell,就像Jenkins运行的用户一样,但你可以指定特定shell的路径,所以jenkins将始终使用该shell。例如,要始终以bash运行sh
,可以指定
/bin/bash
*鉴于Jenkins具有针对Windows批处理和powershell命令的特定构建步骤,我倾向于将Shell视为* nix样式shell。在Windows系统上,您需要安装某种shell仿真器,例如Cygwin。
答案 5 :(得分:1)
Jenkins处理环境变量时最友好,最简单的解决方案是使用Environment Injector Plugin
因此,要解决此问题,您只需执行以下操作:
PATH=/sbin:/usr/sbin:/usr/bin:/usr/local/bin:/bin
。答案 6 :(得分:1)
答案 7 :(得分:0)
避免此问题并且不删除└── superlists
├── manage.py
├── lists
│ ├── ...
└── superlists
处的全局PATH的另一种方法是以不同的方式指定Manage Jenkins -> Configure System
,显然,以下方法可以正常工作,并且可以在当前环境中附加PATH
PATH
但以下结果进入pipeline {
agent any
environment {
PATH = "/usr/local/bin:$PATH"
}
nohup: failed to run command sh': No such file or directory
答案 8 :(得分:0)
我尝试了以上所有方法...但是直到我将我的步骤[205]
包括在内时,Jenkins试图运行它正在Jenkins master上尝试的container()
文件时,由于某些原因,该方法才起作用如果我的.sh
已设置:
agent
全球ENV:
agent {
label "gen-java-slave"
}
工作阶段示例:
environment {
PATH = "/usr/local/openjdk-11/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
}