1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
|
name: Build Python Wheels
on:
push:
pull_request:
schedule:
- cron: "0 6 * * *" # Daily 6AM UTC build
jobs:
define-matrix:
runs-on: ubuntu-latest
outputs:
matrix: ${{ steps.merged-identifiers.outputs.merged-identifiers }}
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
cache: pip
- name: Install jq
run: sudo apt-get update && sudo apt-get install -y jq
- name: Install cibuildwheel
run: pip install 'cibuildwheel>=3.0'
- name: Find build identifiers using cibuildwheel --print-build-identifiers
id: all-build-identifiers
run: |
echo "linux=$(cibuildwheel --platform linux --print-build-identifiers | tr '\n' ' ')" >> $GITHUB_OUTPUT
echo "macos=$(cibuildwheel --platform macos --print-build-identifiers | tr '\n' ' ')" >> $GITHUB_OUTPUT
echo "windows=$(cibuildwheel --platform windows --print-build-identifiers | tr '\n' ' ')" >> $GITHUB_OUTPUT
- name: Select build identifiers
id: select-build-identifiers
run: |
if [[ "$GITHUB_REF" = "refs/heads/main" ]] || [[ "$GITHUB_REF" = "refs/heads/master" ]] || [[ "$GITHUB_REF" = "refs/tags/"* ]]; then
echo 'linux=${{ steps.all-build-identifiers.outputs.linux }}' >> $GITHUB_OUTPUT
echo 'windows=${{ steps.all-build-identifiers.outputs.windows }}' >> $GITHUB_OUTPUT
echo 'macos=${{ steps.all-build-identifiers.outputs.macos }}' >> $GITHUB_OUTPUT
else
echo "linux=$(echo -n '${{ steps.all-build-identifiers.outputs.linux }}' | awk '{print $NF}')" >> $GITHUB_OUTPUT
echo "macos=$(echo -n '${{ steps.all-build-identifiers.outputs.macos }}' | awk '{print $NF}')" >> $GITHUB_OUTPUT
echo "windows=$(echo -n '${{ steps.all-build-identifiers.outputs.windows }}' | awk '{print $NF}')" >> $GITHUB_OUTPUT
fi
- name: Output build identifiers
id: json-identifiers
run: |
echo "linux=$(echo -n '${{ steps.select-build-identifiers.outputs.linux }}' | jq -R -s -c 'split(" ") | map(select(length > 0)) | [.[] | {os: "ubuntu-latest", "build-identifier": .}]')" >> $GITHUB_OUTPUT
echo "macos=$(echo -n '${{ steps.select-build-identifiers.outputs.macos }}' | jq -R -s -c 'split(" ") | map(select(length > 0)) | [.[] | {os: "macos-latest", "build-identifier": .}]')" >> $GITHUB_OUTPUT
echo "windows=$(echo -n '${{ steps.select-build-identifiers.outputs.windows }}' | jq -R -s -c 'split(" ") | map(select(length > 0)) | [.[] | {os: "windows-latest", "build-identifier": .}]')" >> $GITHUB_OUTPUT
- name: Merge build identifiers
id: merged-identifiers
run: |
echo merged-identifiers=$(echo -n '${{ steps.json-identifiers.outputs.linux }} ${{ steps.json-identifiers.outputs.macos }} ${{ steps.json-identifiers.outputs.windows }}' | jq -c -s 'add') >> $GITHUB_OUTPUT
build-wheels:
runs-on: ${{ matrix.os }}
needs: define-matrix
strategy:
matrix:
include: ${{ fromJSON(needs.define-matrix.outputs.matrix ) }}
fail-fast: true
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Install native dependencies (Ubuntu)
run: sudo apt-get update && sudo apt-get install -y libgpgme-dev libgpg-error-dev
if: "matrix.os == 'ubuntu-latest'"
- name: set up rust
if: matrix.os != 'ubuntu'
uses: actions-rs/toolchain@v1
with:
profile: minimal
toolchain: nightly
override: true
- name: Install native dependencies (MacOS)
run: brew install swig gpgme
if: "matrix.os == 'macos-latest'"
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install setuptools wheel 'cibuildwheel>=3.0'
- name: Provide gpgme-config and gpg-error-config
if: "matrix.os == 'ubuntu-latest'"
run: |
mkdir -p "$HOME/.local/bin"
cp .github/gpgme-config "$HOME/.local/bin/gpgme-config"
cp .github/gpg-error-config "$HOME/.local/bin/gpg-error-config"
echo "$HOME/.local/bin" >> $GITHUB_PATH
- name: Install gpg on supported platforms
run: pip install -U gpg
if: "matrix.os != 'windows-latest'"
- name: Set up QEMU
uses: docker/setup-qemu-action@v3
if: "matrix.os == 'ubuntu-latest'"
- name: Build wheels
run: python -m cibuildwheel --output-dir wheelhouse
env:
CIBW_SKIP: "*musllinux*"
CIBW_ARCHS_MACOS: x86_64 arm64 universal2
CIBW_BUILD: "${{ matrix.build-identifier }}*"
CIBW_ENVIRONMENT: 'PATH="$HOME/.cargo/bin:$PATH" PYO3_USE_ABI3_FORWARD_COMPATIBILITY="1" MACOSX_DEPLOYMENT_TARGET="10.12"'
CIBW_BEFORE_BUILD: >
pip install -U setuptools-rust &&
curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain=nightly --profile=minimal -y &&
rustup show
CIBW_BEFORE_BUILD_LINUX: >
pip install -U setuptools-rust &&
yum install libatomic -y &&
curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain=nightly --profile=minimal -y &&
rustup show
CIBW_BEFORE_BUILD_MACOS: >
pip install -U setuptools-rust &&
curl https://sh.rustup.rs -sSf | sh -s -- --default-toolchain=nightly --profile=minimal -y &&
rustup target add x86_64-apple-darwin &&
rustup show
- name: Upload wheels
uses: actions/upload-artifact@v4
with:
name: artifact-${{ matrix.build-identifier }}
path: ./wheelhouse/*.whl
publish:
runs-on: ubuntu-latest
needs: build-wheels
if: github.event_name == 'push' && startsWith(github.ref, 'refs/tags/brz-')
permissions:
id-token: write
environment:
name: pypi
url: https://pypi.org/p/breezy
steps:
- name: Download distributions
uses: actions/download-artifact@v4
with:
merge-multiple: true
pattern: artifact-*
path: dist
- name: Publish package distributions to PyPI
uses: pypa/gh-action-pypi-publish@release/v1
|