diff options
author | Milosz Wasilewski <milosz.wasilewski@linaro.org> | 2015-01-08 16:50:20 +0000 |
---|---|---|
committer | Milosz Wasilewski <milosz.wasilewski@linaro.org> | 2015-01-08 16:50:20 +0000 |
commit | 45a9287043e2ecf6e560560b7a5813e94e2ffd9e (patch) | |
tree | 83abfc51b6b87793c870411cfdd057e4a9e71023 |
Initial commit
Signed-off-by: Milosz Wasilewski <milosz.wasilewski@linaro.org>
-rw-r--r-- | test-definitions-ci.py | 195 |
1 files changed, 195 insertions, 0 deletions
diff --git a/test-definitions-ci.py b/test-definitions-ci.py new file mode 100644 index 0000000..ff1f073 --- /dev/null +++ b/test-definitions-ci.py @@ -0,0 +1,195 @@ +#!/usr/bin/python +# Usage ./lava-projectci.py <pep-ignore-options> +import sys +import os +import subprocess +import traceback +import yaml + +jenkins_env = ['WORKSPACE', 'BUILD_URL', 'GERRIT_PROJECT', 'GERRIT_REFSPEC', 'GERRIT_PATCHSET_REVISION', 'GERRIT_CHANGE_OWNER_NAME'] +git_server = 'http://git.linaro.org/git' +gerrit_server = 'review.linaro.org' +result_message_list = [] +debug = False + +def dummy_env(): + os.environ['WORKSPACE'] = '/home/milosz/linaro/testcases/test-definitions-ci/tmp' + os.environ['BUILD_URL'] = 'https://ci.linaro.org/jenkins/job/lava-project-pep8-compliance/686/' + os.environ['GERRIT_PROJECT'] = 'people/milosz.wasilewski/test-definitions' + os.environ['GERRIT_REFSPEC'] = 'refs/changes/94/4194/2' + os.environ['GERRIT_PATCHSET_REVISION'] = '742dfae05943f11c260702104e79206334be77dc' + os.environ['GERRIT_CHANGE_OWNER_NAME'] = 'Milosz Wasilewski' + +def check_enviroment(): + is_env_set = True + for env_variable in jenkins_env: + if env_variable in os.environ: + print '%s is defined as %s' % (env_variable, os.environ[env_variable]) + else: + print '%s is not defined' % env_variable + is_env_set = False + return is_env_set + +def add_gerrit_comment(message, review): + cmd = r'ssh %s gerrit review --code-review %s -m "\"%s"\" %s' % (gerrit_server, review, message, os.environ['GERRIT_PATCHSET_REVISION']) + if debug: + print cmd + try: + output = subprocess.check_output(cmd, shell=True) + except subprocess.CalledProcessError as e: + message = '* SETUP STEP: [FAILED]: %s' % cmd + result_message_list.append(message) + print e.output + publish_result() + exit(1) + +def notify_committer(): + message_list= [] + message_list.append('* Hello %s' % os.environ['GERRIT_CHANGE_OWNER_NAME']) + message_list.append('* Your patch set %s has triggered automated testing.' % os.environ['GERRIT_PATCHSET_REVISION']) + message_list.append('* Please do not merge this commit until after I have reviewed the results with you.') + message_list.append('* %s' % os.environ['BUILD_URL']) + message = '\n'.join(message_list) + if debug: + print message + add_gerrit_comment(message, 0) + +def publish_result(result=None): + #test_results = os.environ['BUILD_URL'] + 'console' + #result_message_list.append('* TEST RESULTS: %s' % test_results) + #import pdb;pdb.set_trace() + result_message = '\n'.join(result_message_list) + if debug: + print result_message + if result is None: + add_gerrit_comment(result_message, 0) + elif result: + add_gerrit_comment(result_message, +1) + else: + add_gerrit_comment(result_message, -1) + + +def checkout_and_rebase(): + os.chdir(os.environ['WORKSPACE']) + cmd = 'git clone %s/%s' % (git_server, os.environ['GERRIT_PROJECT']) + if debug: + print cmd + try: + output = subprocess.check_output(cmd, shell=True) + if debug: + print output + message = '* SETUP STEP: [PASSED]: %s' % cmd + result_message_list.append(message) + except subprocess.CalledProcessError as e: + message = '* SETUP STEP: [FAILED]: %s' % cmd + result_message_list.append(message) + publish_result() + exit(1) + print os.environ['GERRIT_PROJECT'].split('/')[-1] + os.chdir(os.environ['GERRIT_PROJECT'].split('/')[-1]) + cmd = 'git fetch ssh://%s/%s %s && git checkout FETCH_HEAD && git rebase master' % (gerrit_server, os.environ['GERRIT_PROJECT'], os.environ['GERRIT_REFSPEC']) + if debug: + print cmd + try: + output = subprocess.check_output(cmd, shell=True) + message = '* SETUP STEP: [PASSED]: %s' % cmd + result_message_list.append(message) + except subprocess.CalledProcessError as e: + message = '* SETUP STEP: [FAILED]: %s' % cmd + result_message_list.append(message) + print e.output + publish_result() + exit(1) + +def pep8_check(ignore_options): + os.chdir(os.environ['WORKSPACE']) + os.chdir(os.environ['GERRIT_PROJECT'].split('/')[-1]) + cmd = 'pep8 --ignore %s .' % ignore_options + try: + output = subprocess.check_output(cmd, shell=True) + if debug: + print output + message = '* PEP8 CHECK: [PASSED]: %s' % cmd + result_message_list.append(message) + except subprocess.CalledProcessError as e: + message_list = [] + message_list.append('* PEP8 CHECK: [FAILED]: %s' % cmd) + message_list.append('* PEP8 CHECK: [OUTPUT]:') + for line in e.output.splitlines(): + message_list.append('* ' + line) + message = '\n'.join(message_list) + result_message_list.append(message) + cmd_verbose = 'pep8 --ignore %s --show-source --show-pep8 .' % ignore_options + subprocess.call(cmd_verbose, shell=True) + publish_result(False) + exit(1) + +def validate_yaml(filename): + with open(filename, "r") as f: + try: + y = yaml.load(f.read()) + message = "* YAMLVALID: [PASSED]: " + filename + result_message_list.append(message) + except: + message = "* YAMLVALID: [FAILED]: " + filename + result_message_list.append(message) + result_message_list.append("\n") + exc_type, exc_value, exc_traceback = sys.exc_info() + for line in traceback.format_exception_only(exc_type, exc_value): + result_message_list.append(' ' + line.replace("\"", "'")) + publish_result(False) + exit(1) + +def validate_shell(filename): + cmd = 'checkbashisms %s 2>&1' % filename + try: + output = subprocess.check_output(cmd, shell=True) + if debug: + print output + message = '* CHECKBASHISMS: [PASSED]: %s' % filename + result_message_list.append(message) + except subprocess.CalledProcessError as e: + #message_list = [] + result_message_list.append('* CHECKBASHISMS: [WARNING]: %s' % filename) + result_message_list.append('* CHECKBASHISMS: [OUTPUT]:') + for line in e.output.splitlines(): + result_message_list.append(' ' + line.replace("\"", "'").replace("{","\\{").replace("}","\\}")) + #publish_result(False) + #exit(1) + +def run_unit_tests(): + project = os.environ['GERRIT_PROJECT'].split('/')[-1] + os.chdir(os.environ['WORKSPACE']) + os.chdir(project) + for root, dirs, files in os.walk('.'): + if not root.startswith("./.git"): + for name in files: + if name.endswith("yaml"): + validate_yaml(root + "/" + name) + # disable checkbashisms for now + #if name.endswith("sh"): + # validate_shell(root + "/" + name) + +def init(): + result_message_list.append('* TESTBOT: [RESULTS]: Automated test results for patch set: %s' % os.environ['GERRIT_PATCHSET_REVISION']) + +def main(ignore_options): + # Uncomment the following to run locally + #debug = True + #dummy_env() + if check_enviroment(): + print 'All required environment variables have been set...continuing' + else: + print 'All required environment variables have not been set...exiting' + exit(1) + notify_committer() + init() + checkout_and_rebase() + # disable pep8 for now + #pep8_check(ignore_options) + run_unit_tests() + publish_result(True) + exit(0) + +if __name__ == '__main__': + main(sys.argv[1]) |