xref: /XiangShan/debug/local_ci.py (revision 214933efebfb59042c0afea2e2d07b7e4391bfff)
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