GitHub Actions [linux/mac/windows]

To build Linux, Mac, and Windows wheels using Github Actions, create a .github/workflows/build.yml file in your repo.

build.yml

name: Build

on: [push, pull_request]

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

    steps:
      - uses: actions/checkout@v2

      - uses: actions/setup-python@v2
        name: Install Python
        with:
          python-version: '3.7'

      - name: Install cibuildwheel
        run: |
          python -m pip install cibuildwheel==1.7.4

      - name: Install Visual C++ for Python 2.7
        if: runner.os == 'Windows'
        run: |
          choco install vcpython27 -f -y

      - name: Build wheels
        run: |
          python -m cibuildwheel --output-dir wheelhouse

      - uses: actions/upload-artifact@v2
        with:
          path: ./wheelhouse/*.whl

Commit this file, and push to Github - either to your default branch, or to a PR branch. The build should start automatically.

For more info on this file, check out the docs.

examples/github-deploy.yml extends this minimal example with a demonstration of how to automatically upload the built wheels to PyPI.

You can also use cibuildwheel directly as an action with uses: joerick/cibuildwheel@v1.7.4; this combines the download and run steps into a single action, and command line arguments are available via with:. This makes it easy to manage cibuildwheel updates via normal actions update mechanisms like dependabot, see Automatic updates.

Azure Pipelines [linux/mac/windows]

To build Linux, Mac, and Windows wheels on Azure Pipelines, create a azure-pipelines.yml file in your repo.

azure-pipelines.yml

jobs:
- job: linux
  pool: {vmImage: 'Ubuntu-16.04'}
  steps:
    - task: UsePythonVersion@0
    - bash: |
        set -o errexit
        python3 -m pip install --upgrade pip
        pip3 install cibuildwheel==1.7.4
      displayName: Install dependencies
    - bash: cibuildwheel --output-dir wheelhouse .
      displayName: Build wheels
    - task: PublishBuildArtifacts@1
      inputs: {pathtoPublish: 'wheelhouse'}

- job: macos
  pool: {vmImage: 'macOS-10.15'}
  steps:
    - task: UsePythonVersion@0
    - bash: |
        set -o errexit
        python3 -m pip install --upgrade pip
        python3 -m pip install cibuildwheel==1.7.4
      displayName: Install dependencies
    - bash: cibuildwheel --output-dir wheelhouse .
      displayName: Build wheels
    - task: PublishBuildArtifacts@1
      inputs: {pathtoPublish: wheelhouse}

- job: windows
  pool: {vmImage: 'vs2017-win2016'}
  steps:
    - task: UsePythonVersion@0
    - script: choco install vcpython27 -f -y
      displayName: Install Visual C++ for Python 2.7
    - bash: |
        set -o errexit
        python -m pip install --upgrade pip
        pip install cibuildwheel==1.7.4
      displayName: Install dependencies
    - bash: cibuildwheel --output-dir wheelhouse .
      displayName: Build wheels
    - task: PublishBuildArtifacts@1
      inputs: {pathtoPublish: 'wheelhouse'}

Note

To support Python 3.5 on Windows, make sure to specify the use of {vmImage: 'vs2017-win2016'} on Windows, to ensure the required toolchain is available.

Commit this file, enable building of your repo on Azure Pipelines, and push.

Wheels will be stored for you and available through the Pipelines interface. For more info on this file, check out the docs.

Travis CI [linux/mac/windows]

To build Linux, Mac, and Windows wheels on Travis CI, create a .travis.yml file in your repo.

.travis.yml

language: python

jobs:
  include:
    # perform a linux build
    - services: docker
    # perform a linux ARMv8 build
    - services: docker
      arch: arm64
    # perform a linux PPC64LE build
    - services: docker
      arch: ppc64le
    # perform a linux S390X build
    - services: docker
      arch: s390x
    # and a mac build
    - os: osx
      language: shell
    # and a windows build
    - os: windows
      language: shell
      before_install:
        - choco install python --version 3.8.0
        - export PATH="/c/Python38:/c/Python38/Scripts:$PATH"
        # make sure it's on PATH as 'python3'
        - ln -s /c/Python38/python.exe /c/Python38/python3.exe

install:
  - python3 -m pip install cibuildwheel==1.7.4

script:
  # build the wheels, put them into './wheelhouse'
  - python3 -m cibuildwheel --output-dir wheelhouse

Note that building Windows Python 2.7 wheels on Travis is unsupported.

Commit this file, enable building of your repo on Travis CI, and push.

Then setup a deployment method by following the Travis CI deployment docs, or see Delivering to PyPI. For more info on .travis.yml, check out the docs.

examples/travis-ci-deploy.yml extends this minimal example with a demonstration of how to automatically upload the built wheels to PyPI.

CircleCI [linux/mac]

To build Linux and Mac wheels on CircleCI, create a .circleci/config.yml file in your repo,

.circleci/config.yml

version: 2

jobs:
  linux-wheels:
    working_directory: ~/linux-wheels
    docker:
      - image: circleci/python:3.6
    steps:
      - checkout
      - setup_remote_docker
      - run:
          name: Build the Linux wheels.
          command: |
            pip3 install --user cibuildwheel==1.7.4
            cibuildwheel --output-dir wheelhouse
      - store_artifacts:
          path: wheelhouse/

  osx-wheels:
    working_directory: ~/osx-wheels
    macos:
      xcode: 10.0.0
    steps:
      - checkout
      - run:
          name: Build the OS X wheels.
          command: |
            pip3 install cibuildwheel==1.7.4
            cibuildwheel --output-dir wheelhouse
      - store_artifacts:
          path: wheelhouse/

workflows:
  version: 2
  all-tests:
    jobs:
      - linux-wheels
      - osx-wheels

Commit this file, enable building of your repo on CircleCI, and push.

Note

CircleCI doesn't enable free macOS containers for open source by default, but you can ask for access. See here for more information.

CircleCI will store the built wheels for you - you can access them from the project console. Check out the CircleCI docs for more info on this config file.

Gitlab CI [linux]

To build Linux wheels on Gitlab CI, create a .gitlab-ci.yml file in your repo,

.gitlab-ci.yml

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
    - cibuildwheel --output-dir wheelhouse
  artifacts:
    paths:
      - wheelhouse/

Commit this file, and push to Gitlab. The pipeline should start automatically.

Gitlab will store the built wheels for you - you can access them from the Pipelines view. Check out the Gitlab docs for more info on this config file.

AppVeyor [linux/mac/windows]

To build Linux, Mac, and Windows wheels on AppVeyor, create an appveyor.yml file in your repo.

appveyor.yml

environment:
  matrix:
    - APPVEYOR_BUILD_WORKER_IMAGE: Ubuntu
      APPVEYOR_JOB_NAME: "python37-x64-ubuntu"
    - APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015
      APPVEYOR_JOB_NAME: "python37-x64-vs2015"
    - APPVEYOR_BUILD_WORKER_IMAGE: macos-mojave
      APPVEYOR_JOB_NAME: "python37-x64-macos-mojave"

stack: python 3.7

init:
- cmd: set PATH=C:\Python37;C:\Python37\Scripts;%PATH%

install: python -m pip install cibuildwheel==1.7.4

build_script: python -m cibuildwheel --output-dir wheelhouse

artifacts:
  - path: "wheelhouse\\*.whl"
    name: Wheels

Commit this file, enable building of your repo on AppVeyor, and push.

AppVeyor will store the built wheels for you - you can access them from the project console. Alternatively, you may want to store them in the same place as the Travis CI build. See AppVeyor deployment docs for more info, or see Delivering to PyPI below.

For more info on this config file, check out the docs.

⚠️ Got an error? Check the FAQ.