19473e04dSbugGenerator 29473e04dSbugGeneratorimport sys 39473e04dSbugGeneratorimport argparse 49473e04dSbugGeneratorimport yaml 59473e04dSbugGeneratorimport os 69473e04dSbugGeneratorfrom datetime import date 79473e04dSbugGeneratorimport time 89473e04dSbugGenerator 99473e04dSbugGeneratorgithub_yaml = "" 109473e04dSbugGeneratorworkspace = "" 119473e04dSbugGeneratornemu_home = "" 129473e04dSbugGeneratoram_home = "" 139473e04dSbugGeneratorhead_sha = "" 149473e04dSbugGeneratorwave_home = "" 159473e04dSbugGeneratorperf_home = "" 169473e04dSbugGeneratorset_env = "" 179473e04dSbugGeneratorsh_path = "" 189473e04dSbugGenerator 199473e04dSbugGeneratordef remove_empty(list_str): 209473e04dSbugGenerator list_new = [] 219473e04dSbugGenerator for s in list_str: 229473e04dSbugGenerator if not (s == ""): 239473e04dSbugGenerator list_new.append(s) 249473e04dSbugGenerator return list_new 259473e04dSbugGenerator 269473e04dSbugGeneratordef split_cmd(cmd): 279473e04dSbugGenerator c = cmd.replace("\\\n", " ") 289473e04dSbugGenerator c = remove_empty(c.split("\n")) 299473e04dSbugGenerator cs = [] 309473e04dSbugGenerator for ci in c: 319473e04dSbugGenerator ci = ci.replace("\\\n", " ") 329473e04dSbugGenerator ci = ci.replace("\n\n", "\n") 339473e04dSbugGenerator ci = ci.replace(" ", " ") 349473e04dSbugGenerator if ci[-1] == "\n": 359473e04dSbugGenerator ci = ci[:-1] 369473e04dSbugGenerator cs.append(ci) 379473e04dSbugGenerator return cs 389473e04dSbugGenerator 399473e04dSbugGeneratordef parse_yaml(yaml_file): 409473e04dSbugGenerator file_data = open(yaml_file, "r", encoding="utf-8").read() 419473e04dSbugGenerator yaml_data = yaml.load(file_data, Loader=yaml.CLoader) 429473e04dSbugGenerator return yaml_data 439473e04dSbugGenerator 449473e04dSbugGeneratordef show(test_info): 459473e04dSbugGenerator name = test_info["name"] 469473e04dSbugGenerator print(name) 479473e04dSbugGenerator 489473e04dSbugGeneratordef run_test(test_info, numa, run_mode): 499473e04dSbugGenerator name = test_info["name"] 509473e04dSbugGenerator coe_key = "continue-on-error" 519473e04dSbugGenerator to_key = "timeout-minutes" 529473e04dSbugGenerator s_key = "steps" 539473e04dSbugGenerator continue_on_error = True if (coe_key not in test_info.keys()) else (False if (test_info[coe_key] == "false") else True) 549473e04dSbugGenerator timeout_minutes = 9999 if (to_key not in test_info.keys()) else int(test_info[to_key]) 559473e04dSbugGenerator if s_key not in test_info.keys(): 569473e04dSbugGenerator print(name, " ", s_key, " not found in yaml, skip") 579473e04dSbugGenerator sys.exit() 589473e04dSbugGenerator steps_raw = test_info[s_key] 599473e04dSbugGenerator # print("Steps") 609473e04dSbugGenerator # print(steps) 619473e04dSbugGenerator steps = {} 629473e04dSbugGenerator for s in steps_raw: 639473e04dSbugGenerator if "name" in s.keys(): 649473e04dSbugGenerator steps[s["name"]] = s["run"] 659473e04dSbugGenerator # print(steps) 669473e04dSbugGenerator 679473e04dSbugGenerator replace_list = [ 689473e04dSbugGenerator ["--numa", "--numa" if numa else ""], 699473e04dSbugGenerator ["$GITHUB_WORKSPACE", f"{workspace}"], 709473e04dSbugGenerator ["$HEAD_SHA", f"{head_sha}"], 719473e04dSbugGenerator ["$PERF_HOME", f"{perf_home}"], 729473e04dSbugGenerator ["$WAVE_HOME", f"{wave_home}"], 739473e04dSbugGenerator ["$AM_HOME", f"{am_home}"] 749473e04dSbugGenerator ] 759473e04dSbugGenerator 769473e04dSbugGenerator steps.pop("set env") 779473e04dSbugGenerator 789473e04dSbugGenerator for s in steps.keys(): 799473e04dSbugGenerator for r in replace_list: 809473e04dSbugGenerator steps[s] = steps[s].replace(r[0], r[1]) 819473e04dSbugGenerator 829473e04dSbugGenerator cmd = [] 839473e04dSbugGenerator for s in steps.keys(): 849473e04dSbugGenerator cs = split_cmd(steps[s]) 859473e04dSbugGenerator cmd = cmd + cs 869473e04dSbugGenerator 879473e04dSbugGenerator if run_mode: 88*214933efSbugGenerator os.system(f"mkdir -p {wave_home}\n") 89*214933efSbugGenerator os.system(f"mkdir -p {perf_home}\n") 909473e04dSbugGenerator for c in cmd: 919473e04dSbugGenerator f_c = set_env + " " + c 929473e04dSbugGenerator print(f"[CMD] {f_c}", flush=True) 939473e04dSbugGenerator os.system(f_c) 94*214933efSbugGenerator 959473e04dSbugGenerator else: 969473e04dSbugGenerator if (sh_path is None): 979473e04dSbugGenerator print("sh_path is None") 989473e04dSbugGenerator sys.exit() 999473e04dSbugGenerator elif (not os.path.exists(sh_path)): 1009473e04dSbugGenerator os.mkdir(sh_path) 1019473e04dSbugGenerator 1029473e04dSbugGenerator 1039473e04dSbugGenerator sh_file_name = os.path.join(sh_path, "_".join(name.strip().replace("-", "").split())+".sh") 1049473e04dSbugGenerator with open(sh_file_name, "w") as tmp_sh: 1059473e04dSbugGenerator tmp_sh.write(f"mkdir -p {wave_home}\n") 1069473e04dSbugGenerator tmp_sh.write(f"mkdir -p {perf_home}\n") 1079473e04dSbugGenerator for c in cmd: 1089473e04dSbugGenerator print(c) 1099473e04dSbugGenerator tmp_sh.write(c+"\n") 1109473e04dSbugGenerator 1119473e04dSbugGeneratorif __name__ == "__main__": 1129473e04dSbugGenerator # Usage: 1139473e04dSbugGenerator # 1. run ci test 1149473e04dSbugGenerator # python3 scripts/local_ci.py --xs-path $(pwd) --run 1159473e04dSbugGenerator # More Params: 1169473e04dSbugGenerator # --pick-test MC: only run 'EMU - MC' 1179473e04dSbugGenerator 1189473e04dSbugGenerator # 2. print ci test name 1199473e04dSbugGenerator # python3 scripts/local_ci.py --xs-path $(pwd) --show-test 1209473e04dSbugGenerator # This can also use --pick-test 1219473e04dSbugGenerator 1229473e04dSbugGenerator # 3. print ci test command into splited sh files. Run the sh manualy. 1239473e04dSbugGenerator # python3 scripts/local_ci.py --xs-path $(pwd) --sh-path /nfs/home/zhangzifei/work/xs-master/ci-sh 1249473e04dSbugGenerator # just remove --run 1259473e04dSbugGenerator 1269473e04dSbugGenerator # Other Params: 1279473e04dSbugGenerator # --numa: use numa ctrl, require eypc 1289473e04dSbugGenerator # --head-sha: magic word, default is today's date 1299473e04dSbugGenerator # --nemu-home/--am-home: don't know if it is used 1309473e04dSbugGenerator 1319473e04dSbugGenerator parser = argparse.ArgumentParser(description="run ci locally") 1329473e04dSbugGenerator parser.add_argument("--xs-path", type=str, help="XiangShan, NOOP_HOME") 1339473e04dSbugGenerator parser.add_argument("--nemu-home", type=str, help="NEMU_HOME") 1349473e04dSbugGenerator parser.add_argument("--am-home", type=str, help="AM_HOME") 1359473e04dSbugGenerator parser.add_argument("--sh-path", type=str, help="ci's sh file path") 1369473e04dSbugGenerator parser.add_argument("--head-sha", type=str, help="magic word") 1379473e04dSbugGenerator parser.add_argument("--run", action='store_true', help="run test, not gen sh") 1389473e04dSbugGenerator parser.add_argument("--numa", action='store_true', help="epyc numactl") 1399473e04dSbugGenerator parser.add_argument("--show-test", action="store_true", help="print test case") 1409473e04dSbugGenerator parser.add_argument("--pick-test", type=str, help="pick only one test") 1419473e04dSbugGenerator 1429473e04dSbugGenerator args = parser.parse_args() 1439473e04dSbugGenerator 1449473e04dSbugGenerator print(args) 1459473e04dSbugGenerator 1469473e04dSbugGenerator workspace = os.getenv("NOOP_HOME") if (args.xs_path is None) else args.xs_path 1479473e04dSbugGenerator head_sha = date.today().strftime(r"%Y%m%d") if (args.head_sha is None) else args.head_sha 1489473e04dSbugGenerator wave_home = os.path.join(workspace, "wave", head_sha) 1499473e04dSbugGenerator perf_home = os.path.join(workspace, "perf", head_sha) 1509473e04dSbugGenerator github_yaml = os.path.join(workspace, ".github/workflows/emu.yml") 1519473e04dSbugGenerator nemu_home = os.getenv("NEMU_HOME") if (args.nemu_home is None) else args.nemu_home 1529473e04dSbugGenerator am_home = os.getenv("AM_HOME") if (args.am_home is None) else args.am_home 1539473e04dSbugGenerator set_env = f"NEMU_HOME={nemu_home} NOOP_HOME={workspace} WAVE_HOME={wave_home} PERF_HOME={perf_home} AM_HOME={am_home}" 1549473e04dSbugGenerator sh_path = f"{workspace}/ci-sh" if (args.sh_path is None) else args.sh_path 1559473e04dSbugGenerator 1569473e04dSbugGenerator print("workspace(NOOP_HOME): ", workspace) 1579473e04dSbugGenerator print("head_sha: ", head_sha) 1589473e04dSbugGenerator print("wave_home: ", wave_home) 1599473e04dSbugGenerator print("perf_home: ", perf_home) 1609473e04dSbugGenerator print("github_yaml: ", github_yaml) 1619473e04dSbugGenerator print("nemu_home: ", nemu_home) 1629473e04dSbugGenerator print("am_home: ", am_home) 1639473e04dSbugGenerator print("set_env: ", set_env) 1649473e04dSbugGenerator print("sh_path", sh_path) 1659473e04dSbugGenerator 166*214933efSbugGenerator input("Press Enter to continue\n") 1679473e04dSbugGenerator 1689473e04dSbugGenerator ci_tests = parse_yaml(github_yaml)["jobs"] 1699473e04dSbugGenerator 1709473e04dSbugGenerator if (args.show_test): 1719473e04dSbugGenerator for test in ci_tests.keys(): 1729473e04dSbugGenerator show(ci_tests[test]) 1739473e04dSbugGenerator else: 1749473e04dSbugGenerator for test in ci_tests.keys(): 1759473e04dSbugGenerator if args.pick_test is not None: 1769473e04dSbugGenerator if (args.pick_test in ci_tests[test]["name"]): 1779473e04dSbugGenerator run_test(ci_tests[test], args.numa, args.run) 1789473e04dSbugGenerator else: 1799473e04dSbugGenerator run_test(ci_tests[test], args.numa, args.run) 180