build.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. """
  2. This script builds the project, creates a new release, and tests the release.
  3. """
  4. import subprocess as sh
  5. import locale
  6. from pathlib import Path
  7. import shutil
  8. import argparse
  9. import os
  10. parser = argparse.ArgumentParser(description='Build utility.')
  11. parser.add_argument('--debug', action="store_true", default=False)
  12. args = parser.parse_args()
  13. debug = args.debug
  14. def l(*args):
  15. print(*args)
  16. def ld(*args):
  17. if debug:
  18. print(*args)
  19. def print_reproduce():
  20. l("To reproduce and see full output, rerun this this script with --debug")
  21. def r(cmd, *args, **kwargs):
  22. cmd_string = " ".join(cmd)
  23. ld(">", " ".join(cmd))
  24. pr = sh.run(cmd, *args, shell=True, capture_output=(not debug), encoding=locale.getpreferredencoding(), **kwargs)
  25. if pr.returncode != 0:
  26. l(f"Command '{cmd_string}' failed with return code {pr.returncode}.")
  27. l("The output was:")
  28. l(pr.stdout)
  29. l("The stderr was:")
  30. l(pr.stderr)
  31. print_reproduce()
  32. exit(pr.returncode)
  33. return pr
  34. l("# Producing assembly:")
  35. r(["sbt", "clean", "assembly"])
  36. l("# Preparing release")
  37. l("## Finding assembly jar")
  38. pattern = 'FMIMOBSTER-assembly-*.jar'
  39. dir = 'target'
  40. paths = list(Path(dir).rglob(pattern))
  41. if not paths:
  42. l(f"Assembly jar with pattern {pattern} not found in directory {dir}.")
  43. print_reproduce()
  44. exit(1)
  45. if len(paths) > 1:
  46. l(f"Multiple assembly jars with pattern {pattern} found in directory {dir}:")
  47. l(paths)
  48. print_reproduce()
  49. exit(1)
  50. assembly_jar = paths[0]
  51. l(f"## Assembly jar found: {assembly_jar}")
  52. release_dir = "release"
  53. l("## Creating release folder")
  54. if os.path.isdir(release_dir):
  55. shutil.rmtree(release_dir)
  56. os.mkdir(release_dir)
  57. l("## Copying files into release folder")
  58. assembly_jar_path_src = os.path.abspath(assembly_jar)
  59. assembly_jar_src_dir, assembly_jar_name = os.path.split(assembly_jar_path_src)
  60. assembly_jar_path_trg = os.path.abspath(os.path.join(release_dir, assembly_jar_name))
  61. ld(f"Copy from {assembly_jar_path_src} to {assembly_jar_path_trg}.")
  62. shutil.copyfile(assembly_jar_path_src, assembly_jar_path_trg)
  63. example_fmu_path_src = os.path.abspath("src/test/resources/fmus/20-sim/threewatertank1.fmu")
  64. example_fmu_src_dir, example_fmu_name = os.path.split(example_fmu_path_src)
  65. example_fmu_path_trg = os.path.abspath(os.path.join(release_dir, example_fmu_name))
  66. ld(f"Copy from {example_fmu_path_src} to {example_fmu_path_trg}.")
  67. shutil.copyfile(example_fmu_path_src, example_fmu_path_trg)
  68. l(f"# Running integration tests")
  69. l(f"## Running model based testing")
  70. results_dir = "results"
  71. r(['java', '-D"org.slf4j.simpleLogger.defaultLogLevel=trace"', '-jar', assembly_jar_name, 'mbt', '-d', 'threewatertank1.fmu', '-n', '1000', '-l', '10', '-o', results_dir], cwd=release_dir)
  72. l(f"## Running a reproduction of a test")
  73. results_dir_path = os.path.join(release_dir, results_dir)
  74. try:
  75. log_file = next(Path(results_dir_path).rglob("*.err"))
  76. except StopIteration:
  77. ld(f"No log files for tests where produced in folder {results_dir_path}.")
  78. print_reproduce()
  79. exit(1)
  80. first_log_path, first_log_name = os.path.split(log_file)
  81. seed, extension = os.path.splitext(first_log_name)
  82. ld(f"Log to reproduce: {first_log_name}")
  83. r(['java', '-D"org.slf4j.simpleLogger.defaultLogLevel=trace"', '-jar', assembly_jar_name, 'mbt', '-d', 'threewatertank1.fmu', '-s', seed, '-o', results_dir], cwd=release_dir)
  84. l(f"# Cleaning up generated files.")
  85. shutil.rmtree(results_dir_path)
  86. l(f"# All done. Release in: {os.path.abspath(release_dir)}")