【问题标题】:Jenkins does not recognize command sh?Jenkins 不识别命令 sh?
【发布时间】:2017-05-15 19:04:39
【问题描述】:

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

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

【问题讨论】:

  • 注意警告;你显然对PATH 做了什么,所以詹金斯不知道去哪里找sh
  • 是的,我最后意识到了这一点。我猜更新时发生了一些事情,因为PATH 从未被触及。删除它修复它。
  • >删除它修复了它。这里的是什么?

标签: jenkins groovy sh jenkins-pipeline


【解决方案1】:

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 项目。但是,对于流水线项目,Jenkins 出于某种原因实际上并没有评估和替换您设置的变量中的 $PATH 变量。所以你最终得到了/opt/blah/bin:$PATH 的路径——所以之前的任何东西都不会在你的 $PATH 中!

显然,Jenkins 项目不只是修复该错误,而是决定 (1) 检测情况并显示一个奇怪的警告(“警告:JENKINS-41339 可能是伪造的”),暗示您应该检查该票并 (2) 创建一种定义 PATH 附加项的全新方法,这是解决您的问题的最佳方法,因为它允许您自定义 $PATH 而不会破坏所有内容。您可以在 Jenkins-> 配置系统中执行此操作。

  • 定义一个名为 PATH+EXTRA 的变量,其中 EXTRA 显然可以是任何值。

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

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

根据related ticket,这记录在 Jenkins 的某个地方,但没有记录在它需要的地方,在管理 Jenkins->配置系统中。

【讨论】:

  • 正是我所需要的,因为我无法在配置系统中触摸 PATH 而不会破坏其他工作。 PATH+EXTRA=/usr/local/bin 工作!
【解决方案2】:

所以看起来原因是全局属性PATH 导致了这个问题。通过转到 Manage Jenkins -> Configure System 并删除 PATH 全局属性解决了我的问题。见JENKINS-41339

【讨论】:

  • 为我工作!谢谢。
  • 救世主.... !!!
【解决方案3】:

为了解决这个问题,如果您无法从“Manage Jenkins -> Configure System”中删除 PATH 全局属性,您应该添加以下步骤:

withEnv(['PATH+EXTRA=/usr/sbin:/usr/bin:/sbin:/bin'])

如下: 对于脚本化管道:

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
          '''
        }
      }
    }

我希望这会有所帮助。我也费了很大劲才找到解决办法。

【讨论】:

  • 我认为这将是一个不错的解决方案,您还可以通过将PATH+EXTRA=/usr... 放在顶部的变量中并引用它来使其更具可重用性。哦,补充一点,这个解决方案对我不起作用:(我只是得到同样的错误:/
【解决方案4】:

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 可能会默认使用已为 Jenkins 正在运行的用户定义的任何 shell sh,但您可以指定特定 shell 的路径,因此 jenkins 将始终使用该 shell。例如,始终以 bash 的方式运行 sh 可以指定

/bin/bash

*鉴于 Jenkins 具有针对 windows 批处理和 powershell 命令的特定构建步骤,我倾向于将 Shell 专门视为 *nix 样式的 shell。在 Windows 系统上,您需要安装某种 shell 模拟器,例如 Cygwin。

【讨论】:

  • 有放什么的例子吗?对不起,我对此有点陌生,我没有设置詹金斯。在插件更新之前它也可以工作,更新的插件会改变什么吗?
  • @JonathanWong 它应该是您系统上 shell 可执行文件的位置。这将特定于您系统上安装的内容以及您想要使用的内容。在 Windows 上,您可能希望 sh 表示 powershell。您可以设置 powershell exe 的路径:C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe 如果您在 linux 上,Jenkins 可能会默认使用为运行 Jenkins 的用户定义的任何 sh。我认为 Shell 是一个 *nix shell,所以在 Windows 系统上,您必须为 Windows(例如 Cygwin)找到这样的 shell 并指向它。
  • 我尝试输入/bin/bash,它似乎可以识别它,因为在进行配置时没有弹出错误。尝试运行脚本时,它仍然产生相同的 no such directory 错误。
  • 谢谢。对我来说,我只需要将它指向我已经安装在我的机器上的 Git bash 的“sh”。所以在我的例子中:“C:\Program Files\Git\bin\sh.exe”
【解决方案5】:

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

【讨论】:

    【解决方案6】:

    避免此问题且不删除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

    pipeline {
    agent any
    environment {
      PATH = "/usr/local/bin:${env.PATH}"
    }
    

    【讨论】:

      【解决方案7】:

      Jenkins在处理环境变量时最友好最简单的解决方案是使用Environment Injector Plugin

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

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

      【讨论】:

        【解决方案8】:

        就我而言,我这样做了。

        1. 从 Jenkins 环境变量中移除 Path 变量。

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

        【讨论】:

          【解决方案9】:

          我尝试了以上所有方法...但是直到我在我的步骤container() 中包含了一些原因,当 Jenkins 尝试运行它正在尝试在 Jenkins 主服务器上的 .sh 文件时才起作用,即使我的 @987654323 @ 已设置:

          agent {
              label "gen-java-slave"
          }
          

          全球环境:

          environment {
                  PATH = "/usr/local/openjdk-11/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
          
          }
          

          工作阶段示例:

                      stage('Create a Dump for Senapt Arango DB') {
          
                          steps {
                          container('general-container-name') {
                          withEnv(['PATH+EXTRA=/usr/bin/arangodump']) {  
                          sh '''
                              ./backup-arango-senapt.sh
                          '''
                          }
                          }
                          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-11-27
            • 1970-01-01
            • 1970-01-01
            • 2021-03-06
            • 1970-01-01
            • 1970-01-01
            • 2020-08-18
            相关资源
            最近更新 更多