an attempt to force the launcher to wait until jenkins is actually launched
authorSalim Fadhley <sal@stodge.org>
Sat, 29 Jun 2013 23:12:51 +0000 (00:12 +0100)
committerSalim Fadhley <sal@stodge.org>
Sat, 29 Jun 2013 23:12:51 +0000 (00:12 +0100)
jenkinsapi_utils/jenkins_launcher.py

index 4fffc723f67e4e06c678e17f1d52984493f491c1..fb8f9fe08ac0befa0bdcb744288e53b86d87233a 100644 (file)
@@ -1,14 +1,18 @@
 import os
 import time
-import requests
 import Queue
 import shutil
 import logging
+import datetime
 import tempfile
+import requests
 import threading
 import subprocess
 import pkg_resources
 
+from jenkinsapi.jenkins import Jenkins
+from jenkinsapi.exceptions import JenkinsAPIException
+
 log = logging.getLogger(__name__)
 
 
@@ -95,7 +99,21 @@ class JenkinsLancher(object):
         self.jenkins_process.wait()
         shutil.rmtree(self.jenkins_home)
 
-    def start(self, timeout=30):
+    def block_until_jenkins_ready(self, timeout):
+        start_time = datetime.datetime.now()
+        timeout_time = start_time + datetime.timedelta(seconds=timeout)
+
+        while True:
+            try:
+                Jenkins('http://localhost:8080')
+                log.info('Jenkins is finally ready for use.')
+            except JenkinsAPIException:
+                log.info('Jenkins is not yet ready...')
+            if datetime.datetime.now() > timeout_time:
+                raise TimeOut('Took too long for Jenkins to become ready...')
+            time.sleep(5)
+
+    def start(self, timeout=60):
         self.update_war()
         self.update_config()
 
@@ -139,6 +157,8 @@ class JenkinsLancher(object):
                 else:
                     log.warn('Stream %s has terminated', streamName)
 
+        self.block_until_jenkins_ready(timeout)
+
 
 if __name__ == '__main__':
     logging.basicConfig()