Rel v25.9.1 #17
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: wheels-docker | |
| on: | |
| # Build wheels on feature branches and PRs (test only) | |
| push: | |
| branches: ["**"] | |
| pull_request: | |
| branches: [master] | |
| # Publish to GitHub Releases when merged to master | |
| # Publish to PyPI when tagged | |
| workflow_dispatch: | |
| env: | |
| # Registry for caching build images | |
| REGISTRY: ghcr.io | |
| IMAGE_NAME: ${{ github.repository }}/wheel-builder | |
| jobs: | |
| build-wheels: | |
| name: Build wheels (${{ matrix.target.name }}) | |
| runs-on: ubuntu-latest | |
| container: ${{ matrix.target.base_image }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| target: | |
| # manylinux_2_34 (glibc 2.34+) - PEP 600 compliant for modern Linux | |
| - name: "manylinux_2_34_x86_64" | |
| base_image: "quay.io/pypa/manylinux_2_34_x86_64" | |
| # Future manylinux images can be added here: | |
| # - name: "manylinux_2_34_aarch64" | |
| # base_image: "quay.io/pypa/manylinux_2_34_aarch64" | |
| # Deactivated for now - focusing on standard manylinux wheels: | |
| # - name: "debian12-amd64" | |
| # base_image: "debian:12" | |
| # - name: "rocky9-amd64" | |
| # base_image: "rockylinux:9" | |
| # - name: "ubuntu2404-amd64" | |
| # base_image: "ubuntu:24.04" | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| - name: Install system dependencies | |
| run: | | |
| # manylinux images use yum/dnf and come with many build tools pre-installed | |
| if command -v yum >/dev/null 2>&1; then | |
| # manylinux images (CentOS-based) | |
| yum update -y | |
| yum install -y \ | |
| curl \ | |
| git \ | |
| openssl-devel \ | |
| libffi-devel \ | |
| zlib-devel \ | |
| bzip2-devel \ | |
| readline-devel \ | |
| sqlite-devel \ | |
| ncurses-devel | |
| # Note: snappy-devel may not be available in manylinux base images | |
| yum install -y snappy-devel || echo "snappy-devel not available, skipping" | |
| elif command -v dnf >/dev/null 2>&1; then | |
| # Newer manylinux images might use dnf | |
| dnf update -y | |
| dnf install -y \ | |
| curl \ | |
| git \ | |
| openssl-devel \ | |
| libffi-devel \ | |
| zlib-devel \ | |
| bzip2-devel \ | |
| readline-devel \ | |
| sqlite-devel \ | |
| ncurses-devel | |
| dnf install -y snappy-devel || echo "snappy-devel not available, skipping" | |
| fi | |
| - name: Setup Python environment | |
| run: | | |
| # manylinux images come with multiple Python versions pre-installed in /opt/python/ | |
| echo "==> Available Python versions:" | |
| ls -la /opt/python/*/bin/python* 2>/dev/null || echo "No /opt/python found" | |
| # Add all Python versions to PATH for uv/just to discover | |
| for pyver in /opt/python/*/bin; do | |
| if [ -d "$pyver" ]; then | |
| echo "Adding $pyver to PATH" | |
| export PATH="$pyver:$PATH" | |
| fi | |
| done | |
| # Also ensure we have a working python3 symlink | |
| which python3 || ln -sf $(find /opt/python -name python3 | head -1) /usr/local/bin/python3 | |
| echo "" | |
| echo "==> Current Python version:" | |
| python3 --version | |
| echo "==> pip version:" | |
| python3 -m pip --version | |
| # Save the updated PATH for subsequent steps | |
| echo "PATH=$PATH" >> $GITHUB_ENV | |
| - name: Install Just | |
| run: | | |
| curl --proto '=https' --tlsv1.2 -sSf https://just.systems/install.sh | bash -s -- --to /usr/local/bin | |
| just --version | |
| - name: Install uv | |
| run: | | |
| curl -LsSf https://astral.sh/uv/install.sh | sh | |
| # Add to both GITHUB_PATH and current environment | |
| echo "/root/.cargo/bin" >> $GITHUB_PATH | |
| echo "PATH=/root/.cargo/bin:$PATH" >> $GITHUB_ENV | |
| export PATH="/root/.cargo/bin:$PATH" | |
| uv --version | |
| - name: Install Rust | |
| run: | | |
| curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y --default-toolchain stable | |
| # Source the Rust environment (as recommended by installer) | |
| source "$HOME/.cargo/env" | |
| # Add to both GITHUB_PATH and current environment | |
| echo "/root/.cargo/bin" >> $GITHUB_PATH | |
| echo "PATH=/root/.cargo/bin:$PATH" >> $GITHUB_ENV | |
| export PATH="/root/.cargo/bin:$PATH" | |
| rustc --version | |
| - name: Verify toolchain | |
| run: | | |
| # Source Rust environment and ensure PATH is set | |
| source "$HOME/.cargo/env" 2>/dev/null || true | |
| export PATH="/root/.cargo/bin:$PATH" | |
| echo "==> Build environment summary:" | |
| echo "Container: ${{ matrix.target.base_image }}" | |
| echo "Just: $(just --version)" | |
| echo "uv: $(uv --version)" | |
| echo "Rust: $(rustc --version)" | |
| echo "Python: $(python3 --version)" | |
| echo "GCC: $(gcc --version | head -1)" | |
| echo "glibc: $(ldd --version 2>/dev/null | head -1 || echo 'N/A')" | |
| - name: Build manylinux wheels with NVX | |
| env: | |
| AUTOBAHN_USE_NVX: 1 | |
| run: | | |
| # Source Rust environment and ensure tools are in PATH | |
| source "$HOME/.cargo/env" 2>/dev/null || true | |
| export PATH="/root/.cargo/bin:$PATH" | |
| # Verify environment | |
| echo "==> Environment verification:" | |
| echo "AUTOBAHN_USE_NVX=$AUTOBAHN_USE_NVX" | |
| echo "PATH=$PATH" | |
| echo "Python: $(python3 --version)" | |
| echo "uv: $(uv --version)" | |
| echo "just: $(just --version)" | |
| echo "rustc: $(rustc --version)" | |
| echo "auditwheel: $(auditwheel --version || echo 'not available')" | |
| # Build binary wheels WITH NVX acceleration for manylinux | |
| just build-all | |
| # Convert linux_x86_64 wheels to manylinux_2_34_x86_64 using auditwheel | |
| echo "" | |
| echo "==> Converting wheels to manylinux_2_34_x86_64 format..." | |
| mkdir -p wheelhouse | |
| for wheel in dist/*.whl; do | |
| if [[ "$wheel" == *"linux_x86_64"* ]]; then | |
| echo "Converting: $(basename $wheel)" | |
| auditwheel repair "$wheel" --plat-tag manylinux_2_34_x86_64 -w wheelhouse/ | |
| else | |
| echo "Copying non-linux wheel: $(basename $wheel)" | |
| cp "$wheel" wheelhouse/ | |
| fi | |
| done | |
| # Replace dist/ with converted wheels | |
| rm -rf dist/*.whl | |
| cp wheelhouse/*.whl dist/ | |
| echo "" | |
| echo "==> Final wheel inventory after manylinux conversion:" | |
| ls -la dist/*.whl | |
| - name: Generate build metadata | |
| run: | | |
| mkdir -p dist/ | |
| cat > dist/build-info.txt << EOF | |
| manylinux Build Information for ${{ matrix.target.name }} | |
| ======================================================== | |
| Build Date: $(date -u +"%Y-%m-%d %H:%M:%S UTC") | |
| Container: ${{ matrix.target.base_image }} | |
| Platform: x86_64 | |
| ABI: manylinux_2_34 (glibc 2.34+) | |
| Build Method: GitHub Actions + manylinux Docker Container | |
| NVX Acceleration: ENABLED (binary wheels with native extensions) | |
| System Information: | |
| - OS: $(cat /etc/os-release | grep PRETTY_NAME | cut -d'"' -f2 2>/dev/null || echo 'manylinux container') | |
| - Kernel: $(uname -r) | |
| - glibc: $(ldd --version 2>/dev/null | head -1 || echo 'N/A') | |
| - Architecture: $(uname -m) | |
| Build Tools: | |
| - Just: $(just --version) | |
| - uv: $(uv --version) | |
| - Rust: $(rustc --version) | |
| - Python: $(python3 --version) | |
| - GCC: $(gcc --version | head -1) | |
| EOF | |
| - name: List built artifacts | |
| run: | | |
| echo "==> Built artifacts for ${{ matrix.target.name }}:" | |
| ls -la dist/ 2>/dev/null || echo "No dist/ directory found" | |
| echo "" | |
| echo "==> Build metadata:" | |
| cat dist/build-info.txt 2>/dev/null || echo "No build info found" | |
| echo "" | |
| echo "==> Wheel inventory:" | |
| find dist/ -name "*.whl" -exec basename {} \; 2>/dev/null | sort || echo "No wheels found" | |
| - name: Upload wheel artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: wheels-${{ matrix.target.name }} | |
| path: | | |
| dist/*.whl | |
| dist/*.tar.gz | |
| retention-days: 30 | |
| - name: Upload build metadata | |
| uses: actions/upload-artifact@v4 | |
| if: always() | |
| with: | |
| name: build-info-${{ matrix.target.name }} | |
| path: dist/build-info.txt | |
| retention-days: 7 | |
| if-no-files-found: ignore | |
| publish-github-releases: | |
| name: Publish to GitHub Releases | |
| needs: build-wheels | |
| runs-on: ubuntu-latest | |
| if: github.ref == 'refs/heads/master' && github.event_name == 'push' | |
| steps: | |
| - name: Download all wheel artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| pattern: wheels-* | |
| merge-multiple: true | |
| path: dist/ | |
| - name: Download build metadata | |
| uses: actions/download-artifact@v4 | |
| with: | |
| pattern: build-info-* | |
| path: build-info/ | |
| - name: Analyze wheel inventory | |
| id: inventory | |
| run: | | |
| echo "==> Complete manylinux wheel inventory:" | |
| find dist/ -name "*.whl" | sort | |
| echo "" | |
| echo "==> manylinux wheels by ABI:" | |
| for abi in manylinux_2_34; do | |
| for arch in x86_64 aarch64; do | |
| count=$(find dist/ -name "*${abi}*${arch}*.whl" | wc -l) | |
| echo " $abi-$arch: $count wheels" | |
| done | |
| done | |
| echo "" | |
| echo "==> Expected wheel names (for verification):" | |
| echo " autobahn-25.9.1-cp311-cp311-manylinux_2_34_x86_64.whl" | |
| echo " autobahn-25.9.1-cp312-cp312-manylinux_2_34_x86_64.whl" | |
| echo " autobahn-25.9.1-cp313-cp313-manylinux_2_34_x86_64.whl" | |
| echo " autobahn-25.9.1-cp314-cp314-manylinux_2_34_x86_64.whl" | |
| echo " autobahn-25.9.1-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl" | |
| echo "" | |
| echo "==> Total wheel count:" | |
| WHEEL_COUNT=$(find dist/ -name "*.whl" | wc -l) | |
| echo "wheels_total=$WHEEL_COUNT" >> $GITHUB_OUTPUT | |
| echo "" | |
| echo "==> Source distributions:" | |
| find dist/ -name "*.tar.gz" | wc -l | |
| - name: Create GitHub Release | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| run: | | |
| # Generate release tag based on timestamp and commit | |
| RELEASE_TAG="wheels-docker-$(date +'%Y%m%d')-${GITHUB_SHA::8}" | |
| # Create comprehensive release notes | |
| cat > release_notes.md << 'EOF' | |
| # manylinux Binary Wheels | |
| Built using official PyPA manylinux Docker images for maximum Linux compatibility. | |
| ## Target Compatibility | |
| | manylinux Tag | glibc Version | Architecture | Compatibility | | |
| |---------------|---------------|--------------|---------------| | |
| | **manylinux_2_34** | 2.34+ | x86_64 | RHEL 9+, Ubuntu 22.04+, Debian 12+ | | |
| ## Python Support | |
| - **CPython**: 3.11, 3.12, 3.13, 3.14 | |
| - **PyPy**: 3.11 | |
| - **Extensions**: Native CFFI modules with NVX acceleration included | |
| ## Installation | |
| ### Option 1: Auto-detect (pip will choose best wheel) | |
| ```bash | |
| pip install autobahn[all] | |
| ``` | |
| ### Option 2: Specific wheel download | |
| ```bash | |
| # Download the wheel for your platform | |
| wget https://github.com/crossbario/autobahn-python/releases/download/${RELEASE_TAG}/autobahn-*-linux_*.whl | |
| pip install autobahn-*-linux_*.whl | |
| ``` | |
| ## Build Information | |
| - **Build Date**: $(date -u +"%Y-%m-%d %H:%M:%S UTC") | |
| - **Commit**: ${GITHUB_SHA::8} | |
| - **Total Wheels**: ${{ steps.inventory.outputs.wheels_total }} | |
| - **Build Method**: Docker + QEMU emulation | |
| - **ABI**: Precise glibc targeting per distribution | |
| EOF | |
| # Create release | |
| gh release create "$RELEASE_TAG" \ | |
| --repo "$GITHUB_REPOSITORY" \ | |
| --title "Multi-Arch Wheels - $(date +'%Y-%m-%d')" \ | |
| --notes-file release_notes.md \ | |
| dist/*.whl dist/*.tar.gz | |
| publish-pypi: | |
| name: Publish to PyPI | |
| needs: build-wheels | |
| runs-on: ubuntu-latest | |
| if: startsWith(github.ref, 'refs/tags/') | |
| environment: | |
| name: pypi | |
| url: https://pypi.org/p/autobahn | |
| permissions: | |
| id-token: write # For trusted publishing | |
| steps: | |
| - name: Download all wheel artifacts | |
| uses: actions/download-artifact@v4 | |
| with: | |
| pattern: wheels-* | |
| merge-multiple: true | |
| path: dist/ | |
| - name: Prepare PyPI upload | |
| run: | | |
| echo "==> Preparing PyPI upload..." | |
| # Remove duplicate source distributions (keep only one) | |
| find dist/ -name "*.tar.gz" | sort | tail -n +2 | xargs rm -f || true | |
| echo "==> Final PyPI artifact list:" | |
| ls -la dist/ | |
| echo "" | |
| echo "==> Upload summary:" | |
| echo "Wheels: $(find dist/ -name "*.whl" | wc -l)" | |
| echo "Source: $(find dist/ -name "*.tar.gz" | wc -l)" | |
| - name: Publish to PyPI | |
| uses: pypa/gh-action-pypi-publish@release/v1 | |
| with: | |
| verbose: true |