diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 9457139..3e27f3e 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -1,158 +1,242 @@ -name: Publish +# Largely references https://github.com/pydantic/pydantic-core/blob/193f5d7a8627c988b1c7fab9a3712c779afbbe94/.github/workflows/ci.yml + +name: CI on: push: + branches: + - main + - next tags: - 'v[0-9]+.[0-9]+.[0-9]+' + pull_request: workflow_dispatch: jobs: - macos: - runs-on: macos-latest - strategy: - matrix: - python_version: ['3.7', '3.8', '3.9', '3.10', '3.11'] + clippy: + name: Clippy + runs-on: ubuntu-latest + steps: - name: Checkout project - uses: actions/checkout@v3 + uses: actions/checkout@v4 - - name: Python setup - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python_version }} - architecture: x64 - - - name: Rust setup - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - profile: minimal - default: true + - name: Install stable toolchain + uses: dtolnay/rust-toolchain@stable - - name: Build wheels - x86_64 - uses: PyO3/maturin-action@v1 - with: - target: x86_64 - args: --release --out dist --sdist + - name: Cache dependencies + uses: Swatinem/rust-cache@v2 - - name: Install built wheel - x86_64 - run: | - pip install rina_pp_pyb --no-index --find-links dist --force-reinstall - python -c "import rina_pp_pyb" + - name: Run clippy + run: cargo clippy --all-targets - - name: Build wheels - universal2 + build-sdist: + name: Build sdist + runs-on: ubuntu-latest + + steps: + - name: Checkout project + uses: actions/checkout@v4 + + - name: Build wheels uses: PyO3/maturin-action@v1 with: - args: --release --universal2 --out dist - - - name: Install built wheel - universal2 - run: | - pip install rina_pp_pyb --no-index --find-links dist --force-reinstall - python -c "import rina_pp_pyb" + command: sdist + args: --out dist + rust-toolchain: stable - name: Upload wheels - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: wheels + name: pypi_files_sdist path: dist - windows: - runs-on: windows-latest + build: + name: Build on ${{ matrix.os }} (${{ matrix.target }} - ${{ matrix.interpreter || 'all' }}${{ matrix.os == 'linux' && format(' - {0}', matrix.manylinux == 'auto' && 'manylinux' || matrix.manylinux) || '' }}) + if: startsWith(github.ref, 'refs/tags/') || github.ref == 'refs/heads/main' || github.ref == 'refs/heads/next' + strategy: + fail-fast: false matrix: - python_version: ['3.7', '3.8', '3.9', '3.10', '3.11'] - target: [x64, x86] + os: [linux, macos, windows] + target: [x86_64, aarch64] + manylinux: [auto] + include: + # manylinux + - os: linux + manylinux: auto + target: aarch64 + - os: linux + manylinux: auto + target: armv7 + interpreter: 3.8 3.9 3.10 3.11 3.12 + - os: linux + manylinux: auto + target: x86_64 + + # musllinux + - os: linux + manylinux: musllinux_1_1 + target: x86_64 + - os: linux + manylinux: musllinux_1_1 + target: aarch64 + + # macos + - os: macos + target: x86_64 + - os: macos + target: aarch64 + + # windows + - os: windows + target: x86_64 + - os: windows + target: aarch64 + interpreter: 3.11 3.12 + + runs-on: ${{ (matrix.os == 'linux' && 'ubuntu') || matrix.os }}-latest + steps: - name: Checkout project - uses: actions/checkout@v3 + uses: actions/checkout@v4 - - name: Python setup - uses: actions/setup-python@v4 + - name: Set up python + uses: actions/setup-python@v5 with: - python-version: ${{ matrix.python_version }} - architecture: ${{ matrix.target }} + python-version: '3.11' + architecture: x64 - - name: Rust setup - uses: actions-rs/toolchain@v1 - with: - toolchain: stable - profile: minimal - default: true + - run: pip install -U twine 'ruff==0.1.3' typing_extensions - name: Build wheels uses: PyO3/maturin-action@v1 with: target: ${{ matrix.target }} - args: --release --out dist + manylinux: ${{ matrix.manylinux }} + args: --release --out dist --interpreter ${{ matrix.interpreter || '3.8 3.9 3.10 3.11 3.12 pypy3.9 pypy3.10' }} + rust-toolchain: 1.77.0 + docker-options: -e CI + sccache: true - - name: Install built wheel - run: | - pip install rina_pp_pyb --no-index --find-links dist --force-reinstall - python -c "import rina_pp_pyb" + - run: twine check --strict dist/* - name: Upload wheels - uses: actions/upload-artifact@v3 + uses: actions/upload-artifact@v4 with: - name: wheels + name: pypi_files_${{ matrix.os }}_${{ matrix.target }}_${{ matrix.interpreter || 'all' }}_${{ matrix.manylinux }} path: dist - linux: - runs-on: ubuntu-20.04 + test-builds-arch: + name: Test build on ${{ matrix.target }}-${{ matrix.distro }} + needs: [build] + runs-on: ubuntu-latest + strategy: + fail-fast: false matrix: - python_version: ['3.7', '3.8', '3.9', '3.10', '3.11'] - target: [x86_64, i686] + target: [aarch64, armv7] + distro: ['ubuntu22.04'] + include: + - target: aarch64 + distro: alpine_latest + steps: - - name: Checkout project - uses: actions/checkout@v3 - - - name: Python setup - uses: actions/setup-python@v4 - with: - python-version: ${{ matrix.python_version }} - architecture: x64 - - - name: Build wheels - uses: PyO3/maturin-action@v1 - with: - target: ${{ matrix.target }} - manylinux: auto - args: --release --out dist -i ${{ matrix.python_version }} - - - name: Install built wheel - if: matrix.target == 'x86_64' - run: | - pip install rina_pp_pyb --no-index --find-links dist --force-reinstall - python -c "import rina_pp_pyb" - - - name: Upload wheels - uses: actions/upload-artifact@v3 - with: - name: wheels - path: dist + - name: Checkout project + uses: actions/checkout@v4 + + - name: Get artifacts + uses: actions/download-artifact@v4 + with: + pattern: pypi_files_linux_* + merge-multiple: true + path: dist + + - name: Install & test + uses: uraimo/run-on-arch-action@v2.7.1 + with: + arch: ${{ matrix.target }} + distro: ${{ matrix.distro }} + githubToken: ${{ github.token }} + install: | + set -x + if command -v apt-get &> /dev/null; then + echo "installing python & pip with apt-get..." + apt-get update + apt-get install -y --no-install-recommends python3 python3-pip python3-venv git + else + echo "installing python & pip with apk..." + apk update + apk add python3 py3-pip git + fi + run: | + set -x + # typing-extensions isn't automatically installed because of `--no-index --no-deps` + python3 -m venv venv + source venv/bin/activate + python3 -m pip install -U pip typing-extensions + python3 -m pip install rina_pp_pyb --no-index --no-deps --find-links dist --force-reinstall + python3 -c "import rina_pp_pyb" + + test-builds-os: + name: Test build on ${{ matrix.os }} + needs: [build] - release: - name: Release - runs-on: ubuntu-latest strategy: + fail-fast: false matrix: - python_version: ['3.7', '3.8', '3.9', '3.10', '3.11'] - needs: [ macos, windows, linux ] + os: [ubuntu, macos, windows] + + runs-on: ${{ matrix.os }}-latest steps: + - name: Checkout project + uses: actions/checkout@v4 + + - name: Set up python + uses: actions/setup-python@v5 + with: + python-version: '3.11' + - name: Get artifacts - uses: actions/download-artifact@v3 + uses: actions/download-artifact@v4 + with: + pattern: pypi_files_* + merge-multiple: true + path: dist + + - run: | + pip install typing-extensions + pip install rina_pp_pyb --no-index --no-deps --find-links dist --force-reinstall + python -c "import rina_pp_pyb" + + release: + name: Release + needs: [clippy, test-builds-arch, test-builds-os, build-sdist] + if: success() && startsWith(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + + steps: + - name: Checkout project + uses: actions/checkout@v4 + + - name: Set up python + uses: actions/setup-python@v5 with: - name: wheels + python-version: '3.10' + + - run: pip install -U twine - - name: Python setup - uses: actions/setup-python@v2 + - name: Get artifacts + uses: actions/download-artifact@v4 with: - python-version: ${{ matrix.python_version }} + pattern: pypi_files_* + merge-multiple: true + path: dist + + - run: twine check --strict dist/* - - name: Publish to PyPi + - name: Upload to PyPI + run: twine upload dist/* env: TWINE_USERNAME: __token__ TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }} - run: | - pip install --upgrade twine - twine upload --skip-existing * \ No newline at end of file