From 0490884213758c9102aea0f64f286f1710b0c19b Mon Sep 17 00:00:00 2001 From: Lorenzo Venerandi <68255980+Lore09@users.noreply.github.com> Date: Wed, 29 Jan 2025 17:43:10 +0100 Subject: [PATCH] WASM build with docker container --- .env.template | 1 + .gitignore | 10 ++++-- pelato.py | 8 ++--- src/__init__.py | 4 ++- src/wasm_builder/build.py | 65 +++++++++++++++++++++++++++++++++++++++ 5 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 src/wasm_builder/build.py diff --git a/.env.template b/.env.template index ef6f852..ce0011a 100644 --- a/.env.template +++ b/.env.template @@ -1,3 +1,4 @@ REGISTRY_URL= REGISTRY_USER= REGISTRY_PASSWORD= +PARALLEL_BUILD= \ No newline at end of file diff --git a/.gitignore b/.gitignore index d26c716..e28cf4d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,7 @@ -build/* -__pycache__/ -.venv \ No newline at end of file +# Python +**/__pycache__/ +.venv + +# Environment +.env +.vscode \ No newline at end of file diff --git a/pelato.py b/pelato.py index 599575e..4db4c59 100644 --- a/pelato.py +++ b/pelato.py @@ -17,7 +17,7 @@ def main(): parser_deploy = subparsers.add_parser("deploy", help="Deploy WASM components") parser_deploy.add_argument("dir", type=str, help="Project directory") - parser_all = subparsers.add_parser("crazy", help="Everything above") + parser_all = subparsers.add_parser("brush", help="Everything above") parser_all.add_argument("dir", type=str, help="Project directory") # Parsing degli argomenti @@ -33,10 +33,8 @@ def main(): pelato.build(args.dir) elif args.command == "deploy": pelato.deploy(args.dir) - elif args.command == "crazy": - pelato.generate(args.dir) - pelato.build(args.dir) - pelato.deploy(args.dir) + elif args.command == "brush": + pelato.all(args.dir) else: parser.print_help() diff --git a/src/__init__.py b/src/__init__.py index fdd744f..512f56c 100644 --- a/src/__init__.py +++ b/src/__init__.py @@ -2,6 +2,7 @@ from dotenv import load_dotenv import os import src.code_generator.generator as code_generator +import src.wasm_builder.build as wasm_builder class Pelato: def __init__(self): @@ -14,12 +15,13 @@ class Pelato: self.registry_url = os.getenv('REGISTRY_URL') self.reg_user = os.getenv('REGISTRY_USER') self.reg_pass = os.getenv('REGISTRY_PASSWORD') + self.detached = os.getenv('PARALLEL_BUILD') def generate(self, project_dir): code_generator.generate(project_dir, self.registry_url) def build(self, project_dir): - print(f"Building WASM component for project {project_dir}") + wasm_builder.build_project(project_dir, self.reg_user, self.reg_pass, self.detached) def deploy(self, project_dir): print(f"Deploying WASM components for project {project_dir}") diff --git a/src/wasm_builder/build.py b/src/wasm_builder/build.py new file mode 100644 index 0000000..2b25bc2 --- /dev/null +++ b/src/wasm_builder/build.py @@ -0,0 +1,65 @@ +import docker +import os +import logging +import yaml + +def build_project(project_dir, reg_user, reg_pass, detached): + + # Check if the project directory is valid + if not os.path.exists(f"{project_dir}/gen"): + logging.error(f"Project directory is not valid") + return + + # Docker client + client = docker.from_env() + + # Build the images for the project if they don't exist + try: + client.images.get("wash-build-image:latest") + except docker.errors.ImageNotFound: + client.images.build( + path="src/wasm_builder/docker", + dockerfile="build.Dockerfile", + tag="wash-build-image:latest" + ) + + try: + for task in os.listdir(f"{project_dir}/gen"): + __build_wasm(f"{project_dir}/gen/{task}", client, reg_user, reg_pass, detached) + except Exception as e: + logging.error(f"Error building project: {e}") + return + + print("Project built successfully") + +def __build_wasm(task_dir, client, reg_user, reg_pass, detached): + + wadm = __parse_yaml(f"{task_dir}/wadm.yaml") + + path = os.path.abspath(task_dir) + + oci_url = wadm['spec']['components'][0]['properties']['image'] + + # Build the wasm module + print(f" - Building WASM module {oci_url}") + container = client.containers.run( + "wash-build-image:latest", + environment=[f'REGISTRY={oci_url}', + f'WASH_REG_USER={reg_user}', + f'WASH_REG_PASSWORD={reg_pass}'], + volumes={path: {'bind': '/app', 'mode': 'rw'}}, + remove=True, + detach=True + ) + + if detached == 'False': + container.wait() + + +def __parse_yaml(yaml_file): + with open(yaml_file, 'r') as stream: + try: + return yaml.safe_load(stream) + except yaml.YAMLError as exc: + print(exc) + return None \ No newline at end of file