Дженкинс не признает команду sh?

У меня много проблем, пытаясь заставить Jenkinsfile работать. Я пытался запустить этот тест script:

#!/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

Я обновил все плагины конвейера до последней версии и все еще сталкиваюсь с этой ошибкой. Любая помощь?

Ответ 1

Таким образом, кажется, причина в том, что глобальное свойство PATH вызывало проблему. Перейдя в Manage JenkinsConfigure System, и удаление глобального свойства PATH решило мою проблему. См. JENKINS-41339.

Ответ 2

Ответ Джонатана верен в том, что изменение $ PATH с использованием параметров переменной среды Jenkins вызывает эту проблему - но простое удаление настроек PATH, которые у вас есть, может привести к потере функциональности, особенно если у вас есть проекты типа Freestyle в вашем Jenkins.

Видите ли, во всей остальной части юниверса очень часто редактируют $ 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.

Согласно соответствующей заявке, это задокументировано где-то в Jenkins, но не задокументировано в том месте, где оно должно быть, в Manage Jenkins-> Configure System.

Ответ 3

Чтобы устранить эту проблему, в случае, если вы не можете удалить глобальное свойство PATH из " Manage Jenkins → Configure System ", вы должны добавить следующий шаг:

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

Надеюсь, это поможет. Я также изо всех сил пытался найти решение для этого.

Ответ 4

Дженкинс не знает, что вы подразумеваете под sh

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

Это означает, что исполняемый файл для вашей оболочки не находится на вашем пути. Перейдите в Manage Jenkins -> Configure System, прокрутите страницу вниз до тех пор, пока не найдете раздел с надписью Shell

пустой путь оболочки в Jenkins

Добавьте путь к исполняемому файлу, который вы хотите использовать для своей оболочки, когда вы вызываете sh. В качестве альтернативы убедитесь, что место для исполняемого файла для sh находится в пути, используемом вашим экземпляром Jenkins (который в зависимости от других факторов может или не может совпадать с системным путем).

Некоторые примеры

В окнах вам может понадобиться sh значение powershell *. Вы сделали бы это, установив путь оболочки в точку PowerShell.

 C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

Если вы находитесь на * nix, Jenkins, вероятно, по умолчанию будет использовать любую оболочку sh, которая уже определена как для пользователя Jenkins, но вы можете указать путь к конкретной оболочке, поэтому jenkins всегда будут использовать эту оболочку. Например, чтобы всегда запускать sh как bash, можно указать

/bin/bash

* Учитывая, что у Jenkins есть конкретные шаги сборки для команд пакетной и командной строки Windows, я склонен думать о Shell как о оболочке стиля * nix. В системе Windows вам нужно будет установить какой-то эмулятор оболочки, такой как Cygwin.

Ответ 5

Другой способ избежать этой проблемы, а также не удалять глобальный 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

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

Ответ 6

Наиболее дружественное и простое решение Дженкинса при работе с переменными среды - использовать плагин инжектора среды

поэтому, чтобы решить эту проблему, вам нужно сделать следующее:

  1. Установите плагин инжектора среды
  2. Откройте конвейер и включите Подготовьте среду для флажка запуска и добавьте PATH=/sbin:/usr/sbin:/usr/bin:/usr/local/bin:/bin в текстовое поле Свойства содержимого.