Skip to content

Rel v25.9.1

Rel v25.9.1 #17

Workflow file for this run

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