Skip to content

Commit

Permalink
ci: warm-up docker images
Browse files Browse the repository at this point in the history
  • Loading branch information
mayeut committed Nov 25, 2024
1 parent 116bf74 commit 5f25a79
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 0 deletions.
1 change: 1 addition & 0 deletions pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,7 @@ docs = [
]
test = [
"build",
"filelock",
"jinja2",
"pytest-timeout",
"pytest-xdist",
Expand Down
74 changes: 74 additions & 0 deletions test/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@
from typing import Generator

import pytest
from filelock import FileLock

from cibuildwheel.architecture import Architecture
from cibuildwheel.options import CommandLineArguments, Options
from cibuildwheel.util import detect_ci_provider, find_uv

from .utils import EMULATED_ARCHS, platform
Expand All @@ -28,6 +31,77 @@ def pytest_addoption(parser: pytest.Parser) -> None:
)


def docker_warmup(request: pytest.FixtureRequest) -> None:
machine = request.config.getoption("--run-emulation", default=None)
if machine is None:
archs = [arch.value for arch in Architecture.auto_archs("linux")]
elif machine == "all":
archs = EMULATED_ARCHS
else:
archs = [machine]
options = Options(
platform="linux",
command_line_arguments=CommandLineArguments.defaults(),
env={},
defaults=True,
)
build_options = options.build_options(None)
assert build_options.manylinux_images is not None
assert build_options.musllinux_images is not None
images = [build_options.manylinux_images[arch] for arch in archs] + [
build_options.musllinux_images[arch] for arch in archs
]
for image in images:
try:
container_id = subprocess.run(
[
"docker",
"create",
image,
"bash",
"-c",
"manylinux-interpreters ensure-all && cpython3.13 -m pip download -d /tmp setuptools wheel pytest",
],
text=True,
check=True,
stdout=subprocess.PIPE,
).stdout.strip()
subprocess.run(["docker", "start", container_id], check=True, stdout=subprocess.DEVNULL)
exit_code = subprocess.run(
["docker", "wait", container_id], text=True, check=True, stdout=subprocess.PIPE
).stdout.strip()
if exit_code == "0":
subprocess.run(
["docker", "commit", container_id, image], check=True, stdout=subprocess.DEVNULL
)
subprocess.run(["docker", "rm", container_id], check=True, stdout=subprocess.DEVNULL)
except subprocess.CalledProcessError:
print(f"failed to warm-up {image} image")


@pytest.fixture(scope="session", autouse=True)
def docker_warmup_fixture(
request: pytest.FixtureRequest, tmp_path_factory: pytest.TempPathFactory, worker_id: str
) -> None:
# if we're in CI testing linux, let's warm-up docker images
if detect_ci_provider() is None or platform != "linux":
return None

if worker_id == "master":
# not executing with multiple workers
return docker_warmup(request)

# get the temp directory shared by all workers
root_tmp_dir = tmp_path_factory.getbasetemp().parent

fn = root_tmp_dir / "warmup.done"
with FileLock(str(fn) + ".lock"):
if not fn.is_file():
docker_warmup(request)
fn.write_text("done")
return None


@pytest.fixture(params=["pip", "build"])
def build_frontend_env_nouv(request: pytest.FixtureRequest) -> dict[str, str]:
frontend = request.param
Expand Down

0 comments on commit 5f25a79

Please sign in to comment.