|
@@ -0,0 +1,98 @@
|
|
|
+#!/usr/bin/env python
|
|
|
+# https://github.com/ahelal/travis-in-box
|
|
|
+
|
|
|
+import yaml
|
|
|
+import subprocess
|
|
|
+import sys
|
|
|
+import os.path
|
|
|
+
|
|
|
+
|
|
|
+class TravisExec(object):
|
|
|
+ def __init__(self, filename="travis.yml"):
|
|
|
+ self.fail = False
|
|
|
+ stream = open(filename, 'r')
|
|
|
+ yaml_file = yaml.load(stream)
|
|
|
+ # language
|
|
|
+ self.language = yaml_file.get("language", None)
|
|
|
+
|
|
|
+ # Section
|
|
|
+ self.section_before_install = yaml_file.get("before_install", None)
|
|
|
+ self.section_install = yaml_file.get("install", None)
|
|
|
+ self.section_before_script = yaml_file.get("before_script", None)
|
|
|
+ self.section_script = yaml_file.get("script", None)
|
|
|
+
|
|
|
+ #self.section_after_script = yaml_file.get("after_script", None)
|
|
|
+ self.section_after_failure = yaml_file.get("after_failure", None)
|
|
|
+ self.section_after_success = yaml_file.get("after_success", None)
|
|
|
+
|
|
|
+ def _setup(self):
|
|
|
+ if self.language == "python":
|
|
|
+ print "********** Setup Python **********"
|
|
|
+ print ""
|
|
|
+ # Since we are not using container we have to install various lang our self
|
|
|
+ # So this is probably not the best way to do it
|
|
|
+ self._execute_command(["sudo apt-get install python-setuptools python-pip -y"])
|
|
|
+ else:
|
|
|
+ print "Errors unsupported language {}".format(self.language)
|
|
|
+ exit(1)
|
|
|
+
|
|
|
+ def life_cycle(self):
|
|
|
+ # See http://docs.travis-ci.com/user/build-configuration/
|
|
|
+
|
|
|
+ # 1. setup language
|
|
|
+ self._setup()
|
|
|
+ # 4. Run before_install commands
|
|
|
+ self.run_command("before_install", self.section_before_install, self.section_after_failure)
|
|
|
+ # 5. Run install commands
|
|
|
+ self.run_command("install", self.section_install, self.section_after_failure)
|
|
|
+ # 6. Run before_script commands
|
|
|
+ self.run_command("before_script", self.section_before_script, self.section_after_failure)
|
|
|
+ # 7. Run test script commands
|
|
|
+ self.run_command("script", self.section_script, self.section_after_failure)
|
|
|
+ # 8 . if we reach this point we made it run after_success
|
|
|
+ self.run_command("after_success", self.section_after_success, None)
|
|
|
+
|
|
|
+ @staticmethod
|
|
|
+ def _execute_command(command):
|
|
|
+ new_command = ["echo '> " + item.rstrip('\n') + "' && { " + item.rstrip('\n') + " ; }" for item in command]
|
|
|
+ new_command = " && ".join(new_command)
|
|
|
+
|
|
|
+ p = subprocess.Popen(new_command, shell=True, stderr=subprocess.PIPE)
|
|
|
+ while True:
|
|
|
+ out = p.stderr.read(1)
|
|
|
+ if out == '' and p.poll() is not None:
|
|
|
+ break
|
|
|
+ if out != '':
|
|
|
+ sys.stdout.write(out)
|
|
|
+ sys.stdout.flush()
|
|
|
+ print ""
|
|
|
+ return p.returncode
|
|
|
+
|
|
|
+ def run_command(self, section_name=None, command=None, execute_on_failure=None):
|
|
|
+ if command:
|
|
|
+ print ""
|
|
|
+ print "********** Running '{}' **********".format(section_name)
|
|
|
+ return_code = self._execute_command(command)
|
|
|
+ if return_code != 0:
|
|
|
+ print ""
|
|
|
+ print "********** Failed in '{}' **********".format(section_name)
|
|
|
+ if execute_on_failure:
|
|
|
+ print ""
|
|
|
+ print "********** Running after_failure **********".format(section_name)
|
|
|
+ self._execute_command(execute_on_failure)
|
|
|
+ exit(1)
|
|
|
+
|
|
|
+filename = None
|
|
|
+if len(sys.argv) == 1:
|
|
|
+ filename = ".travis.yml"
|
|
|
+elif len(sys.argv) == 2:
|
|
|
+ filename = sys.argv[1]
|
|
|
+else:
|
|
|
+ print "Invalid number of arguments"
|
|
|
+ exit(1)
|
|
|
+
|
|
|
+if os.path.exists(filename):
|
|
|
+ TravisExec(filename).life_cycle()
|
|
|
+else:
|
|
|
+ print "Could not file travis file '{}'".format(filename)
|
|
|
+ exit(1)
|