From cdcfa1277edcd7049d628fc1fb927bf5896eaa50 Mon Sep 17 00:00:00 2001 From: Tom Gundersen Date: Thu, 6 Jun 2019 19:28:22 +0200 Subject: [PATCH] osbuild: make state handling generic Rather than treating the dnf-cache specially, give each stage its own state directory that they can reuse. This should obviously be used with care by the stages in order to make the builds reproducible. --- osbuild | 5 +++++ stages/io.weldr.anaconda | 2 +- stages/io.weldr.ansible | 2 +- stages/io.weldr.dnf | 7 ++----- stages/io.weldr.locale | 2 +- stages/io.weldr.noop | 2 +- stages/io.weldr.qcow2 | 2 +- stages/io.weldr.remove-uniqueness | 2 +- stages/io.weldr.script | 2 +- stages/io.weldr.systemd | 2 +- 10 files changed, 15 insertions(+), 13 deletions(-) diff --git a/osbuild b/osbuild index 28a206a4..058103de 100755 --- a/osbuild +++ b/osbuild @@ -47,9 +47,14 @@ def main(pipeline_path, from_archive, save): name = stage["name"] options = stage.get("options", {}) options["tree"] = os.path.abspath(tree) + options["state"] = f"{os.getcwd()}/state/{name}" options_str = json.dumps(options, indent=2) + r = subprocess.run(["mkdir", "-p", f"{os.getcwd()}/state/{name}"]) + if r.returncode != 0: + return + print() print(f"{RESET}{BOLD}{i}. {name}{RESET} {options_str}") print() diff --git a/stages/io.weldr.anaconda b/stages/io.weldr.anaconda index 229a541c..05fda56e 100755 --- a/stages/io.weldr.anaconda +++ b/stages/io.weldr.anaconda @@ -5,7 +5,7 @@ import os import subprocess import sys -def main(tree, kickstart, skip_package_install=False): +def main(tree, state, kickstart, skip_package_install=False): with open("/tmp/kickstart.ks", "w") as f: if skip_package_install: subprocess.run(["tar", "cvf", "/tmp/empty.tar", "--files-from", "/dev/null"]) diff --git a/stages/io.weldr.ansible b/stages/io.weldr.ansible index 7007807e..1ea182b4 100755 --- a/stages/io.weldr.ansible +++ b/stages/io.weldr.ansible @@ -6,7 +6,7 @@ import subprocess import sys -def main(tree, playbook): +def main(tree, state, playbook): with open("/tmp/inventory", "w") as f: f.write(f"osbuild-tree ansible_connection=chroot ansible_host={tree} ansible_python_interpreter=/usr/bin/python3") diff --git a/stages/io.weldr.dnf b/stages/io.weldr.dnf index d7014231..275b3ade 100755 --- a/stages/io.weldr.dnf +++ b/stages/io.weldr.dnf @@ -7,15 +7,12 @@ import subprocess import sys -def main(tree, repos, packages, releasever, cache=None): +def main(tree, state, repos, packages, releasever): with open("/tmp/dnf.conf", "w") as conf: p = configparser.ConfigParser() p.read_dict(repos) p.write(conf) - if not cache: - cache = f"/tmp/dnf-cache" - script = f""" set -e mkdir -p {tree}/dev {tree}/sys {tree}/proc @@ -33,7 +30,7 @@ def main(tree, repos, packages, releasever, cache=None): "dnf", "-yv", "--installroot", tree, "--setopt", "reposdir=", - "--setopt", f"cachedir={cache}", + "--setopt", f"cachedir={state}/dnf-cache", "--setopt", "keepcache=True", "--setopt", "install_weak_deps=False", "--releasever", releasever, diff --git a/stages/io.weldr.locale b/stages/io.weldr.locale index d03f721b..2fc6386d 100755 --- a/stages/io.weldr.locale +++ b/stages/io.weldr.locale @@ -3,7 +3,7 @@ import json import sys -def main(tree, language, vc_keymap=None): +def main(tree, state, language, vc_keymap=None): with open(f"{tree}/etc/locale.conf", "w") as f: f.write(f'LANG="{language}"\n') diff --git a/stages/io.weldr.noop b/stages/io.weldr.noop index 52cc6d4e..45ff696e 100755 --- a/stages/io.weldr.noop +++ b/stages/io.weldr.noop @@ -3,7 +3,7 @@ import json import sys -def main(tree, **options): +def main(tree, state, **options): print("Not doing anything with these options:", json.dumps(options)) if __name__ == '__main__': diff --git a/stages/io.weldr.qcow2 b/stages/io.weldr.qcow2 index 52ceef2a..795ba541 100755 --- a/stages/io.weldr.qcow2 +++ b/stages/io.weldr.qcow2 @@ -41,7 +41,7 @@ def loop_device(image): finally: subprocess.run(["losetup", "-d", loop], check=True) -def main(tree, target): +def main(tree, state, target): size = tree_size(tree) with tempfile.TemporaryDirectory(dir=os.getcwd()) as workdir: diff --git a/stages/io.weldr.remove-uniqueness b/stages/io.weldr.remove-uniqueness index f3012f5c..a09e1335 100755 --- a/stages/io.weldr.remove-uniqueness +++ b/stages/io.weldr.remove-uniqueness @@ -5,7 +5,7 @@ import json import os import sys -def main(tree): +def main(tree, state): with contextlib.suppress(FileNotFoundError): os.unlink(f"{tree}/etc/machine-id") os.unlink(f"{tree}/var/lib/systemd/random-seed") diff --git a/stages/io.weldr.script b/stages/io.weldr.script index 3dcb374c..cdc3d3bf 100755 --- a/stages/io.weldr.script +++ b/stages/io.weldr.script @@ -7,7 +7,7 @@ import subprocess import sys -def main(tree, script): +def main(tree, state, script): scriptfile = f"{tree}/osbuild-script" with open(scriptfile, "w") as f: diff --git a/stages/io.weldr.systemd b/stages/io.weldr.systemd index 458c8dd6..5dfce772 100755 --- a/stages/io.weldr.systemd +++ b/stages/io.weldr.systemd @@ -4,7 +4,7 @@ import json import os import subprocess -def main(tree, enabled_services): +def main(tree, state, enabled_services): for service in enabled_services: subprocess.run([f"{tree}/usr/bin/systemctl", "--root", tree, "enable", service], check=True)