詹金斯不承认命令sh?

Jon*_*ong 15 groovy sh jenkins 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....'
    }
}
Run Code Online (Sandbox Code Playgroud)

但是在尝试构建时我不断收到此错误:

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
Run Code Online (Sandbox Code Playgroud)

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

XP8*_*P84 31

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中!

詹金斯项目显然不是仅修复那个错误,而是决定(1)检测条件并显示一个奇怪的警告("警告:JENKINS-41339可能是虚假的")暗示你应该检查那张票并且(2)创建一个全新的定义PATH添加的方法,这是解决问题的最佳方法,因为它允许您自定义$ PATH而不会破坏所有内容.您可以在Jenkins-> Configure System中执行此操作.

  • 定义一个名为PATH+EXTRAEXTRA显然可以是任何东西的变量.

  • 在该变量中,只需添加PATH.所以在我上面的例子中,我根本不会设置PATH,而是我只是设置: PATH+EXTRA=/opt/blah/bin

  • 现在删除任何定义的PATH变量.

根据相关的故障,这在Jenkins的某处记录,但在Manage Jenkins-> Configure System中没有记录在它需要的位置.

  • 这正是我所需要的,因为我无法在不破坏其他工作的情况下触摸配置系统中的路径。`PATH+EXTRA=/usr/local/bin` 有效! (2认同)

Jon*_*ong 16

所以似乎原因是全球财产PATH导致了这个问题.通过Manage Jenkins- > Configure System并删除PATH全局属性解决了我的问题.见JENKINS-41339.

  • 为我工作!谢谢。 (2认同)

Asg*_*ard 12

为了解决此问题,如果您无法从" 管理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'
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

或者用于声明性管道:

pipeline {
  agent {
    label 'master'
  }

  stages {
    stage ('STAGE NAME') {
      steps {
        withEnv(['PATH+EXTRA=/usr/sbin:/usr/bin:/sbin:/bin']) {  
          sh '''
            //code block
          '''
        }
      }
    }
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.我也为此寻找解决方案而苦苦挣扎.