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

у меня было много проблем, пытаясь заставить 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

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

4 ответов


таким образом, кажется, причина заключалась в том, что глобальное свойство PATH был причиной проблемы. Перейдя к Manage Jenkins ->Configure System и удалить PATH global property решил мою проблему. См.Дженкинс-41339.


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

см., во всей остальной Вселенной очень часто редактировать $PATH, установив его на новую вещь плюс существующий $PATH, например это:

PATH=/opt/blah/bin:$PATH

это добавляет /opt/blah/bin к тому, что уже в $PATH. Итак, финал $PATH может выглядеть так: /opt/blah/bin:/usr/local/bin:/usr/sbin:/bin (это только пример, конечно)

это на самом деле отлично работает для проектов Дженкинса фристайла. Однако для конвейерных проектов Дженкинс по какой-то причине фактически не оценивает и не заменяет переменную $PATH в заданной вами переменной. Таким образом, вы буквально заканчиваете путь /opt/blah/bin:$PATH - так что ничего, что было там раньше, нет все еще в вашем $PATH!

по-видимому, вместо того, чтобы просто исправить эту ошибку, проект Дженкинса решил (1) обнаружить условие и отобразить странное предупреждение ("предупреждение: Дженкинс-41339, вероятно, фиктивный"), чтобы подразумевать, что вы должны проверить этот билет и (2) создать совершенно новый способ определения дополнений к пути, который является лучшим решением вашей проблемы, потому что он позволяет настроить $PATH, не нарушая все. Вы делаете это в Jenkins->настроить Система.

  • определите переменную с именем PATH+EXTRA где Экстра, по-видимому, может быть что угодно.

  • в этой переменной просто поместите свои дополнения для пути. Поэтому в моем примере выше я бы не установил PATH вообще, лучше бы я просто установил: PATH+EXTRA=/opt/blah/bin

  • теперь удалите все определенные PATH переменной.

по словам связанные билета, это задокументировано где-то в Дженкинс, но не документирован в том месте, где он должен быть, в управлении Дженкинсом->настроить систему.


чтобы устранить эту проблему, в случае, если вы не можете удалить глобальное свойство PATH из" Управление Jenkins - > Настройка Системы" вы должны добавить следующий шаг:

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

надеюсь, это поможет. Я боролся много, чтобы найти решение для этого.


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

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

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

empty shell path in Jenkins

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

примеры

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

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

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

/bin/bash

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