cibuildwheel#

cibuildwheel vereinfacht die Erstellung von Python Wheels für die verschiedenen Plattformen und Python-Versionen durch Continuous Integration (CI) Workflows. Genauer gesagt baut es Manylinux-, macOS 10.9+- und Windows-Wheels für CPython und PyPy mit GitHub Actions, Azure Pipelines, Travis CI, AppVeyor, CircleCI, oder GitLab CI/CD.

Darüber hinaus bündelt es gemeinsam genutzte Bibliotheksabhängigkeiten unter Linux und macOS durch auditwheel und delocate.

Schließlich können die Tests auch gegen die Wheels laufen.

Siehe auch

GitHub Actions#

Um Linux-, macOS- und Windows-Wheels erstellen zu können, erstellt eine .github/workflows/build_wheels.yml-Datei in eurem GitHub Repo:

name: Build

on:
  workflow_dispatch:
  release:
    types:
      - published
workflow_dispatch

ermöglicht euch, in der grafischen Benutzeroberfläche auf eine Schaltfläche zu klicken, um einen Build auszulösen. Das ist perfekt zum manuellen Testen von Wheels vor einer Veröffentlichung eignet, da ihr sie einfach von artifacts herunterladen könnt.

Siehe auch

release

wird bei der Übertragung einer getaggten Version ausgeführt.

Siehe auch

Nun können die Wheels gebaut werden mit:

jobs:
  build_wheels:
    name: Build wheels on ${{ matrix.os }}
    runs-on: ${{ matrix.os }}
    strategy:
      matrix:
        os: [ubuntu-20.04, windows-2019, macos-11]

    steps:
      - uses: actions/checkout@v3

      - name: Build wheels
        uses: pypa/cibuildwheel@v2.15.0

Dadurch wird der CI-Workflow mit den folgenden Standardeinstellungen ausgeführt:

  • package-dir: .

  • output-dir: wheelhouse

  • config-file: "{package}/pyproject.toml"

Ihr könnt die Datei auch erweitern um die Wheels automatisch auf den Python Package Index (PyPI) hochzuladen. Hierfür solltet ihr jedoch zunächst noch eine Source Distribution erstellen, z.B. mit:

  make_sdist:
    name: Make SDist
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
      with:
        fetch-depth: 0  # Optional, use if you use setuptools_scm
        submodules: true  # Optional, use if you have submodules

    - name: Build SDist
      run: pipx run build --sdist

    - uses: actions/upload-artifact@v3
      with:
        path: dist/*.tar.gz

Zudem muss dieser GitHub-Workflow in den PyPI-Einstellungen eures Projekts eingestellt werden:

Nun könnt ihr endlich die Artefakte beider Jobs auf den PyPI hochladen:

  upload_all:
    needs: [build_wheels, make_sdist]
    environment: pypi
    permissions:
      id-token: write
    runs-on: ubuntu-latest
    if: github.event_name == 'release' && github.event.action == 'published'
    steps:
    - uses: actions/download-artifact@v3
      with:
        name: artifact
        path: dist

    - uses: pypa/gh-action-pypi-publish@release/v1

GitLab CI/CD#

Um Linux-Wheels mit GitLab CI/CD zu bauen, erstellt eine .gitlab-ci.yml-Datei in eurem Repository:

linux:
  image: python:3.8
  # make a docker daemon available for cibuildwheel to use
  services:
    - name: docker:dind
      entrypoint: ["env", "-u", "DOCKER_HOST"]
      command: ["dockerd-entrypoint.sh"]
  variables:
    DOCKER_HOST: tcp://docker:2375/
    DOCKER_DRIVER: overlay2
    # See https://github.com/docker-library/docker/pull/166
    DOCKER_TLS_CERTDIR: ""
  script:
    - curl -sSL https://get.docker.com/ | sh
    - python -m pip install cibuildwheel==2.15.0
    - cibuildwheel --output-dir wheelhouse
  artifacts:
    paths:
      - wheelhouse/

windows:
  image: mcr.microsoft.com/windows/servercore:1809
  before_script:
    - choco install python -y --version 3.8.6
    - choco install git.install -y
    - py -m pip install cibuildwheel==2.15.0
  script:
    - py -m cibuildwheel --output-dir wheelhouse --platform windows
  artifacts:
    paths:
      - wheelhouse/
  tags:
    - windows

Optionen#

cibuildwheel kann entweder über Umgebungsvariablen oder über eine Konfigurationsdatei wie pyproject.toml konfiguriert werden, z.B.:

[tool.cibuildwheel]
test-requires = "pytest"
test-command = "pytest {project}/tests"
build-verbosity = 1

# support Universal2 for Apple Silicon:
[tool.cibuildwheel.macos]
archs = ["auto", "universal2"]
test-skip = ["*universal2:arm64"]

Beispiele#