name: CI & Wheel Release Pipeline on: push: branches: [ main, master ] tags: [ 'v*' ] pull_request: branches: [ main, master ] permissions: contents: read jobs: test-rust: name: Cargo Test & Lint (Linux x86_64) runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable with: components: clippy, rustfmt - name: Install cargo-deny uses: taiki-e/install-action@v2 with: tool: cargo-deny - name: Security Advisory & License Check run: cargo deny check - name: Run Tests run: cargo test --workspace - name: Run Clippy run: cargo clippy --workspace --tests -- -D warnings - name: Check Formatting run: cargo fmt --check miri-test: name: Miri Test (justapi-core) runs-on: ubuntu-latest needs: test-rust steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@nightly with: components: miri - name: Run Miri run: cargo miri test -p justapi-core env: MIRIFLAGS: -Zmiri-disable-isolation build-wheels: name: Build Wheels (${{ matrix.os }} - ${{ matrix.target }}) runs-on: ${{ matrix.os }} needs: miri-test strategy: fail-fast: false matrix: include: - os: ubuntu-latest target: x86_64 args: --manylinux 2_28 - os: ubuntu-latest target: aarch64 args: --manylinux 2_28 - os: ubuntu-latest target: x86_64 args: --musllinux 1_2 - os: macos-latest target: x86_64 - os: macos-latest target: aarch64 - os: windows-latest target: x64 steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: '3.12' - name: Build wheels via Maturin uses: PyO3/maturin-action@v1 with: target: ${{ matrix.target }} args: --release --out dist ${{ matrix.args }} manifest-path: crates/justapi-py/Cargo.toml - name: Install wheel & test shell: bash run: | pip install dist/*.whl --force-reinstall pip install pytest python -m pytest crates/justapi-py/tests/ -v --tb=short - name: Upload Wheels uses: actions/upload-artifact@v4 with: name: wheels-${{ matrix.os }}-${{ matrix.target }}-${{ strategy.job-index }} path: dist/*.whl publish: name: Publish to PyPI runs-on: ubuntu-latest needs: build-wheels if: startsWith(github.ref, 'refs/tags/v') permissions: id-token: write steps: - uses: actions/download-artifact@v4 with: pattern: wheels-* merge-multiple: true path: dist - name: Publish to PyPI uses: pypa/gh-action-pypa-publish@release/v1