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

Quoting Issue with JDK Installer with Windows Slave

    • Icon: Bug Bug
    • Resolution: Fixed
    • Icon: Major Major
    • core
    • Hudson 1.342 on Windows XP Master w/ Windows XP Slaves

      When installing a new JDK on a windows slave, there appears to be a quoting issue with the arguments passed to the installer. From the console output:

      [jdk-1.6.0_17] $ C:\hudson-tmp\tools\jdk-1.6.0_17\jdk.exe /s '/v/qn REBOOT=Suppress INSTALLDIR=\"C:\hudson-tmp\tools\jdk-1.6.0_17\" /L \"C:\hudson-tmp\tools\jdk-1.6.0_17\jdk.exe.install.log\"'

      Notice how the /s is outside of the single quotes where the rest of the options are (/v/qn ...). Comments in the WINDOWS case of JDKInstaller.java#install seem to indicate that the options to the installer should be passed as one string. However, the code adds two strings - one for /s and another for the rest of the options.

      The result is that the jdk fails to install. However, executing C:\hudson-tmp\tools\jdk-1.6.0_17\jdk.exe /s /v/qn REBOOT=Suppress INSTALLDIR=\"C:\hudson-tmp\tools\jdk-1.6.0_17\" /L \"C:\hudson-tmp\tools\jdk-1.6.0_17\jdk.exe.install.log\" on a command prompt successfully installs the JDK.

          [JENKINS-5408] Quoting Issue with JDK Installer with Windows Slave

          calculu5 created issue -

          This weird quoting rules are as illustrated in http://java.sun.com/j2se/1.5.0/sdksilent.html

          In your syntax, you have the double-quote escaped — is that intended or is it a mistake?

          Kohsuke Kawaguchi added a comment - This weird quoting rules are as illustrated in http://java.sun.com/j2se/1.5.0/sdksilent.html In your syntax, you have the double-quote escaped — is that intended or is it a mistake?

          ashlux added a comment - - edited

          I have the same issue. When I run the command shown in the hudson console log I get a "Windows Installer" dialog that pops up showing the syntax. The command Hudson is executing:

          c:/hudson-slave/tools/JDK_6_Update_21/jdk.exe /s '/v/qn REBOOT=Suppress INSTALLDIR=\"c:\hudson-slave\tools\JDK_6_Update_21\" /L \"c:/hudson-slave/tools/JDK_6_Update_21/jdk.exe.install.log\"'

          When I remove the single quotes it goes away however nothing happens:

          c:/hudson-slave/tools/JDK_6_Update_21/jdk.exe /s /v/qn REBOOT=Suppress INSTALLDIR=\"c:\hudson-slave\tools\JDK_6_Update_21\" /L \"c:/hudson-slave/tools/JDK_6_Update_21/jdk.exe.install.log\"

          I added "cmd /w" as the document kohsuke linked and it still does nothing:

          cmd /w c:/hudson-slave/tools/JDK_6_Update_21/jdk.exe /s '/v/qn REBOOT=Suppress INSTALLDIR=\"c:\hudson-slave\tools\JDK_6_Update_21\" /L \"c:/hudson-slave/tools/JDK_6_Update_21/jdk.exe.install.log\"'

          As a workaround, I setup a JDK just for the windows slave and installed the JDK manually. This isn't going to work for everyone but it'll work for my purposes.

          I also tried JDK 6 Update 20 and Update 10 and got the same results. Also Hudson 1.367 and 1.365. For what it matters, Windows 2003 Server .

          ashlux added a comment - - edited I have the same issue. When I run the command shown in the hudson console log I get a "Windows Installer" dialog that pops up showing the syntax. The command Hudson is executing: c:/hudson-slave/tools/JDK_6_Update_21/jdk.exe /s '/v/qn REBOOT=Suppress INSTALLDIR=\"c:\hudson-slave\tools\JDK_6_Update_21\" /L \"c:/hudson-slave/tools/JDK_6_Update_21/jdk.exe.install.log\"' When I remove the single quotes it goes away however nothing happens: c:/hudson-slave/tools/JDK_6_Update_21/jdk.exe /s /v/qn REBOOT=Suppress INSTALLDIR=\"c:\hudson-slave\tools\JDK_6_Update_21\" /L \"c:/hudson-slave/tools/JDK_6_Update_21/jdk.exe.install.log\" I added "cmd /w" as the document kohsuke linked and it still does nothing: cmd /w c:/hudson-slave/tools/JDK_6_Update_21/jdk.exe /s '/v/qn REBOOT=Suppress INSTALLDIR=\"c:\hudson-slave\tools\JDK_6_Update_21\" /L \"c:/hudson-slave/tools/JDK_6_Update_21/jdk.exe.install.log\"' As a workaround, I setup a JDK just for the windows slave and installed the JDK manually. This isn't going to work for everyone but it'll work for my purposes. I also tried JDK 6 Update 20 and Update 10 and got the same results. Also Hudson 1.367 and 1.365. For what it matters, Windows 2003 Server .

          calculu5 added a comment -

          The escaped double-quotes is intended. The quoting of the double-quotes is a verbatim copy of what appears in the "Console Output" for a particular build number.

          calculu5 added a comment - The escaped double-quotes is intended. The quoting of the double-quotes is a verbatim copy of what appears in the "Console Output" for a particular build number.

          Jerry Qassar added a comment - - edited

          Mr. Kawaguchi:

          This problem is also occurring with JDK 7_06 (configuration: Latest Jenkins, Solaris master, Windows 7 32-bit slave). An example from console output for our build is as follows:

          c:\jenkins\tools\JDK\jdk-1.7.0_06\jdk.exe /s /v /qn /L \"c:\jenkins\tools\JDK\jdk-1.7.0_06\jdk.exe.install.log\" REBOOT=ReallySuppress INSTALLDIR=\"c:\jenkins\tools\JDK\jdk-1.7.0_06\" results in an msiexec dialog (which means a hung installation).

          Testing indicates that the INSTALLDIR property is the property which is considered invalid. By removing the escapes on the quotes and executing

          c:\jenkins\tools\JDK\jdk-1.7.0_06\jdk.exe /s /v /qn /L \"c:\jenkins\tools\JDK\jdk-1.7.0_06\jdk.exe.install.log\" REBOOT=ReallySuppress INSTALLDIR="c:\jenkins\tools\JDK\jdk-1.7.0_06"

          The install completes successfully and we can continue with the build process.

          (EDIT: I don't think this syntax is exactly correct, either, as I still ended up with an msiexec process hanging. /v and /qn should no longer be necessary either, and you should be able to do this entirely with:

          c:\jenkins\tools\JDK\jdk-1.7.0_06\jdk.exe /s /L "c:\jenkins\tools\JDK\jdk-1.7.0_06\jdk.exe.install.log" REBOOT=ReallySuppress INSTALLDIR="c:\jenkins\tools\JDK\jdk-1.7.0_06"

          with a potential setting of ADDLOCAL for just the source course and other necessary features.)

          The quote escape method used in the original comment, and the spec you mention, are relics from the very old versions of msiexec that were pushed out when JDK 1.5 was new. If you look at the new installers and the pages regarding their use, you can see that a) many of the options are no longer necessary and b) quote escaping for the setting of INSTALLDIR has not been needed for a very long time. It may still be needed for the /L parameter because of the possibility of spaces in your path, but I actually think the quotes are enough now.

          In any case, it seems like the single quotes have been removed from the installer call, but not the escapes. Without one, you really shouldn't need the other.

          Jerry Qassar added a comment - - edited Mr. Kawaguchi: This problem is also occurring with JDK 7_06 (configuration: Latest Jenkins, Solaris master, Windows 7 32-bit slave). An example from console output for our build is as follows: c:\jenkins\tools\JDK\jdk-1.7.0_06\jdk.exe /s /v /qn /L \"c:\jenkins\tools\JDK\jdk-1.7.0_06\jdk.exe.install.log\" REBOOT=ReallySuppress INSTALLDIR=\"c:\jenkins\tools\JDK\jdk-1.7.0_06\" results in an msiexec dialog (which means a hung installation). Testing indicates that the INSTALLDIR property is the property which is considered invalid. By removing the escapes on the quotes and executing c:\jenkins\tools\JDK\jdk-1.7.0_06\jdk.exe /s /v /qn /L \"c:\jenkins\tools\JDK\jdk-1.7.0_06\jdk.exe.install.log\" REBOOT=ReallySuppress INSTALLDIR="c:\jenkins\tools\JDK\jdk-1.7.0_06" The install completes successfully and we can continue with the build process. (EDIT: I don't think this syntax is exactly correct, either, as I still ended up with an msiexec process hanging. /v and /qn should no longer be necessary either, and you should be able to do this entirely with: c:\jenkins\tools\JDK\jdk-1.7.0_06\jdk.exe /s /L "c:\jenkins\tools\JDK\jdk-1.7.0_06\jdk.exe.install.log" REBOOT=ReallySuppress INSTALLDIR="c:\jenkins\tools\JDK\jdk-1.7.0_06" with a potential setting of ADDLOCAL for just the source course and other necessary features.) The quote escape method used in the original comment, and the spec you mention, are relics from the very old versions of msiexec that were pushed out when JDK 1.5 was new. If you look at the new installers and the pages regarding their use, you can see that a) many of the options are no longer necessary and b) quote escaping for the setting of INSTALLDIR has not been needed for a very long time. It may still be needed for the /L parameter because of the possibility of spaces in your path, but I actually think the quotes are enough now. In any case, it seems like the single quotes have been removed from the installer call, but not the escapes. Without one, you really shouldn't need the other.

          Jerry Qassar added a comment -

          Another possibility to look at would be to use /norestart rather than REBOOT=ReallySuppress.

          Jerry Qassar added a comment - Another possibility to look at would be to use /norestart rather than REBOOT=ReallySuppress.

          cowwoc added a comment -

          This issue also occurs on a Windows master. This bug report is almost 3 years old. Please fix this!

          cowwoc added a comment - This issue also occurs on a Windows master. This bug report is almost 3 years old. Please fix this!
          sogabe made changes -
          Link New: This issue is duplicated by JENKINS-15945 [ JENKINS-15945 ]

          sogabe added a comment -

          sogabe added a comment - created pull request https://github.com/jenkinsci/jenkins/pull/657

          Rob Techstuff added a comment -

          Glad to see that this has been fixed. What needs to be done to get the fix into the next LTS version? Our Jenkins build farm runs both Linux and Windows slaves, and this problem forces us to manually install and configure OS-specific JDK versions on all slaves.

          Thanks.

          Rob Techstuff added a comment - Glad to see that this has been fixed. What needs to be done to get the fix into the next LTS version? Our Jenkins build farm runs both Linux and Windows slaves, and this problem forces us to manually install and configure OS-specific JDK versions on all slaves. Thanks.

            Unassigned Unassigned
            calculu5 calculu5
            Votes:
            6 Vote for this issue
            Watchers:
            13 Start watching this issue

              Created:
              Updated:
              Resolved: