Windows slave by ssh

203 views
Skip to first unread message

Jérôme Godbout

unread,
Aug 26, 2020, 3:37:59 PM8/26/20
to jenkins...@googlegroups.com

Hi,

I’m trying to access a Windows slave with SSH using Linux master Jenkins 2.235.5.

[08/26/20 15:24:48] [SSH] Checking java version of c:\JenkinsSlave/jdk/bin/java
Couldn't figure out the Java version of c:\JenkinsSlave/jdk/bin/java
The system cannot find the path specified.
 
[08/26/20 15:24:49] [SSH] Checking java version of C:\Program Files\Java\jdk1.8.0_161/bin/java
Couldn't figure out the Java version of C:\Program Files\Java\jdk1.8.0_161/bin/java
'C:\Program' is not recognized as an internal or external command,
operable program or batch file.

 

But when I try it from my other Windows Jenkins master 2.251 (my development server for testing purpose) it does connect without issue and find the proper java into the same path.

 

[08/21/20 13:48:50] [SSH] Starting agent process: cd "c:\JenkinsSlave" && "C:\Program Files\Java\jdk1.8.0_161\bin\java.exe"  -jar remoting.jar -workDir c:\JenkinsSlave -jar-cache c:\JenkinsSlave/remoting/jarCache

Aug 21, 2020 1:48:50 PM org.jenkinsci.remoting.engine.WorkDirManager initializeWorkDir

 

Seem like the c:\Program Files\Java… is not escaped properly under Linux master. How to fix that? How can I fix this?

Should I escape the env var JAVA_HOME and add quote into it? will it break something else?

 

I’m trying to move the slave execution from my development Windows laptop to our official Linux master.

 

Thanks,

Jerome

Slide

unread,
Aug 26, 2020, 4:23:16 PM8/26/20
to Jenkins User Mailing List
It looks like this code would need to be updated to handle when there are spaces:  https://github.com/jenkinsci/ssh-slaves-plugin/blob/master/src/main/java/hudson/plugins/sshslaves/JavaVersionChecker.java#L91. I have the reverse, a Windows controller and Linux agents. I specify the JAVA_HOME environment variable in my agent configuration and that works. Can you try that?



--
You received this message because you are subscribed to the Google Groups "Jenkins Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to jenkinsci-use...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/jenkinsci-users/YTOPR0101MB2315834EB1C8497CD210EEA4CD540%40YTOPR0101MB2315.CANPRD01.PROD.OUTLOOK.COM.


--

Jérôme Godbout

unread,
Aug 26, 2020, 4:51:34 PM8/26/20
to jenkins...@googlegroups.com

Well, that doesn’t really help to put quote into the JAVA_HOME variable either:

[08/26/20 16:48:23] [SSH] Checking java version of "C:\Program Files\Java\jdk1.8.0_161"/bin/java

Couldn't figure out the Java version of "C:\Program Files\Java\jdk1.8.0_161"/bin/java

'"C:\Program Files\Java\jdk1.8.0_161"' is not recognized as an internal or external command,

operable program or batch file.

 

I guess I will just install Java into a non space path, feel like the 90’ avoid all space in path for bad path handling… I hardly believe I’m the first one to install Java into default Program Files folder for this?! Anyway copy time to c:\Java

Mark Waite

unread,
Aug 26, 2020, 4:52:28 PM8/26/20
to Jenkins Users
I've preferred to install AdoptOpenJDK in a location that does not include spaces.  Oracle JDK licensing is more restrictive than I'm willing to accept and I want the latest Java 8 fixes.

Jérôme Godbout

unread,
Aug 26, 2020, 5:02:25 PM8/26/20
to jenkins...@googlegroups.com

WARNING, the following message contain strong opinion, if that do not suit you, stop reading now.

 

Don’t worry, I hate all Java equally... they fail the only promise they ever had, run everywhere… I hope this language rot in hell.

 

From: jenkins...@googlegroups.com <jenkins...@googlegroups.com> On Behalf Of Mark Waite
Sent: August 26, 2020 4:52 PM
To: Jenkins Users <jenkins...@googlegroups.com>
Subject: Re: Windows slave by ssh

 

I've preferred to install AdoptOpenJDK in a location that does not include spaces.  Oracle JDK licensing is more restrictive than I'm willing to accept and I want the latest Java 8 fixes.

Jérôme Godbout

