From c7a518afeace048f25f771fc904b79efaf4ec6cf Mon Sep 17 00:00:00 2001 From: hyokeun Date: Mon, 16 Oct 2017 15:55:45 +0900 Subject: [PATCH] TPE-313 If cycle dependencies exist in prerelease, make the build as fail. Change-Id: Ia01e00dcaaaa1403ac3e4fef6e3ddf327ee991c3 --- job_buildmonitor.py | 7 +++++-- job_jobs_dispatcher.py | 15 +++++++++++++- job_pre_release_obs.py | 56 +++++++++++++++++++++++++++++++++++++++++++++++++- 3 files changed, 74 insertions(+), 4 deletions(-) diff --git a/job_buildmonitor.py b/job_buildmonitor.py index a5df4e0..13b6cf2 100644 --- a/job_buildmonitor.py +++ b/job_buildmonitor.py @@ -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': diff --git a/job_jobs_dispatcher.py b/job_jobs_dispatcher.py index 9374383..9469fb5 100755 --- a/job_jobs_dispatcher.py +++ b/job_jobs_dispatcher.py @@ -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')))) + diff --git a/job_pre_release_obs.py b/job_pre_release_obs.py index 62ae22b..58521a9 100755 --- a/job_pre_release_obs.py +++ b/job_pre_release_obs.py @@ -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) + -- 2.7.4