1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- #!/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)
|