TPE-313 If cycle dependencies exist in prerelease, make the build as fail. 81/155781/1
authorhyokeun <hyokeun.jeon@samsung.com>
Mon, 16 Oct 2017 06:55:45 +0000 (15:55 +0900)
committerhyokeun <hyokeun.jeon@samsung.com>
Mon, 16 Oct 2017 06:55:48 +0000 (15:55 +0900)
Change-Id: Ia01e00dcaaaa1403ac3e4fef6e3ddf327ee991c3

job_buildmonitor.py
job_jobs_dispatcher.py
job_pre_release_obs.py

index a5df4e0..13b6cf2 100644 (file)
@@ -384,7 +384,7 @@ def update_fail_status_for_sr_stage(project, bm_git_tag):
         query_data = (sr_stage_status, curr_sr_status_id, info_stage_id, curr_build_project_id)
         buildmonitor_db.do_query(query, query_data)
 
-def start_pre_create_snapshot_for_sr_stage(project, bm_git_tag, bm_start_datetime, bBuildFail):
+def start_pre_create_snapshot_for_sr_stage(project, bm_git_tag, bm_start_datetime, bBuildFail, BuildFailReason):
     print '[%s] enter start_pre_create_snapshot_for_sr_stage\n' % (__file__)
 
     # get curr_sr_status_id
