Uploaded image for project: 'Jenkins'
  1. Jenkins
  2. JENKINS-61975

Powershell command was not found on a different OS slave machine

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: Major Major
    • powershell-plugin
    • # Master Slave
      - OS: Windows10
      - Jenkins: org.jenkins-ci.main:jenkins-war:2.222.1
      - Powershell plugin: 1.4

      # Slave
      - OS: macOS Catalina
      - pwsh: PowerShell 7.0.0
      - PATH: /usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin

      When I tried to use powershell-plugin on each slave machines(Win and Mac) from Win master machine, just MacOS slave machine had an error because no such found `pwsh` command.

      Here's the error log details.

      [test] $ pwsh -NonInteractive -File /var/folders/7s/624v46091sdgcf0b1qt98v6hz4r8lc/T/jenkins7665436840857556803.ps1
      FATAL: コマンドの実行に失敗しました
      java.io.IOException: error=2, No such file or directory
      	at java.lang.UNIXProcess.forkAndExec(Native Method)
      	at java.lang.UNIXProcess.<init>(UNIXProcess.java:247)
      	at java.lang.ProcessImpl.start(ProcessImpl.java:134)
      	at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
      Also:   hudson.remoting.Channel$CallSiteStackTrace: Remote call to mac
      		at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1788)
      		at hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:356)
      		at hudson.remoting.Channel.call(Channel.java:998)
      		at hudson.Launcher$RemoteLauncher.launch(Launcher.java:1057)
      		at hudson.Launcher$ProcStarter.start(Launcher.java:454)
      		at hudson.tasks.CommandInterpreter.perform(CommandInterpreter.java:109)
      		at hudson.tasks.CommandInterpreter.perform(CommandInterpreter.java:66)
      		at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
      		at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:741)
      		at hudson.model.Build$BuildExecution.build(Build.java:206)
      		at hudson.model.Build$BuildExecution.doRun(Build.java:163)
      		at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:504)
      		at hudson.model.Run.execute(Run.java:1856)
      		at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
      		at hudson.model.ResourceController.execute(ResourceController.java:97)
      		at hudson.model.Executor.run(Executor.java:428)
      Caused: java.io.IOException: Cannot run program "pwsh" (in directory "/Users/****/workspace/test"): error=2, No such file or directory
      	at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)
      	at hudson.Proc$LocalProc.<init>(Proc.java:252)
      	at hudson.Proc$LocalProc.<init>(Proc.java:221)
      	at hudson.Launcher$LocalLauncher.launch(Launcher.java:936)
      	at hudson.Launcher$ProcStarter.start(Launcher.java:454)
      	at hudson.Launcher$RemoteLaunchCallable.call(Launcher.java:1316)
      	at hudson.Launcher$RemoteLaunchCallable.call(Launcher.java:1269)
      	at hudson.remoting.UserRequest.perform(UserRequest.java:211)
      	at hudson.remoting.UserRequest.perform(UserRequest.java:54)
      	at hudson.remoting.Request$2.run(Request.java:369)
      	at hudson.remoting.InterceptingExecutorService$1.call(InterceptingExecutorService.java:72)
      	at java.util.concurrent.FutureTask.run(FutureTask.java:266)
      	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
      	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
      	at java.lang.Thread.run(Thread.java:748)
      Build step 'PowerShell' marked build as failure
      Finished: FAILURE
      

       

          [JENKINS-61975] Powershell command was not found on a different OS slave machine

          Rajesh Shinde added a comment -

          I am also facing the same issue. My Jenkin Master is linux and slave is Windows Server 2012

          Rajesh Shinde added a comment - I am also facing the same issue. My Jenkin Master is linux and slave is Windows Server 2012

          I ran into similar issue and it was struggling to run "pwsh" on mac slave. I think iti s related to "PATH" environment variable.  "pwsh" was installed into "/usr/local/bin" but the "PATH" had only "/usr/bin:/bin:/usr/sbin:/sbin:" You can try to run a build step e.g. 
          sh "/usr/local/bin/pwsh -Command \"Get-Host | Select-Object Version\""
          just to make sure you can run powershell using the full path to the executable. I ended up with modifying slave configuration to have PATH variable have "/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin". Note that thier fancy syntax PATH+EXTRA did not work so I just added PATH with all paths I needed.

          Konstantin Kutsner added a comment - I ran into similar issue and it was struggling to run "pwsh" on mac slave. I think iti s related to "PATH" environment variable.  "pwsh" was installed into "/usr/local/bin" but the "PATH" had only "/usr/bin:/bin:/usr/sbin:/sbin:" You can try to run a build step e.g.  sh "/usr/local/bin/pwsh -Command \"Get-Host | Select-Object Version\"" just to make sure you can run powershell using the full path to the executable. I ended up with modifying slave configuration to have PATH variable have "/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin". Note that thier fancy syntax PATH+EXTRA did not work so I just added PATH with all paths I needed.

          Francesco Pretto added a comment - - edited

          This is not an issue only when using jenkins in a slave machine. In my master machine I have the same exact issue and the problem is clearly that the PATH variable doesn't include /usr/local/bin directory for the spawned daemon that run jenkins. Setting PATH+EXTRA as kkutsner mentioned can't be a solution because the environment variable is modified too late and that settings doesn't influence resolving of shells location.

          If installed jenkins with homebrew, one workaround is to edit ~/Library/LaunchAgents/homebrew.mxcl.jenkins-lts.plist to specify a full list of paths like the following:

          <?xml version="1.0" encoding="UTF-8"?>
          <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
          <plist version="1.0">
            <dict>
              <key>EnvironmentVariables</key>
              <dict>
                 <key>PATH</key>
                 <string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string>
              </dict>
              <key>Label</key>
              <string>homebrew.mxcl.jenkins-lts</string>
              <key>ProgramArguments</key>
              <array>
                <string>/usr/libexec/java_home</string>
                <string>-v</string>
                <string>1.8</string>
                <string>--exec</string>
                <string>java</string>
                <string>-Dmail.smtp.starttls.enable=true</string>
                <string>-jar</string>
                <string>/usr/local/opt/jenkins-lts/libexec/jenkins.war</string>
                <string>--httpListenAddress=127.0.0.1</string>
                <string>--httpPort=8080</string>
              </array>
              <key>RunAtLoad</key>
              <true/>
            </dict>
          </plist>
          

          Then you can restart the service or the machine.

          The pipeline plugin could indeed also be improved so it attempts to resolve location fo pwsh with more fallbacks. For example it could (on unix platforms) try to find with this order:
          1) Result of /usr/bin/env pwsh
          2) Result of which pwsh
          3) Direct path /usr/local/bin/pwsh if existing
          4) Direct path /usr/bin/pwsh if existing

          Of course the result can be cached so this resolution is not repeated everytime a pwsh directive is used.

          Francesco Pretto added a comment - - edited This is not an issue only when using jenkins in a slave machine. In my master machine I have the same exact issue and the problem is clearly that the PATH variable doesn't include /usr/local/bin directory for the spawned daemon that run jenkins. Setting PATH+EXTRA as kkutsner mentioned can't be a solution because the environment variable is modified too late and that settings doesn't influence resolving of shells location. If installed jenkins with homebrew, one workaround is to edit ~/Library/LaunchAgents/homebrew.mxcl.jenkins-lts.plist to specify a full list of paths like the following: <?xml version= "1.0" encoding= "UTF-8" ?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd" > <plist version= "1.0" > <dict> <key> EnvironmentVariables </key> <dict> <key> PATH </key> <string> /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin </string> </dict> <key> Label </key> <string> homebrew.mxcl.jenkins-lts </string> <key> ProgramArguments </key> <array> <string> /usr/libexec/java_home </string> <string> -v </string> <string> 1.8 </string> <string> --exec </string> <string> java </string> <string> -Dmail.smtp.starttls.enable=true </string> <string> -jar </string> <string> /usr/local/opt/jenkins-lts/libexec/jenkins.war </string> <string> --httpListenAddress=127.0.0.1 </string> <string> --httpPort=8080 </string> </array> <key> RunAtLoad </key> <true/> </dict> </plist> Then you can restart the service or the machine. The pipeline plugin could indeed also be improved so it attempts to resolve location fo pwsh with more fallbacks. For example it could (on unix platforms) try to find with this order: 1) Result of /usr/bin/env pwsh 2) Result of which pwsh 3) Direct path /usr/local/bin/pwsh if existing 4) Direct path /usr/bin/pwsh if existing Of course the result can be cached so this resolution is not repeated everytime a pwsh directive is used.

          Francesco Pretto added a comment - - edited

          It's 2024, and the issue hit me again on MacOs slaves, so I'm the identical situation of the original poster but with a more recent version of Jenkins installed in the master (2.426.3). The issue again is with the setting of the PATH variable, which is early set within a non-interactive login in the slave machine and not altered to include the /usr/locan/bin path where pwsh resides, as it can be seen in the following log:

          SSHLauncher{host='host', port=9513, credentialsId='mac_agent', jvmOptions='', javaPath='', prefixStartSlaveCmd=' ', suffixStartSlaveCmd='', launchTimeoutSeconds=60, maxNumRetries=10, retryWaitTime=15, sshHostKeyVerificationStrategy=hudson.plugins.sshslaves.verifiers.ManuallyTrustedKeyVerificationStrategy, tcpNoDelay=true, trackCredentials=true}
          [02/14/24 09:37:03] [SSH] Opening SSH connection to host:9513.
          ...
          PATH=/usr/bin:/bin:/usr/sbin:/sbin

          A clean workaround is setting the Prefix Start agent Command to something that will alter PATH, like the following:

          export PATH="/usr/local/bin:$PATH" &&

          similarly to what described in the troubleshooting guide for ssh agents, so that in the end the agent will be started with the correct environment and a line like the following one will appear in the log then the agent is starting:

          [02/14/24 09:37:06] [SSH] Starting agent process: export PATH=/usr/local/bin:${PATH} && cd "/Users/user/remoting" && java -jar remoting.jar -workDir /Users/user/remoting -jar-cache /Users/euronovate/remoting/jarCache

          The issue has been open for a long time, and the problem is clearly present, even if it affects only the few people that uses Jenkins on Macos and powershell for scripting. A solution in Jenkins may explore why pipeline pwsh directives can't use PATH+EXTRA configuration, or fix it straightly by hardcoding more search paths for pwsh in Unix operating systems.

           

          Francesco Pretto added a comment - - edited It's 2024, and the issue hit me again on MacOs slaves, so I'm the identical situation of the original poster but with a more recent version of Jenkins installed in the master (2.426.3). The issue again is with the setting of the PATH variable, which is early set within a non-interactive login in the slave machine and not altered to include the /usr/locan/bin path where pwsh resides, as it can be seen in the following log: SSHLauncher{host= 'host' , port=9513, credentialsId= 'mac_agent' , jvmOptions= '', javaPath=' ', prefixStartSlaveCmd=' ', suffixStartSlaveCmd=' ', launchTimeoutSeconds=60, maxNumRetries=10, retryWaitTime=15, sshHostKeyVerificationStrategy=hudson.plugins.sshslaves.verifiers.ManuallyTrustedKeyVerificationStrategy, tcpNoDelay= true , trackCredentials= true } [02/14/24 09:37:03] [SSH] Opening SSH connection to host:9513. ... PATH=/usr/bin:/bin:/usr/sbin:/sbin A clean workaround is setting the Prefix Start agent Command to something that will alter PATH, like the following: export PATH= "/usr/local/bin:$PATH" && similarly to what described in the troubleshooting guide for ssh agents, so that in the end the agent will be started with the correct environment and a line like the following one will appear in the log then the agent is starting: [02/14/24 09:37:06] [SSH] Starting agent process: export PATH=/usr/local/bin:${PATH} && cd "/Users/user/remoting" && java -jar remoting.jar -workDir /Users/user/remoting -jar-cache /Users/euronovate/remoting/jarCache The issue has been open for a long time, and the problem is clearly present, even if it affects only the few people that uses Jenkins on Macos and powershell for scripting. A solution in Jenkins may explore why pipeline pwsh directives can't use PATH+EXTRA configuration, or fix it straightly by hardcoding more search paths for pwsh in Unix operating systems.  

            Unassigned Unassigned
            tanishi Shintaro Tanikawa
            Votes:
            1 Vote for this issue
            Watchers:
            4 Start watching this issue

              Created:
              Updated: