diff --git a/src/main/java/hudson/plugins/ec2/win/EC2WindowsLauncher.java b/src/main/java/hudson/plugins/ec2/win/EC2WindowsLauncher.java index 1140c8af0..2d9dd6f7c 100644 --- a/src/main/java/hudson/plugins/ec2/win/EC2WindowsLauncher.java +++ b/src/main/java/hudson/plugins/ec2/win/EC2WindowsLauncher.java @@ -61,10 +61,15 @@ protected void launchScript(EC2Computer computer, TaskListener listener) logger.println("Creating tmp directory if it does not exist"); WindowsProcess mkdirProcess = connection.execute("if not exist " + tmpDir + " mkdir " + tmpDir); - int exitCode = mkdirProcess.waitFor(); - if (exitCode != 0) { - logger.println("Creating tmpdir failed=" + exitCode); - return; + try { + int exitCode = mkdirProcess.waitFor(); + if (exitCode != 0) { + logger.println("Creating tmpdir failed=" + exitCode); + return; + } + } catch (Exception e) { + mkdirProcess.destroy(); + throw e; } if (initScript != null && !initScript.trim().isEmpty() && !connection.exists(tmpDir + ".jenkins-init")) { @@ -74,12 +79,17 @@ protected void launchScript(EC2Computer computer, TaskListener listener) } WindowsProcess initProcess = connection.execute("cmd /c " + tmpDir + "init.bat"); - IOUtils.copy(initProcess.getStdout(), logger); + try { + IOUtils.copy(initProcess.getStdout(), logger); - int exitStatus = initProcess.waitFor(); - if (exitStatus != 0) { - logger.println("init script failed: exit code=" + exitStatus); - return; + int exitStatus = initProcess.waitFor(); + if (exitStatus != 0) { + logger.println("init script failed: exit code=" + exitStatus); + return; + } + } catch (Exception e) { + initProcess.destroy(); + throw e; } try (OutputStream initGuard = connection.putFile(tmpDir + ".jenkins-init")) { @@ -102,13 +112,18 @@ protected void launchScript(EC2Computer computer, TaskListener listener) + AGENT_JAR + " -workDir " + workDir; logger.println("Launching via WinRM:" + launchString); final WindowsProcess process = connection.execute(launchString, 86400); - computer.setChannel(process.getStdout(), process.getStdin(), logger, new Listener() { - @Override - public void onClosed(Channel channel, IOException cause) { - process.destroy(); - connection.close(); - } - }); + try { + computer.setChannel(process.getStdout(), process.getStdin(), logger, new Listener() { + @Override + public void onClosed(Channel channel, IOException cause) { + process.destroy(); + connection.close(); + } + }); + } catch (Exception e) { + process.destroy(); + throw e; + } } catch (EOFException eof) { // When we launch java with connection.execute(launchString... it keeps running, but if java is not // installed diff --git a/src/main/java/hudson/plugins/ec2/win/winrm/WindowsProcess.java b/src/main/java/hudson/plugins/ec2/win/winrm/WindowsProcess.java index bbea1ef3f..1f0f14fea 100644 --- a/src/main/java/hudson/plugins/ec2/win/winrm/WindowsProcess.java +++ b/src/main/java/hudson/plugins/ec2/win/winrm/WindowsProcess.java @@ -86,8 +86,19 @@ public synchronized void destroy() { return; } - client.signal(); - client.deleteShell(); + // Instance may already be terminated, causing WinRM operations to fail + try { + client.signal(); + } catch (Exception e) { + LOGGER.log(Level.FINE, () -> "Failed to signal WinRM shell: " + e.getMessage()); + } + + try { + client.deleteShell(); + } catch (Exception e) { + LOGGER.log(Level.FINE, () -> "Failed to delete WinRM shell: " + e.getMessage()); + } + terminated = true; Closeables.closeQuietly(toCallersStdout); Closeables.closeQuietly(toCallersStdin);