@@ -403,6 +403,8 @@ def start_pre_create_snapshot_for_sr_stage(project, bm_git_tag, bm_start_datetim
     print '[%s] bBuildFail(%s)\n' % (__file__, bBuildFail)
     if bBuildFail == True:
         info_stage_status = 'F'
+        if BuildFailReason == 'Cycles':
+            info_stage_status = 'C'
     else:
         info_stage_status = 'S'
 
@@ -2300,12 +2302,13 @@ def main():
         bm_git_tag = content.get("bm_git_tag")
         bm_start_datetime = content.get("bm_start_datetime")
         bBuildFail = content.get("bBuildFail")
+        BuildFailReason = content.get("BuildFailReason", "")
         unresolvable_broken_packages = content.get("unresolvable_broken_packages")
 
         # func call
         if bm_stage == 'Pre_Snap_Start':
             print '[%s][Pre_Snap_Start]\n' % (__file__)
-            start_pre_create_snapshot_for_sr_stage(project, bm_git_tag, bm_start_datetime, bBuildFail)
+            start_pre_create_snapshot_for_sr_stage(project, bm_git_tag, bm_start_datetime, bBuildFail, BuildFailReason)
 
         # [17_0110] TRBS
         if bm_stage == '[TRBS]_Pre_Snap_Start':
index 9374383..9469fb5 100755 (executable)
@@ -28,8 +28,9 @@ from common.buildtrigger import trigger_next, trigger_info
 from common.buildservice import BuildService
 from common.backenddb import BackendDB
 from common.snapshot import snapshot_project_enabled
-from common.prerelease import is_prerelease_project
+from common.prerelease import is_prerelease_project, get_info_from_prerelease_name
 from common.trbs import is_trbs_project
+from common import buildmonitor_db
 
 def isReadyForPrerelease(build, project):
     """
@@ -71,6 +72,17 @@ def main(obs_event_fields):
             if(isReadyForPrerelease(build, project)):
                 print 'All the repositories are published for project %s.' \
                       'Triggering the prerelease.' % (project)
+                try:
+                    target_project_name = get_info_from_prerelease_name(project)[0]
+                    buildmonitor_db.connect_db()
+                    query = 'SELECT build_cycle_check FROM main_project ' \
+                            'WHERE name=%s ;'
+                    ret_data = buildmonitor_db.get_value_from_query_data(query, (target_project_name,))
+                    obs_event_fields['build_cycle_check'] = int(ret_data)
+                    buildmonitor_db.disconnect_db()
+                except Exception as err:
+                    buildmonitor_db.disconnect_db()
+                    print repr(err)
                 trigger_next('#PRERELEASE#%s#%s' %(project,event_type),obs_event_fields)
         elif(is_trbs_project(project)):
             if(isReadyForTrbs(build, project)):
@@ -93,3 +105,4 @@ if __name__ == '__main__':
         raise SystemExit('This job do NOT support to carry parameters')
 
     sys.exit(main(trigger_info(os.getenv('para'))))
+
index 62ae22b..58521a9 100755 (executable)
@@ -27,6 +27,7 @@ import re
 import shutil
 import base64
 import datetime
+import xml.etree.ElementTree as ElementTree
 
 from common.repomaker import find_files, RepoMaker, RepoMakerError
 from common.buildtrigger import trigger_info, trigger_next
@@ -483,6 +484,36 @@ def check_build_fail(unresolvable_broken_failed_status):
                     return True
     return False
 
+def get_cycle_packages(build, project, repo_arch):
+    for repo in repo_arch:
+        for idx, item in enumerate(repo_arch[repo]):
+            cycle_packages = []
+            dep_xml = build.get_dependson(project, repo, item.get('arch'))
+            dep_tree = ElementTree.fromstring(dep_xml)
+            for cycle in dep_tree.findall('cycle'):
+                for cycle_child in cycle.findall('package'):
+                    cycle_packages.append(cycle_child.text)
+            repo_arch[repo][idx]['cycles'].extend(list(set(cycle_packages)))
+    return repo_arch
+
+def cycle_build_added(build, prerelease_project, source_project):
+
+    prerelease_repo_arch = {}
+    for x in build.get_targets(prerelease_project):
+        repo, arch = x.split('/')
+        if repo not in prerelease_repo_arch:
+            prerelease_repo_arch[repo] = []
+        prerelease_repo_arch[repo].append({'arch': arch, 'cycles': []})
+
+    prerelease_repo_arch = get_cycle_packages(build, prerelease_project, prerelease_repo_arch)
+
+    for repo in prerelease_repo_arch:
+        for arch in prerelease_repo_arch[repo]:
+            if len(arch.get('cycles')) >= 1:
+                return prerelease_repo_arch
+
+    return None
+
 def get_unresolvable_broken_packages(unresolvable_broken_failed_status):
     unresolvable_broken_packages = {}
 
@@ -535,11 +566,32 @@ def main(action):
         print 'buildstatus=%s' %(buildstatus)
         build.update_buildstatus(buildstatus,project)
         global bBuildFail
+        global BuildFailReason
 
         unresolvable_broken_failed_status = build.get_package_build_result(project, ("unresolvable", "broken", "failed"))
         bBuildFail = check_build_fail(unresolvable_broken_failed_status)
+        if bBuildFail == True:
+            BuildFailReason = "Build"
+        else:
+            BuildFailReason = ""
 
         if buildmonitor_enabled:
+            unresolvable_broken_packages = get_unresolvable_broken_packages(unresolvable_broken_failed_status)
+            if content.get('build_cycle_check', 0) == 1:
+                try:
+                    cycle_packages = cycle_build_added(build, project, info.get('obs_target_prj'))
+                    if cycle_packages is not None:
+                        print 'Cycle build detected. %s \nSet bBuildFail True' % cycle_packages
+                        bBuildFail = True
+                        BuildFailReason = 'Cycles'
+                        # Update cycle info
+                        for cp_repo in cycle_packages:
+                            for cp_item in cycle_packages[cp_repo]:
+                                for cp_pkg in cp_item.get('cycles'):
+                                    unresolvable_broken_packages[cp_repo][cp_item.get('arch')][cp_pkg] = 'cycle'
+                except Exception as err:
+                    print repr(err)
+
             bm_git_tag = info['git_tag']
             #buildmonitor.start_pre_create_snapshot_for_sr_stage(project, bm_git_tag, bm_start_datetime)
             #buildmonitor.start_pre_create_snapshot_for_build_snapshot(project, bm_start_datetime)
@@ -549,7 +601,8 @@ def main(action):
                        "bm_git_tag" : bm_git_tag,
                        "bm_start_datetime": str(bm_start_datetime),
                        "bBuildFail": bBuildFail,
-                       "unresolvable_broken_packages": get_unresolvable_broken_packages(unresolvable_broken_failed_status)
+                       "BuildFailReason": BuildFailReason,
+                       "unresolvable_broken_packages": unresolvable_broken_packages
                       }
             trigger_next("BUILD-MONITOR-1-%s" % bm_stage, bm_data)
 
@@ -613,3 +666,4 @@ if __name__ == '__main__':
     except LocalError, error:
         print error
         sys.exit(1)
+