Дженкинс не распознает команду "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
добавьте путь к исполняемому файлу, который вы хотите использовать для своей оболочки при вызове 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.