From a9718aa67d734e71e7b7eab9787b116c2910baeb Mon Sep 17 00:00:00 2001 From: Zanie Blue Date: Tue, 25 Feb 2025 18:12:57 -0600 Subject: [PATCH] Add option to keep build contexts on failure i.e., Docker containers and temporary directories --- cpython-unix/build.py | 14 +++++++------- pythonbuild/buildenv.py | 13 +++++++++---- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/cpython-unix/build.py b/cpython-unix/build.py index c90f7deb..be66143b 100755 --- a/cpython-unix/build.py +++ b/cpython-unix/build.py @@ -249,7 +249,7 @@ def simple_build( ): archive = download_entry(entry, DOWNLOADS_PATH) - with build_environment(client, image) as build_env: + with build_environment(client, image, entry) as build_env: if settings.get("needs_toolchain"): build_env.install_toolchain( BUILD, @@ -291,7 +291,7 @@ def build_binutils(client, image, host_platform): """Build binutils in the Docker image.""" archive = download_entry("binutils", DOWNLOADS_PATH) - with build_environment(client, image) as build_env: + with build_environment(client, image, "binutils") as build_env: install_sccache(build_env) build_env.copy_file(archive) @@ -332,7 +332,7 @@ def build_musl(client, image, host_platform: str, target_triple: str, build_opti musl = "musl-static" if static else "musl" musl_archive = download_entry(musl, DOWNLOADS_PATH) - with build_environment(client, image) as build_env: + with build_environment(client, image, "musl") as build_env: build_env.install_toolchain( BUILD, host_platform, @@ -362,7 +362,7 @@ def build_libedit( ): libedit_archive = download_entry("libedit", DOWNLOADS_PATH) - with build_environment(client, image) as build_env: + with build_environment(client, image, "libedit") as build_env: if settings.get("needs_toolchain"): build_env.install_toolchain( BUILD, @@ -397,7 +397,7 @@ def build_tix( tk_archive = download_entry("tk", DOWNLOADS_PATH) tix_archive = download_entry("tix", DOWNLOADS_PATH) - with build_environment(client, image) as build_env: + with build_environment(client, image, "tix") as build_env: if settings.get("needs_toolchain"): build_env.install_toolchain( BUILD, @@ -444,7 +444,7 @@ def build_cpython_host( """Build binutils in the Docker image.""" archive = download_entry(entry, DOWNLOADS_PATH) - with build_environment(client, image) as build_env: + with build_environment(client, image, "cpython-host") as build_env: python_version = DOWNLOADS[entry]["version"] build_env.install_toolchain( @@ -760,7 +760,7 @@ def build_cpython( setup_local_content = setup["setup_local"] extra_make_content = setup["make_data"] - with build_environment(client, image) as build_env: + with build_environment(client, image, "cpython") as build_env: if settings.get("needs_toolchain"): build_env.install_toolchain( BUILD, diff --git a/pythonbuild/buildenv.py b/pythonbuild/buildenv.py index 4b2a0e6e..90fa80c9 100644 --- a/pythonbuild/buildenv.py +++ b/pythonbuild/buildenv.py @@ -7,7 +7,9 @@ import io import os import pathlib +import random import shutil +import string import tarfile import tempfile @@ -264,22 +266,25 @@ def find_output_files(self, base_path, pattern): @contextlib.contextmanager -def build_environment(client, image): +def build_environment(client, image, name): if client is not None: + suffix = "".join(random.choices(string.ascii_uppercase + string.digits, k=8)) container = client.containers.run( - image, command=["/bin/sleep", "86400"], detach=True + image, command=["/bin/sleep", "86400"], name=f"{name}-{suffix}", detach=True ) td = None context = ContainerContext(container) else: container = None - td = tempfile.TemporaryDirectory() + td = tempfile.TemporaryDirectory(prefix=f"{name}-", delete=False) context = TempdirContext(td.name) try: yield context finally: - if container: + if os.environ.get("PYBUILD_KEEP_ENV"): + pass + elif container: container.stop(timeout=0) container.remove() else: