Keeping a windows process after a jenkins job
One of our jobs on Jenkins is to deploy and startup an application server on a remote slave. However we were having 2 problems with it:
1. the job wasn’t finishing
2. when we terminated it from jenkins, it killed the process it had spawned (the application server).
I spent ages butting my head against Jython on windows, which in hindsight, I could have saved a lot of time if I'd seen how little of the functionality I need from python/windows was implemented in jython/windows.
(1) was solved by getting the start command to write stdout/stderr to a file (irrespective of whether anything was written).
(2) I tried many elaborate solutions, still thinking it was a jython or windows related problem. After seeing it mentioned in blog posts a few times I finally got what they were saying.
Jenkins has a section on their site: Spawning processes from build. Now the key thing here I missed was the BUILD_ID environment variable. So unset it and as long as you've spawned a new process it should fine.
The simple solution should be
Unfortunately that didn't work in my odd case, so here's my overkill solution for those that need it:
1. the job wasn’t finishing
2. when we terminated it from jenkins, it killed the process it had spawned (the application server).
I spent ages butting my head against Jython on windows, which in hindsight, I could have saved a lot of time if I'd seen how little of the functionality I need from python/windows was implemented in jython/windows.
(1) was solved by getting the start command to write stdout/stderr to a file (irrespective of whether anything was written).
(2) I tried many elaborate solutions, still thinking it was a jython or windows related problem. After seeing it mentioned in blog posts a few times I finally got what they were saying.
Jenkins has a section on their site: Spawning processes from build. Now the key thing here I missed was the BUILD_ID environment variable. So unset it and as long as you've spawned a new process it should fine.
The simple solution should be
start_background.bat set BUILD_ID= start /B "" cmd /C %*And just pass your full command to start_background.bat
Unfortunately that didn't work in my odd case, so here's my overkill solution for those that need it:
# Use csscript.exe to trigger the call async and not attached to this process as os.spawnl(command, os.P_DETACH)
def windowsAsync(self, systemCommand, jobName):
cmd = open(jobName + '.cmd', 'w')
cmd.write("set BUILD_ID=\n")
cmd.write(systemCommand + "\n")
cmd.write("exit\n")
cmd.close()
startCommand = 'start "" /B cmd /C ' + jobName + '.cmd'
# saving the output to a temporary file to make sure we don't have handles. don't know if this acutally does it
tOut = tempfile.NamedTemporaryFile()
tIn = tempfile.NamedTemporaryFile()
print "Using output temp file: " + tOut.name
print "Invoking OS command: " + systemCommand
print "Embeded command: " + startCommand
process = subprocess.Popen(startCommand, shell=True, stdin=tIn, stdout=tOut, stderr=tOut)
#process.wait()
print "Sleeping"
time.sleep(30)
print "--- consoleOutput start:"
# Rewind and read the text written
# to the temporary file
tOut.seek(0)
lines = tOut.read()
print lines
tOut.close()
sys.stdout.flush()
tIn.close()
lines = ""
Comments
Post a Comment