TPE-317 ABS: Full build check mail noti 68/149268/1
authorhyokeun <hyokeun.jeon@samsung.com>
Tue, 12 Sep 2017 04:16:17 +0000 (13:16 +0900)
committerhyokeun <hyokeun.jeon@samsung.com>
Tue, 12 Sep 2017 04:16:17 +0000 (13:16 +0900)
Change-Id: If32ed30ff4591361ff0cbc04fd6bd2e4fb7462b9

abs/job_abs_build.py
abs/job_abs_update.py

index f3a25d2..0b7c50a 100644 (file)
@@ -470,18 +470,6 @@ def generate_spec_file(tizen_studio, src_git, prop, data):
 def post_processing(tizen_studio, src_git, prop, data, builddir, mailer, build):
     """ Create SR of the generated tpks thru git tagging """
 
-    rs_ver, fail_title, fail_log = tizen_studio.gather_build_result()
-    print 'VM returned [%s] [%s] [%s]\n' % (rs_ver, fail_title, fail_log)
-
-    mailer.add_message('SDK Rootstrap Version: %s' % rs_ver)
-
-    if tizen_studio.build_result != 0 and fail_title != None:
-        print 'App Build Fail'
-        mailer.add_title(fail_title)
-        mailer.add_message('Result: FAIL')
-        mailer.add_message('\n\n%s' % fail_log)
-        return
-
     print 'TizenStudio: builddir: %s' % tizen_studio.builddir
 
     spec = generate_spec_file(tizen_studio, src_git, prop, data)
@@ -711,12 +699,29 @@ def start_build(fields):
                                            build_mode=os.getenv('BUILD_MODE'), \
                                            parallel_jobs=parallel_jobs)
     print '[ TizenStudio END ] %s' % (str(datetime.now()))
+    print ret
+
+    rs_ver, fail_title, fail_log = my_tizen_studio.gather_build_result()
+    print 'VM returned [%s] [%s] [%s]\n' % (rs_ver, fail_title, fail_log)
+
+    mailer.add_message('SDK Rootstrap Version: %s' % rs_ver)
+
+    if my_tizen_studio.build_result != 0 and fail_title != None:
+        print 'App Build Fail'
+        mailer.add_title(fail_title)
+        mailer.add_message('Result: FAIL')
+        mailer.add_message('\n\n%s' % fail_log)
 
     if data.get('buildcheck', None) == None and data.get('type', None) == 'SUBMIT':
+        # Send mail only for failed build
+        if 'FAIL' in mailer.email_title:
+            mailer.send_mail()
+            return 2
         post_processing(my_tizen_studio, src_git, project_properties, data, builddir, mailer, build)
         # Send mail only for failed build
         if 'FAIL' in mailer.email_title:
             mailer.send_mail()
+            return 3
 
     if 'FAIL' in mailer.email_title:
         return 1
index fe006c9..5b5b555 100644 (file)
@@ -18,6 +18,7 @@ import ast
 import xml.etree.cElementTree as ET
 import inspect
 from random import randint
+from jenkinsapi.jenkins import Jenkins
 
 sys.path.insert(1, os.path.join(sys.path[0], '..'))
 
@@ -28,6 +29,7 @@ from common.git import Git, clone_gitproject
 from common.send_mail import prepare_mail, makemail
 from common.gerrit import GerritEnv
 from common.tizen_studio import TizenStudio
+from common.workflow import MailSender
 
 def list_all_packages(profile, gerrit_env):
 
@@ -61,8 +63,103 @@ def list_all_packages(profile, gerrit_env):
                              'package': _pkg})
     return list_all
 
