Ответ 1
Таким образом, кажется, причина в том, что глобальное свойство PATH
вызывало проблему. Перейдя в Manage Jenkins
→ Configure System
, и удаление глобального свойства PATH
решило мою проблему. См. JENKINS-41339.
У меня много проблем, пытаясь заставить 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
Я обновил все плагины конвейера до последней версии и все еще сталкиваюсь с этой ошибкой. Любая помощь?
Таким образом, кажется, причина в том, что глобальное свойство PATH
вызывало проблему. Перейдя в Manage Jenkins
→ Configure System
, и удаление глобального свойства PATH
решило мою проблему. См. JENKINS-41339.
Ответ Джонатана верен в том, что изменение $ 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.
Чтобы устранить эту проблему, в случае, если вы не можете удалить глобальное свойство 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
'''
}
}
}
Надеюсь, это поможет. Я также изо всех сил пытался найти решение для этого.
Дженкинс не знает, что вы подразумеваете под sh
nohup: failed to run command `sh': No such file or directory
Это означает, что исполняемый файл для вашей оболочки не находится на вашем пути. Перейдите в Manage Jenkins -> Configure System
, прокрутите страницу вниз до тех пор, пока не найдете раздел с надписью Shell
Добавьте путь к исполняемому файлу, который вы хотите использовать для своей оболочки, когда вы вызываете 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.
Другой способ избежать этой проблемы, а также не удалять глобальный 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}"
}
Наиболее дружественное и простое решение Дженкинса при работе с переменными среды - использовать плагин инжектора среды
поэтому, чтобы решить эту проблему, вам нужно сделать следующее:
PATH=/sbin:/usr/sbin:/usr/bin:/usr/local/bin:/bin
в текстовое поле Свойства содержимого.