import os
-import time
-import shutil
-import logging
-import tempfile
-import subprocess
-
-log = logging.getLogger(__name__)
-
-class Timeout(RuntimeError):
- pass
-
-class FailedToLaunch(RuntimeError):
- pass
-
-class JenkinsLauncher(object):
-
- def __init__(self, timeout=10, update_war=False, launch=False):
- self.timeout = timeout
- self.directory = os.path.dirname(__file__)
- if update_war:
- self.update_war()
- if launch:
- self.launch()
-
- def update_war(self):
- os.chdir(self.directory)
- subprocess.check_call('./get-jenkins-war.sh')
-
- def launch(self):
- '''
- Launches jenkins and waits while it's ready.
- '''
- log.info("Atempting to launch Jenkins...")
- self.jenkins_home = tempfile.mkdtemp(prefix='jenkins-home-')
- os.environ['JENKINS_HOME'] = self.jenkins_home
- jenkins_command = 'java -jar jenkins.war'
- self.jenkins_process = subprocess.Popen(
- jenkins_command.split(), stdin=subprocess.PIPE,
- stdout=subprocess.PIPE, stderr=subprocess.PIPE)
- start_time = time.time()
- while time.time() - start_time < self.timeout:
- line = self.jenkins_process.stderr.readline().strip()
- log.info('Jenkins: %s' % line)
-
- if 'Winstone shutdown successfully' in line:
- raise FailedToLaunch()
-
- if line == 'INFO: Jenkins is fully up and running':
- return
- raise Timeout('Timeout error occured while waiting for Jenkins start.')
-
- def stop(self):
- shutil.rmtree(self.jenkins_home)
- self.jenkins_process.terminate()
- self.jenkins_process.wait()
+from jenkinsapi_utils.jenkins_launcher import JenkinsLancher
launcher = None
def setUpPackage():
global launcher
- launcher = JenkinsLauncher(update_war=True, launch=True)
+ import ipdb
+ ipdb.set_trace()
+
+ systests_dir, _ = os.path.split(__file__)
+ war_path = os.path.join(systests_dir, 'jenkins.war' )
+ launcher = JenkinsLancher(war_path)
+ launcher.start()
def tearDownPackage():
import os
+import io
import time
+import Queue
import shutil
import logging
-import subprocess
+import requests
import tempfile
-import Queue
import threading
+import subprocess
log = logging.getLogger(__name__)
class StreamThread(threading.Thread):
+
+
def __init__(self, name, q, stream, fn_log):
threading.Thread.__init__(self)
self.name = name
self.stream = stream
self.fn_log = fn_log
+
+
def run(self):
log.info("Starting %s", self.name)
"""
Launch jenkins
"""
+ JENKINS_WAR_URL="http://mirrors.jenkins-ci.org/war/latest/jenkins.war"
+
def __init__(self, war_path):
self.war_path = war_path
self.war_directory, self.war_filename = os.path.split(self.war_path)
self.jenkins_process = None
self.q = Queue.Queue()
+ def update_war(self):
+ if not os.path.exists(self.war_path):
+ with io.open(self.war_path, 'wb') as war_file:
+ log.info("Downloading the Jenkins WAR file")
+ war_response = requests.get(self.JENKINS_WAR_URL)
+ war_file.write(war_response.read())
+ log.info('Done!')
+
+ os.chdir(self.war_directory)
+ subprocess.check_call('./get-jenkins-war.sh')
+
def stop(self):
log.info("Shutting down jenkins.")
self.jenkins_process.terminate()
shutil.rmtree(self.jenkins_home)
def start(self, timeout=30):
+ self.update_war()
+
os.environ['JENKINS_HOME'] = self.jenkins_home
os.chdir(self.war_directory)
- jenkins_command = 'java -jar %s' % self.war_filename
+ jenkins_command = ['java', '-jar', self.war_filename]
log.info("About to start Jenkins...")
- log.info("%s> %s", os.getcwd(), jenkins_command)
+ log.info("%s> %s", os.getcwd(), " ".join(jenkins_command))
self.jenkins_process = subprocess.Popen(
- jenkins_command.split(), stdin=subprocess.PIPE,
+ jenkins_command, stdin=subprocess.PIPE,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
threads = [
while True:
try:
streamName, line = self.q.get(block=True, timeout=timeout)
+ except Queue.Empty:
+ log.warn("Input ended unexpectedly")
+ break
+ else:
if line:
if 'Failed to initialize Jenkins' in line:
raise FailedToStart(line)
else:
log.warn('Stream %s has terminated', streamName)
- except Queue.Empty:
- print "unexpected end!"
- break
+
if __name__ == '__main__':
logging.basicConfig()