Jenkins does not recognize command sh?
Jonathan's answer is correct in that modifying $PATH using the Jenkins Environment Variable settings causes this problem - but just deleting the PATH customizations you have will likely cause you to lose functionality, especially if you have any Freestyle type projects in your Jenkins.
See, in the entire rest of the universe it's very common to edit the $PATH by setting it to your new thing plus the existing $PATH, like this:
PATH=/opt/blah/bin:$PATH
This prepends /opt/blah/bin
to what's already in $PATH
. So the final $PATH
might look like: /opt/blah/bin:/usr/local/bin:/usr/sbin:/bin
(this is just an example of course)
This actually works fine for Jenkins Freestyle projects. However, for Pipeline projects Jenkins for some reason does not actually evaluate and replace the $PATH variable in the variable you've set. So you literally end up with a path of /opt/blah/bin:$PATH
- so nothing that was there before is still in your $PATH!
Apparently instead of just fixing that bug, Jenkins project decided to (1) detect the condition and display a weird warning ("Warning: JENKINS-41339 probably bogus") to imply you should check out that ticket and (2) create a brand new way of defining additions to PATH, which is the best solution to your problem because it allows you to customize the $PATH without breaking everything. You do this in Jenkins->Configure System.
Define a variable called
PATH+EXTRA
where EXTRA can apparently be whatever.In that variable, just put your additions for the PATH. So in my example above, I would NOT set
PATH
at all, rather I'd just set:PATH+EXTRA=/opt/blah/bin
Now remove any defined
PATH
variable.
According to a related ticket, this is documented somewhere in Jenkins, but is not documented in the place it needs to be, in Manage Jenkins->Configure System.
@XP84's solution worked for me. I was getting issue with running python3
on a Mac Jenkins, I added this to environment variable and it started working. Here's a screenshot if anyone was like me and was having trouble inputting the actual values in respective fields.
So it seems the reason was that the global property PATH
was causing the issue. By going to Manage Jenkins
-> Configure System
and deleting the PATH
global property solved my issue. See JENKINS-41339.
In order to fix this issue, in case that you can't delete the PATH global property from "Manage Jenkins -> Configure System", you should add the following step:
withEnv(['PATH+EXTRA=/usr/sbin:/usr/bin:/sbin:/bin'])
Like following: for Scripted Pipeline:
node {
stage ('STAGE NAME') {
withEnv(['PATH+EXTRA=/usr/sbin:/usr/bin:/sbin:/bin']) {
sh '//code block'
}
}
}
or for Declarative Pipeline:
pipeline {
agent {
label 'master'
}
stages {
stage ('STAGE NAME') {
steps {
withEnv(['PATH+EXTRA=/usr/sbin:/usr/bin:/sbin:/bin']) {
sh '''
//code block
'''
}
}
}
I hope this helps. I also struggled a lot to find a solution for this.