+def build_result_report(build_number):
+
+    build_result = []
+    reason = None
+    target = None
+    branch = None
+
+    jenkins_server = Jenkins(os.getenv('JENKINS_URL'), os.getenv('JENKINS_USER'), os.getenv('JENKINS_PW'))
+    build_abs = jenkins_server[os.getenv('JOB_NAME')].get_build(int(build_number))
+    for action in build_abs.get_actions().get('triggeredBuilds'):
+        single_job = action.get('url').split('/')[-3]
+        single_build_number = int(action.get('number'))
+        single_build = jenkins_server[single_job].get_build(single_build_number)
+        single_build_result = single_build.get_status()
+        print single_job, single_build_number, single_build_result
+        sys.stdout.flush()
+
+        if single_build_result != 'SUCCESS':
+
+            # parameters
+            package = None
+            project = None
+            for parm in single_build.get_actions().get('parameters'):
+                if 'name' in parm and parm['name'] == 'TRIGGER_INFO':
+                    json = ast.literal_eval(base64.b64decode(parm.get('value')).replace('null', '\"none\"'))
+                    reason = json.get('full_build')
+                    project = json.get('event').get('GERRIT_PROJECT')
+                    target = json.get('obs_project')
+                    package = json.get('obs_package')
+                    branch = json.get('branch')
+
+            single_build_log = single_build.get_console()
+
+            # log trimming
+            exp = r'/home/build/tizen-sdk-cli/tools/smart-build-interface/../../platforms/[a-zA-Z-0-9./]{1,}/rootstraps/[a-zA-Z]{1,}-[0-9.]{1,}-(emulator|device).core.private.[0-9_]{1,}'
+            single_build_log = re.sub(exp, '{ROOTSTRAP}', single_build_log)
+            exp = r'/home/build/tizen-sdk-cli/tools/smart-build-interface/../'
+            single_build_log = re.sub(exp, '{BUILDTOOL}', single_build_log)
+            if single_build_log.rfind('ERROR: No "profile" tag in property file') != -1:
+                single_build_log = single_build_log[single_build_log.rfind('ERROR: No "profile" tag in property file'):]
+
+            start_idx = single_build_log.rfind('VM returned [')
+            if start_idx <= -1: start_idx = 0
+            start_idx = len(single_build_log) - 2048
+            if start_idx <= -1: start_idx = 0
+            end_idx = single_build_log.rfind('Total time')
+            single_build_log = single_build_log[start_idx:end_idx]
+
+            trimmed_log = []
+            for line in single_build_log.split('\n'):
+                if 'Finished building: ' in line: continue
+                if line.endswith('^'): continue
+                trimmed_log.append(line)
+            single_build_log = '\n'.join(trimmed_log)
+
+            build_result.append({'number': single_build_number, \
+                                 'result': single_build_result, \
+                                 'project': project, \
+                                 'package': package, \
+                                 'log': '%s' % single_build_log})
+            del single_build_log
+        del single_build
+
+    if len(build_result) <= 0:
+        return 0
+
+    mymail = MailSender()
+    mymail.add_title('ABS Build check %d errors for %s' % (len(build_result), reason))
+    mymail.add_message('App Build System(ABS) reports entire project build.\n' \
+                       'It is intended for build check with new private rootstrap.\n' \
+                       '(Base souce code from the most recent accepted SR)\n\n')
+    mymail.add_message('Full build cause: %s\n' % reason)
+    mymail.add_message('OBS Target Project: %s\n' % target)
+    mymail.add_message('branch: %s\n\n' % branch)
+
+    log_size = 0
+    for x in build_result:
+        sys.stdout.flush()
+        mymail.add_message('\n\n[ %s ] [%s]\n=========' % (x.get('project'), x.get('result')))
+        mymail.add_message(x.get('log'))
+        log_size += len(x.get('log'))
+    print 'Log Size: %d' % log_size
+
+    mymail.add_message('\n\n--------------------------------------------------------\n'\
+                       'Automatically generated by backend service.\n'\
+                       'Please DO NOT Reply!')
+
+    mymail.add_receiver(os.getenv('ABS_MAILINGLIST').split(','))
+    mymail.send_mail()
+
+    return 2
+
 def main(new_rs, gerrit_name):
 
+    if os.getenv('BUILD_RESULT_REPORT', None):
+        return build_result_report(os.getenv('BUILD_RESULT_REPORT'))
+
     if gerrit_name.startswith('public_gerrit'):
         gerrit_infra = 'PUBLIC'
         gerrit_env = GerritEnv('PUBLIC_')
@@ -131,7 +228,10 @@ def main(new_rs, gerrit_name):
                          % (int(os.getenv('BUILD_NUMBER')), index, trigger_data['source']['package']), \
                          trigger_data)
 
+    trigger_next('ABS_BUILD_RESULT', {'Empty': 'Blank'}, extra_params={'BUILD_RESULT_REPORT': os.getenv('BUILD_NUMBER')})
+
 if __name__ == '__main__':
 
     sys.exit(main(os.getenv('NEW_ROOTSTRAP'), os.getenv('GERRIT_INFRA')))
 
+