詹金斯不承认命令sh?

时间:2017-05-15 19:04:40

标签: jenkins groovy sh jenkins-pipeline

我在尝试让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

我将所有管道插件更新到最新版本,但仍然遇到此错误。有什么帮助吗?

9 个答案:

答案 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)

我是这样做的。

  1. 从Jenkins环境变量中删除路径变量。

enter image description here

  1. 在我的步骤中添加了“ withEnv(['PATH + EXTRA = / opt / flutter / bin'])”。

enter image description here

答案 4 :(得分:1)

Jenkins不知道sh

的意思
nohup: failed to run command `sh': No such file or directory

这意味着您的shell的可执行文件不在您的路径中。转到Manage Jenkins -> Configure System向下滚动,直到找到标记为Shell

的部分

empty shell path in Jenkins

在调用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

因此,要解决此问题,您只需执行以下操作:

  1. 安装环境注入器插件
  2. 打开管道并启用为运行准备环境复选框,然后在属性内容文本框中添加PATH=/sbin:/usr/sbin:/usr/bin:/usr/local/bin:/bin

答案 6 :(得分:1)

@ XP84的解决方案对我有用。我在Mac Jenkins上运行python3时遇到问题,将其添加到环境变量中并开始工作。如果有人像我一样,并且在各个字段中输入实际值时遇到问题,请使用以下屏幕截图。

enter image description here

答案 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"

}