summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMilosz Wasilewski <milosz.wasilewski@linaro.org>2015-01-08 16:50:20 +0000
committerMilosz Wasilewski <milosz.wasilewski@linaro.org>2015-01-08 16:50:20 +0000
commit45a9287043e2ecf6e560560b7a5813e94e2ffd9e (patch)
tree83abfc51b6b87793c870411cfdd057e4a9e71023
Initial commit
Signed-off-by: Milosz Wasilewski <milosz.wasilewski@linaro.org>
-rw-r--r--test-definitions-ci.py195
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])