taler-deployment

Deployment scripts and configuration files
Log | Files | Refs | README

commit ab5e7f4e375da363cdaf0dbc82e3cde0ac8f18ee
parent 00e573e955bda689eea20ec4d7cd58506945d0c7
Author: Florian Dold <florian@dold.me>
Date:   Thu, 27 Jun 2024 22:35:58 +0200

packaging-ng: propagate outdated deps

Diffstat:
Mpackaging/ng/buildconfig/taler-harness.tag | 2+-
Mpackaging/ng/buildconfig/taler-wallet-cli.tag | 2+-
Mpackaging/ng/taler-pkg | 124++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------
3 files changed, 87 insertions(+), 41 deletions(-)

diff --git a/packaging/ng/buildconfig/taler-harness.tag b/packaging/ng/buildconfig/taler-harness.tag @@ -1 +1 @@ -v0.12.1 +v0.12.2 diff --git a/packaging/ng/buildconfig/taler-wallet-cli.tag b/packaging/ng/buildconfig/taler-wallet-cli.tag @@ -1 +1 @@ -v0.12.1 +v0.12.2 diff --git a/packaging/ng/taler-pkg b/packaging/ng/taler-pkg @@ -35,8 +35,15 @@ deps = { "gnunet-gtk": ["gnunet"], } - -def toposort(roots): +# Compute reverse dependencies +rdeps = {} +for n1, d in deps.items(): + for n2 in d: + rd = rdeps.setdefault(n2, []) + if n1 not in rd: + rd.append(n1) + +def buildsort(roots): """Toposort transitive closure of roots based on deps""" out = [] stack = list(roots) @@ -64,76 +71,114 @@ def toposort(roots): return out +def propagate_outdated(outdated): + """Propagate outdatedness to dependees""" + closure = set() + q = list(outdated) + while len(q): + n = q.pop() + closure.add(n) + for r in rdeps.get(n, []): + if r not in closure: + closure.add(r) + q.append(r) + return closure + + +def find_outdated(pkgdir, roots): + """Find outdated components based on tag files""" + outdated = set() + for component in roots: + ver_requested = open(f"buildconfig/{component}.tag").read().strip() + built_tag_file = pkgdir / f"{component}.built.tag" + ver_built = None + if built_tag_file.exists(): + ver_built = open(built_tag_file).read().strip() + if ver_built != ver_requested: + outdated.add(component) + print(component, ver_built, "->", ver_requested) + return outdated + + def build(cfg): distro = cfg.distro print("building", distro) dockerfile = f"distros/Dockerfile.{distro}" image_tag = f"taler-packaging-{distro}:latest" pkgdir = Path(f"packages/{distro}").absolute() - subprocess.run(["podman", "build", "-t", image_tag, "-f", dockerfile], check=True) - - outdated_components = [] - # First, find out components that need to be built - for component in components: - ver_requested = open(f"buildconfig/{component}.tag").read().strip() - built_tag_file = pkgdir / f"{component}.built.tag" - ver_built = None - if built_tag_file.exists(): - ver_built = open(built_tag_file).read().strip() - if ver_built != ver_requested: - outdated_components.append(component) - print(component, ver_built, '->', ver_requested) + if not cfg.dry: + subprocess.run( + ["podman", "build", "-t", image_tag, "-f", dockerfile], check=True + ) - buildorder = toposort(outdated_components) + # Sort components by their dependencies + buildorder = buildsort(components) print("build order:", buildorder) + outdated = find_outdated(pkgdir, buildorder) + + # Propagate outdatedness to dependees + closure = propagate_outdated(outdated) + + print("outdated closure", closure) + for component in buildorder: + if component not in closure: + continue print("building", component) pkgdir.mkdir(parents=True, exist_ok=True) - subprocess.run( - [ - "podman", - "run", - "-it", - "--entrypoint=/bin/bash", - "--security-opt", - "label=disable", - "--mount", - f"type=bind,source={mydir}/buildscripts,target=/buildscripts,readonly", - "--mount", - f"type=bind,source={mydir}/buildconfig,target=/buildconfig,readonly", - "--mount", - f"type=bind,source={pkgdir},target=/pkgdir", - image_tag, - "/buildscripts/generic.sh", - component, - ], - check=True, - ) + cmd = [ + "podman", + "run", + "-it", + "--entrypoint=/bin/bash", + "--security-opt", + "label=disable", + "--mount", + f"type=bind,source={mydir}/buildscripts,target=/buildscripts,readonly", + "--mount", + f"type=bind,source={mydir}/buildconfig,target=/buildconfig,readonly", + "--mount", + f"type=bind,source={pkgdir},target=/pkgdir", + image_tag, + "/buildscripts/generic.sh", + component, + ] + if not cfg.dry: + subprocess.run( + cmd, + check=True, + ) + def print_latest(cfg): subprocess.run(["./helpers/print-latest-versions"], check=True) + def show_order(cfg): - buildorder = toposort(list(cfg.roots)) + buildorder = buildsort(list(cfg.roots)) print("build order:", buildorder) + def main(): - parser = argparse.ArgumentParser(prog="taler-pkg", description="Taler Packaging Helper") + parser = argparse.ArgumentParser( + prog="taler-pkg", description="Taler Packaging Helper" + ) subparsers = parser.add_subparsers(help="Run a subcommand", metavar="SUBCOMMAND") parser_build = subparsers.add_parser("build", help="Build packages for distro.") parser_build.set_defaults(func=build) parser_build.add_argument("distro") + parser_build.add_argument("--dry", help="Dry run", action="store_true", default=False) parser_show_latest = subparsers.add_parser( "show-latest", help="Show latest version of packages." ) parser_show_latest.set_defaults(func=print_latest) - parser_show_order= subparsers.add_parser("show-order", help="Show build order.") + parser_show_order = subparsers.add_parser("show-order", help="Show build order.") parser_show_order.set_defaults(func=show_order) parser_show_order.add_argument("roots", nargs="+") @@ -144,5 +189,6 @@ def main(): else: args.func(args) + if __name__ == "__main__": main()