Squashed commit of jenkins changes
This commit is contained in:
		
							
								
								
									
										149
									
								
								resources/scripts/build.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								resources/scripts/build.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,149 @@ | ||||
| # Build script for CI. | ||||
| # This file is run from the root of the repository | ||||
|  | ||||
| import os | ||||
| import tomli | ||||
| from pathlib import Path | ||||
| import shutil | ||||
|  | ||||
| from webdav3.client import Client | ||||
|  | ||||
| import helpers.tex as tex | ||||
|  | ||||
| conf_path = "resources/scripts/build.toml" | ||||
|  | ||||
| # Prepare envvars | ||||
| e = os.environ.copy() | ||||
| e["TEXINPUTS"] = f"::/usr/share/texmf-dist/tex//" | ||||
| print(Path.cwd()) | ||||
|  | ||||
| # If true, rebuild everything | ||||
| # without checking for changes. | ||||
| if "FORCE_ALL" in e: | ||||
| 	force_all = e["FORCE_ALL"] == "true" | ||||
| else: | ||||
| 	force_all = False | ||||
|  | ||||
| if "NO_TEST" in e: | ||||
| 	test = e["NO_TEST"] == "false" | ||||
| else: | ||||
| 	test = True | ||||
|  | ||||
|  | ||||
| # Used only for debug | ||||
| class FakeClient: | ||||
| 	def __init__(self): | ||||
| 		pass | ||||
|  | ||||
| 	def mkdir(self, path): | ||||
| 		print(f"Making dir {path}") | ||||
|  | ||||
| 	def upload_sync(self, local_path, remote_path): | ||||
| 		print(f"Sync {local_path} to {remote_path}") | ||||
|  | ||||
| 	def clean(self, path): | ||||
| 		print(f"Cleaning {path}") | ||||
|  | ||||
|  | ||||
|  | ||||
| # Load configuration | ||||
| with open(conf_path, mode="rb") as fp: | ||||
| 	config = tomli.load(fp) | ||||
|  | ||||
| # Prepare directories | ||||
| builddir = Path().absolute() / config["core"]["build_dir"] | ||||
| output = Path().absolute() / config["core"]["output_dir"] | ||||
| output.mkdir(parents = True, exist_ok = True) | ||||
| builddir.mkdir(parents = True, exist_ok = True) | ||||
|  | ||||
|  | ||||
|  | ||||
| if not test: | ||||
| 	# Connect to webdav | ||||
| 	client = Client({ | ||||
| 		"webdav_login": e["NC_CRED_USR"], | ||||
| 		"webdav_password": e["NC_CRED_PSW"], | ||||
| 		"webdav_hostname": e["DAV_HOSTNAME"],	# https://host:port | ||||
| 		"webdav_root": e["DAV_ROOT"]			# the rest of the url | ||||
| 		# client.list() will break if we do not seperate the hostname | ||||
| 		# and the root path. | ||||
| 	}) | ||||
| else: | ||||
| 	client = FakeClient() | ||||
|  | ||||
|  | ||||
| def upload_dir(local_path: Path): | ||||
| 	for p in local_path.rglob("*"): | ||||
| 		r = p.relative_to(output) | ||||
| 		if p.is_dir(): | ||||
| 			client.mkdir(str(r)) | ||||
|  | ||||
| 		elif p.is_file(): | ||||
| 			client.upload_sync(  # type: ignore | ||||
| 				remote_path = str(r), | ||||
| 				local_path = p | ||||
| 			) | ||||
|  | ||||
|  | ||||
| # Print envvars for debug | ||||
| #print(e) | ||||
|  | ||||
|  | ||||
| for i, item in enumerate(config["dir-of-dirs"]): | ||||
| 	p = Path(item["path"]) | ||||
|  | ||||
| 	for s in p.iterdir(): | ||||
| 		# s: path to directory, | ||||
| 		# # relative to repo root | ||||
| 		if not s.is_dir(): | ||||
| 			continue | ||||
|  | ||||
| 		print(f"Building {s}/main.tex") | ||||
|  | ||||
| 		# Make pdf | ||||
| 		pdf_nosolutions = tex.build( | ||||
| 			s, | ||||
| 			mainfile = "main.tex", | ||||
| 			jobname = f"{i}-nosols", | ||||
| 			build_dir = builddir, | ||||
| 			solutions = False, | ||||
|  | ||||
| 			env = e, | ||||
| 			test = test | ||||
| 		) | ||||
|  | ||||
| 		pdf_solutions = tex.build( | ||||
| 			s, | ||||
| 			mainfile = "main.tex", | ||||
| 			jobname = f"{i}-sols", | ||||
| 			build_dir = builddir, | ||||
| 			solutions = True, | ||||
|  | ||||
| 			env = e, | ||||
| 			test = test | ||||
| 		) | ||||
|  | ||||
| 		target_dir = output / s.parent | ||||
| 		target_dir.mkdir(parents = True, exist_ok = True) | ||||
|  | ||||
| 		shutil.copy( | ||||
| 			pdf_nosolutions, | ||||
| 			target_dir / (s.stem + ".pdf") | ||||
| 		) | ||||
|  | ||||
| 		shutil.copy( | ||||
| 			pdf_solutions, | ||||
| 			target_dir / (s.stem + ".sols.pdf") | ||||
| 		) | ||||
|  | ||||
| if not test: | ||||
| 	# Delete old files | ||||
| 	for i in client.list(): | ||||
| 		if i.endswith("/"): | ||||
| 			i = i[:-1] | ||||
| 		client.clean(i) | ||||
|  | ||||
| upload_dir(output) | ||||
|  | ||||
| # Remove output files so they don't persist | ||||
| shutil.rmtree(output) | ||||
		Reference in New Issue
	
	Block a user