unread,
Aug 26, 2020, 5:08:06 PM8/26/20
to jenkins...@googlegroups.com

Hi,

Reinstalling Java into a path like c:\Java work just fine now. Wonder why the Linux and the Windows master doesn’t show the same behavior on this? Is this code part only for *nix platform?

 

Anyway, thanks for the pointer,

Jerome

 


Sent: August 26, 2020 4:23 PM

To: Jenkins User Mailing List <jenkins...@googlegroups.com>
Subject: Re: Windows slave by ssh

 

It looks like this code would need to be updated to handle when there are spaces:  https://github.com/jenkinsci/ssh-slaves-plugin/blob/master/src/main/java/hudson/plugins/sshslaves/JavaVersionChecker.java#L91. I have the reverse, a Windows controller and Linux agents. I specify the JAVA_HOME environment variable in my agent configuration and that works. Can you try that?

 

 

Slide

unread,
Aug 26, 2020, 5:18:39 PM8/26/20
to Jenkins User Mailing List
Historically, Windows agents couldn't really be run using this plugin, it is only somewhat recently that Windows had good SSH support. So, there are probably some leftovers from the plugin only being used on *NIX systems. 



--

Jason Pyeron

unread,
Aug 26, 2020, 5:50:38 PM8/26/20
to jenkins...@googlegroups.com

Sorry to be a Johnny come lately – but we have only used SSH launch of windows for quite a long time now.

 

We use Cygwin to do so. You can use any SSH server though.

 

The most important thing is to ensure Java’s home has no spaces in the path.

 

The second most important thing is to use mixed pathing constructs. E.g. javaPath='C:/programs.x64/Java/jdk-14/bin/java note the forward slashes. It is a happy middle ground for bash and java.

 

Slide

unread,
Aug 26, 2020, 6:03:42 PM8/26/20
to Jenkins User Mailing List
Well, running on Cygwin is almost like running on a *NIX platform. Not exactly, but almost. I am referring to the OpenSSH-Win64 port that is now supported by MS. 



--

Jérôme Godbout

unread,
Aug 27, 2020, 9:22:50 AM8/27/20
to jenkins...@googlegroups.com

This is exactly what I’m using now, not more need for Cygwin for ssh (about time Microsoft 😉). Remove any space from the JAVA_HOME path solve the issue, but the default install path for Java is inside the Program Files folders, so by default it has a space. Not supporting spaces (and probably other character) is a bug. It’s not a big issue, but this should be fix. As for the \ or /, this should be handle by the  source code and perform the right conversion to node native format. In my script I always use *nix / path and convert them to native before running the actual command in a shell. I even made some Groovy pipeline functions to be platform agnostic as much as possible, the default implementation force us to put if(isUnix()) everywhere and it’s annoying. Having a function to manipulate the files and folders (create, remove, touch, move, rename) should be there by default for CI pipelines and be platform agnostic. This is pretty basic stuff.

 

This is where you realize Qt, C# and Python are way ahead into path manipulation.  Do a little as possible into Groovy-ish language and use Ansible or Python scripts to do the actual work lifting, made my life so much less painful.

Slide

unread,
Aug 27, 2020, 10:11:38 AM8/27/20
to Jenkins User Mailing List

Jérôme Godbout

unread,
Aug 27, 2020, 10:20:10 AM8/27/20
to jenkins...@googlegroups.com

Why only escape the command when it contains space, you could always do it, so other characters would also be properly escaped, the if is useless.

if(javaCommand.contains(" ")) {

 

            javaCommand = "\"" + javaCommand + "\"";

        }

Slide

unread,
Aug 27, 2020, 10:55:08 AM8/27/20
to Jenkins User Mailing List
Feel free to open your own PR then. I took the time to try and fix an immediate issue in the short amount of time I had to look at it. This should fix for the majority of people I believe, there will definitely be corner cases that can be addressed in the future.



--

jn...@cloudbees.com

unread,
Aug 27, 2020, 12:10:35 PM8/27/20
to Jenkins Users

Ivan Fernandez Calvo

unread,
Aug 27, 2020, 1:25:11 PM8/27/20
to Jenkins Users
I hate this class src/main/java/hudson/plugins/sshslaves/JavaVersionChecker.java I though to remove it and force configuring the Java path in the plugin or have Java in the PATH, it is a requirement to run the remoting process. The PR from Alex is a valid workaround meanwhile I think how to remove that class.
Reply all
Reply to author
Forward
0 new messages