mq-bridge 0.3.1

An asynchronous message bridging library connecting Kafka, MQTT, AMQP, NATS, MongoDB, HTTP, and more.
Documentation
name: Publish Python Packages

on:
  release:
    types:
      - published
  workflow_dispatch:
    inputs:
      target:
        description: "Where to publish the packages"
        required: true
        default: "testpypi"
        type: choice
        options:
          - testpypi
          - pypi

jobs:
  build-wheels:
    name: Build ${{ matrix.package }} wheels on ${{ matrix.os }} (${{ matrix.target }})
    runs-on: ${{ matrix.runner }}
    strategy:
      fail-fast: false
      matrix:
        include:
          - package: mq-bridge-py-basic
            pyproject: pyproject-basic.toml
            runner: ubuntu-latest
            os: linux
            target: x86_64
            args: --release --out dist --find-interpreter --no-default-features
          - package: mq-bridge-py-basic
            # Build the aarch64 basic wheel on a native arm64 runner to avoid
            # ring/aws-lc-sys cross-toolchain issues in manylinux containers.
            # If maturin's manylinux:auto still selects a container that
            # reintroduces those issues, pin manylinux to a specific version.
            pyproject: pyproject-basic.toml
            runner: ubuntu-24.04-arm
            os: linux
            target: aarch64
            args: --release --out dist --find-interpreter --no-default-features
          - package: mq-bridge-py-basic
            pyproject: pyproject-basic.toml
            runner: macos-15-intel
            os: macos
            target: x86_64
            args: --release --out dist --find-interpreter --no-default-features
          - package: mq-bridge-py-basic
            pyproject: pyproject-basic.toml
            runner: macos-latest
            os: macos
            target: aarch64
            args: --release --out dist --find-interpreter --no-default-features
          - package: mq-bridge-py-basic
            pyproject: pyproject-basic.toml
            runner: windows-latest
            os: windows
            target: x86_64
            args: --release --out dist --find-interpreter --no-default-features
          - package: mq-bridge-py
            pyproject: pyproject.toml
            runner: ubuntu-latest
            os: linux
            target: x86_64
            args: --release --out dist --find-interpreter
          - package: mq-bridge-py
            # Build the full wheel for aarch64 on a NATIVE arm64 runner rather
            # than cross-compiling from x86_64. The `full` feature pulls in
            # aws-lc-sys (BoringSSL C), which has no pre-built artifact and
            # fails to cross-compile in the manylinux container; building
            # natively makes it a plain native C compile. (The basic wheel uses
            # rustls-ring, which cross-compiles fine, so it stays on ubuntu-latest.)
            pyproject: pyproject.toml
            runner: ubuntu-24.04-arm
            os: linux
            target: aarch64
            args: --release --out dist --find-interpreter
          - package: mq-bridge-py
            pyproject: pyproject.toml
            runner: macos-15-intel
            os: macos
            target: x86_64
            args: --release --out dist --find-interpreter
          - package: mq-bridge-py
            pyproject: pyproject.toml
            runner: macos-latest
            os: macos
            target: aarch64
            args: --release --out dist --find-interpreter
          - package: mq-bridge-py
            pyproject: pyproject.toml
            runner: windows-latest
            os: windows
            target: x86_64
            args: --release --out dist --find-interpreter

    steps:
      - name: Check out repository
        uses: actions/checkout@v4

      - name: Select package metadata
        if: matrix.pyproject != 'pyproject.toml'
        working-directory: python/mq-bridge-py
        shell: bash
        run: cp "${{ matrix.pyproject }}" pyproject.toml

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable

      - name: Build wheels
        uses: PyO3/maturin-action@v1
        env:
          # Work around intermittent "HTTP2 framing layer" curl errors when
          # cargo downloads crates inside the manylinux container.
          CARGO_HTTP_MULTIPLEXING: "false"
          CARGO_NET_RETRY: "5"
          CARGO_NET_GIT_FETCH_WITH_CLI: "true"
        with:
          working-directory: python/mq-bridge-py
          command: build
          target: ${{ matrix.target }}
          args: ${{ matrix.args }}
          sccache: "true"
          manylinux: auto

      - name: Upload wheels
        uses: actions/upload-artifact@v4
        with:
          name: wheels-${{ matrix.package }}-${{ matrix.os }}-${{ matrix.target }}
          path: python/mq-bridge-py/dist

  build-sdists:
    name: Build ${{ matrix.package }} sdist
    runs-on: ubuntu-latest
    strategy:
      fail-fast: false
      matrix:
        include:
          - package: mq-bridge-py-basic
            pyproject: pyproject-basic.toml
          - package: mq-bridge-py
            pyproject: pyproject.toml

    steps:
      - name: Check out repository
        uses: actions/checkout@v4

      - name: Select package metadata
        if: matrix.pyproject != 'pyproject.toml'
        working-directory: python/mq-bridge-py
        run: cp "${{ matrix.pyproject }}" pyproject.toml

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"

      - name: Install Rust toolchain
        uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # stable

      - name: Build sdist
        uses: PyO3/maturin-action@v1
        with:
          working-directory: python/mq-bridge-py
          command: sdist
          args: --out dist

      - name: Upload sdist
        uses: actions/upload-artifact@v4
        with:
          name: sdist-${{ matrix.package }}
          path: python/mq-bridge-py/dist

  publish:
    name: Publish to ${{ github.event_name == 'release' && 'PyPI' || inputs.target }}
    runs-on: ubuntu-latest
    needs: [build-wheels, build-sdists]
    permissions:
      contents: read
      id-token: write
    environment:
      name: ${{ github.event_name == 'release' && 'pypi' || inputs.target }}

    steps:
      - name: Download all artifacts
        uses: actions/download-artifact@v4
        with:
          path: dist
          merge-multiple: true

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: "3.11"

      - name: List distribution files
        run: ls -lh dist/

      - name: Check package metadata
        run: |
          pip install twine
          twine check dist/*

      - name: Publish to TestPyPI
        if: github.event_name == 'workflow_dispatch' && inputs.target == 'testpypi'
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          repository-url: https://test.pypi.org/legacy/
          packages-dir: dist/

      - name: Publish to PyPI
        if: github.event_name == 'release' || (github.event_name == 'workflow_dispatch' && inputs.target == 'pypi')
        uses: pypa/gh-action-pypi-publish@release/v1
        with:
          packages-dir: dist/