diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 663278101..221bd8447 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -64,6 +64,11 @@ jobs: - name: Set up QEMU if: runner.os == 'Linux' uses: docker/setup-qemu-action@v3 + with: + # This should be temporary + # xref https://github.com/docker/setup-qemu-action/issues/188 + # xref https://github.com/tonistiigi/binfmt/issues/215 + image: tonistiigi/binfmt:qemu-v8.1.5 - name: Install dependencies run: | @@ -165,6 +170,11 @@ jobs: - name: Set up QEMU uses: docker/setup-qemu-action@v3 + with: + # This should be temporary + # xref https://github.com/docker/setup-qemu-action/issues/188 + # xref https://github.com/tonistiigi/binfmt/issues/215 + image: tonistiigi/binfmt:qemu-v8.1.5 - name: Run the emulation tests run: uv run pytest --run-emulation ${{ matrix.arch }} test/test_emulation.py diff --git a/cibuildwheel/resources/constraints-pyodide312.txt b/cibuildwheel/resources/constraints-pyodide312.txt index f9cce4660..b49fcb950 100644 --- a/cibuildwheel/resources/constraints-pyodide312.txt +++ b/cibuildwheel/resources/constraints-pyodide312.txt @@ -23,7 +23,7 @@ cmake==3.31.4 # via pyodide-build distlib==0.3.9 # via virtualenv -filelock==3.16.1 +filelock==3.17.0 # via virtualenv h11==0.14.0 # via httpcore @@ -48,11 +48,11 @@ packaging==24.2 # build # pyodide-build # unearth -pip==24.3.1 +pip==25.0 # via -r .nox/update_constraints/tmp/constraints-pyodide.in platformdirs==4.3.6 # via virtualenv -pydantic==2.10.5 +pydantic==2.10.6 # via # pyodide-build # pyodide-lock diff --git a/cibuildwheel/resources/constraints-python310.txt b/cibuildwheel/resources/constraints-python310.txt index f531e3bb0..3aacad141 100644 --- a/cibuildwheel/resources/constraints-python310.txt +++ b/cibuildwheel/resources/constraints-python310.txt @@ -8,9 +8,9 @@ delocate==0.12.0 # via -r cibuildwheel/resources/constraints.in distlib==0.3.9 # via virtualenv -filelock==3.16.1 +filelock==3.17.0 # via virtualenv -importlib-metadata==8.5.0 +importlib-metadata==8.6.1 # via build macholib==1.16.3 # via delocate @@ -18,7 +18,7 @@ packaging==24.2 # via # build # delocate -pip==24.3.1 +pip==25.0 # via -r cibuildwheel/resources/constraints.in platformdirs==4.3.6 # via virtualenv diff --git a/cibuildwheel/resources/constraints-python311.txt b/cibuildwheel/resources/constraints-python311.txt index d4dfbfc65..83e17c449 100644 --- a/cibuildwheel/resources/constraints-python311.txt +++ b/cibuildwheel/resources/constraints-python311.txt @@ -8,7 +8,7 @@ delocate==0.12.0 # via -r cibuildwheel/resources/constraints.in distlib==0.3.9 # via virtualenv -filelock==3.16.1 +filelock==3.17.0 # via virtualenv macholib==1.16.3 # via delocate @@ -16,7 +16,7 @@ packaging==24.2 # via # build # delocate -pip==24.3.1 +pip==25.0 # via -r cibuildwheel/resources/constraints.in platformdirs==4.3.6 # via virtualenv diff --git a/cibuildwheel/resources/constraints-python312.txt b/cibuildwheel/resources/constraints-python312.txt index d4dfbfc65..83e17c449 100644 --- a/cibuildwheel/resources/constraints-python312.txt +++ b/cibuildwheel/resources/constraints-python312.txt @@ -8,7 +8,7 @@ delocate==0.12.0 # via -r cibuildwheel/resources/constraints.in distlib==0.3.9 # via virtualenv -filelock==3.16.1 +filelock==3.17.0 # via virtualenv macholib==1.16.3 # via delocate @@ -16,7 +16,7 @@ packaging==24.2 # via # build # delocate -pip==24.3.1 +pip==25.0 # via -r cibuildwheel/resources/constraints.in platformdirs==4.3.6 # via virtualenv diff --git a/cibuildwheel/resources/constraints-python313.txt b/cibuildwheel/resources/constraints-python313.txt index d4dfbfc65..83e17c449 100644 --- a/cibuildwheel/resources/constraints-python313.txt +++ b/cibuildwheel/resources/constraints-python313.txt @@ -8,7 +8,7 @@ delocate==0.12.0 # via -r cibuildwheel/resources/constraints.in distlib==0.3.9 # via virtualenv -filelock==3.16.1 +filelock==3.17.0 # via virtualenv macholib==1.16.3 # via delocate @@ -16,7 +16,7 @@ packaging==24.2 # via # build # delocate -pip==24.3.1 +pip==25.0 # via -r cibuildwheel/resources/constraints.in platformdirs==4.3.6 # via virtualenv diff --git a/cibuildwheel/resources/constraints-python38.txt b/cibuildwheel/resources/constraints-python38.txt index 9c7a45e7b..8c8963c19 100644 --- a/cibuildwheel/resources/constraints-python38.txt +++ b/cibuildwheel/resources/constraints-python38.txt @@ -18,7 +18,7 @@ packaging==24.2 # via # build # delocate -pip==24.3.1 +pip==25.0 # via -r cibuildwheel/resources/constraints.in platformdirs==4.3.6 # via virtualenv diff --git a/cibuildwheel/resources/constraints-python39.txt b/cibuildwheel/resources/constraints-python39.txt index f531e3bb0..3aacad141 100644 --- a/cibuildwheel/resources/constraints-python39.txt +++ b/cibuildwheel/resources/constraints-python39.txt @@ -8,9 +8,9 @@ delocate==0.12.0 # via -r cibuildwheel/resources/constraints.in distlib==0.3.9 # via virtualenv -filelock==3.16.1 +filelock==3.17.0 # via virtualenv -importlib-metadata==8.5.0 +importlib-metadata==8.6.1 # via build macholib==1.16.3 # via delocate @@ -18,7 +18,7 @@ packaging==24.2 # via # build # delocate -pip==24.3.1 +pip==25.0 # via -r cibuildwheel/resources/constraints.in platformdirs==4.3.6 # via virtualenv diff --git a/cibuildwheel/resources/constraints.txt b/cibuildwheel/resources/constraints.txt index d4dfbfc65..83e17c449 100644 --- a/cibuildwheel/resources/constraints.txt +++ b/cibuildwheel/resources/constraints.txt @@ -8,7 +8,7 @@ delocate==0.12.0 # via -r cibuildwheel/resources/constraints.in distlib==0.3.9 # via virtualenv -filelock==3.16.1 +filelock==3.17.0 # via virtualenv macholib==1.16.3 # via delocate @@ -16,7 +16,7 @@ packaging==24.2 # via # build # delocate -pip==24.3.1 +pip==25.0 # via -r cibuildwheel/resources/constraints.in platformdirs==4.3.6 # via virtualenv diff --git a/cibuildwheel/resources/nodejs.toml b/cibuildwheel/resources/nodejs.toml index 347daccb9..30e8d90e0 100644 --- a/cibuildwheel/resources/nodejs.toml +++ b/cibuildwheel/resources/nodejs.toml @@ -1,3 +1,3 @@ url = "https://nodejs.org/dist/" -v22 = "v22.13.0" -v20 = "v20.18.1" +v22 = "v22.13.1" +v20 = "v20.18.2" diff --git a/cibuildwheel/resources/pinned_docker_images.cfg b/cibuildwheel/resources/pinned_docker_images.cfg index 2be903300..7fb0892a9 100644 --- a/cibuildwheel/resources/pinned_docker_images.cfg +++ b/cibuildwheel/resources/pinned_docker_images.cfg @@ -1,64 +1,64 @@ [x86_64] manylinux1 = quay.io/pypa/manylinux1_x86_64:2024-04-29-76807b8 manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2022-08-05-4535177 -manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2025.01.19-2 +manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2025.01.24-1 manylinux_2_24 = quay.io/pypa/manylinux_2_24_x86_64:2022-12-26-0d38463 -manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2025.01.19-2 -manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2025.01.19-2 +manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2025.01.24-1 +manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2025.01.24-1 musllinux_1_1 = quay.io/pypa/musllinux_1_1_x86_64:2024.10.26-1 -musllinux_1_2 = quay.io/pypa/musllinux_1_2_x86_64:2025.01.19-2 +musllinux_1_2 = quay.io/pypa/musllinux_1_2_x86_64:2025.01.24-1 [i686] manylinux1 = quay.io/pypa/manylinux1_i686:2024-04-29-76807b8 manylinux2010 = quay.io/pypa/manylinux2010_i686:2022-08-05-4535177 -manylinux2014 = quay.io/pypa/manylinux2014_i686:2025.01.19-2 +manylinux2014 = quay.io/pypa/manylinux2014_i686:2025.01.24-1 manylinux_2_24 = quay.io/pypa/manylinux_2_24_i686:2022-12-26-0d38463 musllinux_1_1 = quay.io/pypa/musllinux_1_1_i686:2024.10.26-1 -musllinux_1_2 = quay.io/pypa/musllinux_1_2_i686:2025.01.19-2 +musllinux_1_2 = quay.io/pypa/musllinux_1_2_i686:2025.01.24-1 [pypy_x86_64] manylinux2010 = quay.io/pypa/manylinux2010_x86_64:2022-08-05-4535177 -manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2025.01.19-2 +manylinux2014 = quay.io/pypa/manylinux2014_x86_64:2025.01.24-1 manylinux_2_24 = quay.io/pypa/manylinux_2_24_x86_64:2022-12-26-0d38463 -manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2025.01.19-2 -manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2025.01.19-2 +manylinux_2_28 = quay.io/pypa/manylinux_2_28_x86_64:2025.01.24-1 +manylinux_2_34 = quay.io/pypa/manylinux_2_34_x86_64:2025.01.24-1 [pypy_i686] manylinux2010 = quay.io/pypa/manylinux2010_i686:2022-08-05-4535177 -manylinux2014 = quay.io/pypa/manylinux2014_i686:2025.01.19-2 +manylinux2014 = quay.io/pypa/manylinux2014_i686:2025.01.24-1 manylinux_2_24 = quay.io/pypa/manylinux_2_24_i686:2022-12-26-0d38463 [aarch64] -manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2025.01.19-2 +manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2025.01.24-1 manylinux_2_24 = quay.io/pypa/manylinux_2_24_aarch64:2022-12-26-0d38463 -manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2025.01.19-2 -manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2025.01.19-2 +manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2025.01.24-1 +manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2025.01.24-1 musllinux_1_1 = quay.io/pypa/musllinux_1_1_aarch64:2024.10.26-1 -musllinux_1_2 = quay.io/pypa/musllinux_1_2_aarch64:2025.01.19-2 +musllinux_1_2 = quay.io/pypa/musllinux_1_2_aarch64:2025.01.24-1 [ppc64le] -manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2025.01.19-2 +manylinux2014 = quay.io/pypa/manylinux2014_ppc64le:2025.01.24-1 manylinux_2_24 = quay.io/pypa/manylinux_2_24_ppc64le:2022-12-26-0d38463 -manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le:2025.01.19-2 -manylinux_2_34 = quay.io/pypa/manylinux_2_34_ppc64le:2025.01.19-2 +manylinux_2_28 = quay.io/pypa/manylinux_2_28_ppc64le:2025.01.24-1 +manylinux_2_34 = quay.io/pypa/manylinux_2_34_ppc64le:2025.01.24-1 musllinux_1_1 = quay.io/pypa/musllinux_1_1_ppc64le:2024.10.26-1 -musllinux_1_2 = quay.io/pypa/musllinux_1_2_ppc64le:2025.01.19-2 +musllinux_1_2 = quay.io/pypa/musllinux_1_2_ppc64le:2025.01.24-1 [s390x] -manylinux2014 = quay.io/pypa/manylinux2014_s390x:2025.01.19-2 +manylinux2014 = quay.io/pypa/manylinux2014_s390x:2025.01.24-1 manylinux_2_24 = quay.io/pypa/manylinux_2_24_s390x:2022-12-26-0d38463 -manylinux_2_28 = quay.io/pypa/manylinux_2_28_s390x:2025.01.19-2 -manylinux_2_34 = quay.io/pypa/manylinux_2_34_s390x:2025.01.19-2 +manylinux_2_28 = quay.io/pypa/manylinux_2_28_s390x:2025.01.24-1 +manylinux_2_34 = quay.io/pypa/manylinux_2_34_s390x:2025.01.24-1 musllinux_1_1 = quay.io/pypa/musllinux_1_1_s390x:2024.10.26-1 -musllinux_1_2 = quay.io/pypa/musllinux_1_2_s390x:2025.01.19-2 +musllinux_1_2 = quay.io/pypa/musllinux_1_2_s390x:2025.01.24-1 [pypy_aarch64] -manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2025.01.19-2 +manylinux2014 = quay.io/pypa/manylinux2014_aarch64:2025.01.24-1 manylinux_2_24 = quay.io/pypa/manylinux_2_24_aarch64:2022-12-26-0d38463 -manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2025.01.19-2 -manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2025.01.19-2 +manylinux_2_28 = quay.io/pypa/manylinux_2_28_aarch64:2025.01.24-1 +manylinux_2_34 = quay.io/pypa/manylinux_2_34_aarch64:2025.01.24-1 [armv7l] -manylinux_2_31 = ghcr.io/mayeut/manylinux_2_31:2025.01.19-1 -musllinux_1_2 = quay.io/pypa/musllinux_1_2_armv7l:2025.01.19-2 +manylinux_2_31 = ghcr.io/mayeut/manylinux_2_31:2025.01.25-1 +musllinux_1_2 = quay.io/pypa/musllinux_1_2_armv7l:2025.01.24-1 diff --git a/docs/working-examples.md b/docs/working-examples.md index 478d4670f..d8e2a92b3 100644 --- a/docs/working-examples.md +++ b/docs/working-examples.md @@ -47,8 +47,8 @@ title: Working examples | [coverage.py][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | The coverage tool for Python | | [PyCryptodome][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | A self-contained cryptographic library for Python | | [Line Profiler][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Line-by-line profiling for Python | -| [PyYAML][] | ![github icon][] | ![apple icon][] | Canonical source repository for PyYAML | | [PyAV][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Pythonic bindings for FFmpeg's libraries. | +| [PyYAML][] | ![github icon][] | ![apple icon][] | Canonical source repository for PyYAML | | [numexpr][] | ![github icon][] ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Fast numerical array expression evaluator for Python, NumPy, Pandas, PyTables and more | | [pikepdf][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | A Python library for reading and writing PDF, powered by QPDF | | [h5py][] | ![azurepipelines icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | HDF5 for Python -- The h5py package is a Pythonic interface to the HDF5 binary data format. | @@ -92,8 +92,8 @@ title: Working examples | [iDynTree][] | ![github icon][] | ![linux icon][] | Uses manylinux_2_24 | | [Confluent client for Kafka][] | ![travisci icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | setup in `tools/wheels/build-wheels.bat` | | [streaming-form-data][] | ![github icon][] | ![apple icon][] ![linux icon][] ![windows icon][] | Streaming parser for multipart/form-data written in Cython | -| [bx-python][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | A library that includes Cython extensions. | | [power-grid-model][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Python/C++ library for distribution power system analysis | +| [bx-python][] | ![travisci icon][] | ![apple icon][] ![linux icon][] | A library that includes Cython extensions. | | [pybase64][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Fast Base64 encoding/decoding in Python | | [boost-histogram][] | ![github icon][] ![travisci icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | Supports full range of wheels, including PyPy and alternate archs. | | [Python-WebRTC][] | ![github icon][] | ![windows icon][] ![apple icon][] ![linux icon][] | a Python extension that provides bindings to WebRTC M92 | @@ -157,8 +157,8 @@ title: Working examples [coverage.py]: https://github.com/nedbat/coveragepy [PyCryptodome]: https://github.com/Legrandin/pycryptodome [Line Profiler]: https://github.com/pyutils/line_profiler -[PyYAML]: https://github.com/yaml/pyyaml [PyAV]: https://github.com/PyAV-Org/PyAV +[PyYAML]: https://github.com/yaml/pyyaml [numexpr]: https://github.com/pydata/numexpr [pikepdf]: https://github.com/pikepdf/pikepdf [h5py]: https://github.com/h5py/h5py @@ -202,8 +202,8 @@ title: Working examples [iDynTree]: https://github.com/robotology/idyntree [Confluent client for Kafka]: https://github.com/confluentinc/confluent-kafka-python [streaming-form-data]: https://github.com/siddhantgoel/streaming-form-data -[bx-python]: https://github.com/bxlab/bx-python [power-grid-model]: https://github.com/PowerGridModel/power-grid-model +[bx-python]: https://github.com/bxlab/bx-python [pybase64]: https://github.com/mayeut/pybase64 [boost-histogram]: https://github.com/scikit-hep/boost-histogram [Python-WebRTC]: https://github.com/MarshalX/python-webrtc diff --git a/unit_test/oci_container_test.py b/unit_test/oci_container_test.py index 11d991d11..7c8e8456e 100644 --- a/unit_test/oci_container_test.py +++ b/unit_test/oci_container_test.py @@ -8,6 +8,7 @@ import subprocess import sys import textwrap +import time from contextlib import nullcontext from pathlib import Path, PurePath, PurePosixPath @@ -138,14 +139,28 @@ def test_cwd(container_engine): assert container.call(["pwd"], capture_output=True, cwd="/opt") == "/opt\n" -@pytest.mark.skipif( - pm == "s390x" and detect_ci_provider() == CIProvider.travis_ci, - reason="test is flaky on this platform, see https://github.com/pypa/cibuildwheel/pull/1961#issuecomment-2334678966", -) def test_container_removed(container_engine): + # test is flaky on some platforms, implement retry for 5 second + timeout = 50 # * 100 ms = 5s with OCIContainer( engine=container_engine, image=DEFAULT_IMAGE, oci_platform=DEFAULT_OCI_PLATFORM ) as container: + assert container.name is not None + container_name = container.name + for _ in range(timeout): + docker_containers_listing = subprocess.run( + f"{container.engine.name} container ls", + shell=True, + check=True, + stdout=subprocess.PIPE, + text=True, + ).stdout + if container_name in docker_containers_listing: + break + time.sleep(0.1) + assert container_name in docker_containers_listing + + for _ in range(timeout): docker_containers_listing = subprocess.run( f"{container.engine.name} container ls", shell=True, @@ -153,18 +168,10 @@ def test_container_removed(container_engine): stdout=subprocess.PIPE, text=True, ).stdout - assert container.name is not None - assert container.name in docker_containers_listing - old_container_name = container.name - - docker_containers_listing = subprocess.run( - f"{container.engine.name} container ls", - shell=True, - check=True, - stdout=subprocess.PIPE, - text=True, - ).stdout - assert old_container_name not in docker_containers_listing + if container_name not in docker_containers_listing: + break + time.sleep(0.1) + assert container_name not in docker_containers_listing def test_large_environment(container_engine):