From dc583c41eb5654dc4f935a5ffffb769169e117e6 Mon Sep 17 00:00:00 2001 From: Greg Hellings Date: Thu, 10 Aug 2023 23:17:15 -0500 Subject: [PATCH] Much cleaner build script --- .gitignore | 4 +++ build.xsh | 57 ++++++++++++++++++++++++++++++ del_boxes.xsh | 5 +++ distros/centos-stream/supports.yml | 10 ++++++ distros/centos/supports.yml | 5 +++ distros/debian/supports.yml | 12 +++++++ lib/__init__.py | 0 lib/build.py | 22 ++++++++++++ lib/distro.py | 26 ++++++++++++++ lib/provider.py | 7 ++++ lib/support.py | 23 ++++++++++++ test.xsh | 8 ----- 12 files changed, 171 insertions(+), 8 deletions(-) create mode 100755 build.xsh create mode 100755 del_boxes.xsh create mode 100644 distros/centos-stream/supports.yml create mode 100644 distros/centos/supports.yml create mode 100644 distros/debian/supports.yml create mode 100644 lib/__init__.py create mode 100644 lib/build.py create mode 100644 lib/distro.py create mode 100644 lib/provider.py create mode 100644 lib/support.py diff --git a/.gitignore b/.gitignore index d08d413..67fff14 100644 --- a/.gitignore +++ b/.gitignore @@ -12,3 +12,7 @@ distros/fedora-rawhide-*.hcl distros/centos-8stream-*.hcl distros/centos-9stream-*.hcl cellar/centos-9stream-*.hcl + +__pycache__ +*.pyc +*.pyo diff --git a/build.xsh b/build.xsh new file mode 100755 index 0000000..0a0ea3f --- /dev/null +++ b/build.xsh @@ -0,0 +1,57 @@ +#!/usr/bin/env xonsh +from argparse import ArgumentParser +from pathlib import Path +import sys +sys.path.append(str(Path(__file__).parent / "lib")) +from support import Support, BASE + + +support = Support() +parser = ArgumentParser("Build a box") +parser.add_argument("--distro", "-d", help="Name of the distro/ folder") +parser.add_argument("--version", "-v", help="Version of the distro to build") +parser.add_argument("--build", "-b", help="Name of the target build, e.g. qemu.x86_64, virtualbox-iso.x86_64") +parser.add_argument("--list", "-l", help="List all build targets") +parser.add_argument("--all", "-a", help="Build all applicable targets", action="store_true") +parser.add_argument("--upload", "-u", help="Force doing uploads", action="store_true") +parser.add_argument("--headless", help="Run builds headless", action="store_true") +args = parser.parse_args() + +# Now provide menus if we don't have defaults +def process_all(): + if args.distro: + process_distro(support.distros[args.distro]) + else: + for name, distro in support.distros.items(): + process_distro(distro) + +def process_distro(distro): + if args.version: + process_builds(distro.builds_for_version(args.version)) + else: + process_builds(distro.builds) + +def process_builds(builds): + for build in builds: + if args.build: + name, arch = args.build.split(".") + if build.provider.name == name and build.provider.arch == arch: + do_build(build) + else: + do_build(build) + +def do_build(build): + if args.upload: + upload = "" + else: + upload = "-except=upload" + if args.headless: + headless = "headless=true" + else: + headless = "headless=false" + echo packer build -var @(headless) @(build.var_file) @(build.only) @(upload) @(BASE / "sources") + +if args.all or (args.distro and args.version and args.build): + process_all() +else: + print("Doing menu stuff") diff --git a/del_boxes.xsh b/del_boxes.xsh new file mode 100755 index 0000000..b2344d6 --- /dev/null +++ b/del_boxes.xsh @@ -0,0 +1,5 @@ +#!/usr/bin/env bash + +virsh -q vol-list default | awk '{print $1}' | xargs -r -L 1 virsh vol-delete --pool default +sudo virsh -q vol-list default | awk '{print $1}' | xargs -r -L 1 virsh vol-delete --pool default +vagrant box list | awk '{print $1}' | xargs -r -L 1 vagrant box remove diff --git a/distros/centos-stream/supports.yml b/distros/centos-stream/supports.yml new file mode 100644 index 0000000..e557d71 --- /dev/null +++ b/distros/centos-stream/supports.yml @@ -0,0 +1,10 @@ +8: + - arch: x86_64 + provider: qemu + - arch: x86_64 + provider: virtualbox-iso +9: + - arch: x86_64 + provider: qemu + - arch: x86_64 + provider: virtualbox-iso diff --git a/distros/centos/supports.yml b/distros/centos/supports.yml new file mode 100644 index 0000000..be35888 --- /dev/null +++ b/distros/centos/supports.yml @@ -0,0 +1,5 @@ +7: +- arch: x86_64 + provider: qemu +- arch: x86_64 + provider: virtualbox-iso diff --git a/distros/debian/supports.yml b/distros/debian/supports.yml new file mode 100644 index 0000000..ea2822c --- /dev/null +++ b/distros/debian/supports.yml @@ -0,0 +1,12 @@ +9: + - arch: x86_64 + provider: qemu +10: + - arch: x86_64 + provider: qemu +11: + - arch: x86_64 + provider: qemu +12: + - arch: x86_64 + provider: qemu diff --git a/lib/__init__.py b/lib/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/lib/build.py b/lib/build.py new file mode 100644 index 0000000..9f48cf8 --- /dev/null +++ b/lib/build.py @@ -0,0 +1,22 @@ +from provider import Provider + + +class Build: + def __init__(self, distro, version, provider: Provider): + self.distro: str = distro + self.version: str = str(version) + self.provider: str = provider + + @property + def var_file(self): + return f"-var-file=distros/{self.distro}/{self.version}/{self.provider.arch}.pkrvars.hcl" + + @property + def only(self): + return f"-only={self.provider}" + + def __str__(self) -> str: + return f"{self.distro} {self.version}: {self.provider}" + + def __repr__(self) -> str: + return str(self) diff --git a/lib/distro.py b/lib/distro.py new file mode 100644 index 0000000..30de90f --- /dev/null +++ b/lib/distro.py @@ -0,0 +1,26 @@ +from provider import Provider +from build import Build + + +class Distro: + def __init__(self, name: str, support: map): + self.name = name + self.builds = [] + for version, matrix in support.items(): + for support in matrix: + provider = Provider(support["provider"], support["arch"]) + build = Build(self.name, version, provider) + self.builds.append(build) + + def __str__(self) -> str: + return f"{self.name}" + + def __repr__(self) -> str: + return f"{self.name}: {' '.join(self.versions)}" + + @property + def versions(self) -> set[str]: + return set([b.version for b in self.builds]) + + def builds_for_version(self, version: str) -> set[Build]: + return set(filter(lambda x: x.version == version, self.builds)) diff --git a/lib/provider.py b/lib/provider.py new file mode 100644 index 0000000..49fc2de --- /dev/null +++ b/lib/provider.py @@ -0,0 +1,7 @@ +class Provider: + def __init__(self, name, arch): + self.name = name + self.arch = arch + + def __str__(self) -> str: + return f"{self.name}.{self.arch}" diff --git a/lib/support.py b/lib/support.py new file mode 100644 index 0000000..9f402c9 --- /dev/null +++ b/lib/support.py @@ -0,0 +1,23 @@ +from distro import Distro +from provider import Provider +from pathlib import Path +from yaml import load, Loader + + +BASE = Path(__file__).parent.parent + + +class Support: + def __init__(self): + self.base = BASE + self.distros = self.__get_distros() + + def __get_distros(self) -> map: + distros = {} + distros_dir = self.base / "distros" + for f in distros_dir.glob("**/supports.yml"): + name = f.parent.name + with open(f, "r") as fp: + support_yml = load(fp, Loader=Loader) + distros[name] = Distro(name, support_yml) + return distros diff --git a/test.xsh b/test.xsh index 3666867..0ce9dbd 100755 --- a/test.xsh +++ b/test.xsh @@ -24,14 +24,6 @@ def get_providers(): return providers -def get_builds(): - "List of builds as supported in distros/" - base = pathlib.Path(__file__) - distros = base.parent / "distros" - builds = [str(p.stem).rsplit(".", 1)[0] for p in distros.glob("**/*.pkrvars.hcl")] - return builds - - def get_parser(args, unsupported=set()): parser = argparse.ArgumentParser("Builder") parser.add_argument("--headless", action="store_true")