name: Publish to PyPI on: release: types: [published] workflow_dispatch: permissions: contents: read id-token: write jobs: check-version: name: Check Version runs-on: ubuntu-latest outputs: version: ${{ steps.version.outputs.version }} steps: - uses: actions/checkout@v4 - id: version run: echo "version=$(grep '^version = ' crates/justapi-py/Cargo.toml | head -1 | sed 's/.*"\(.*\)".*/\1/')" >> "$GITHUB_OUTPUT" test-rust: name: Cargo Test & Lint runs-on: ubuntu-latest needs: check-version 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 & License Check run: cargo deny check - name: Run Tests run: cargo test --workspace - name: Clippy & Formatting run: | cargo clippy --workspace --tests -- -D warnings cargo fmt --check build-wheels: name: Build (${{ matrix.target }}) runs-on: ${{ matrix.os }} needs: test-rust 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: macos-latest target: x86_64 - os: macos-latest target: aarch64 - os: windows-latest target: x64 steps: - uses: actions/checkout@v4 - uses: astral-sh/setup-uv@v5 with: python-version: '3.12' enable-cache: true cache-dependency-glob: crates/justapi-py/pyproject.toml - uses: PyO3/maturin-action@v1 with: target: ${{ matrix.target }} args: --release --out dist ${{ matrix.args }} manifest-path: crates/justapi-py/Cargo.toml - name: Smoke test shell: bash run: | uv pip install dist/*.whl python -c "import justapi; print(justapi.__version__)" - uses: actions/upload-artifact@v4 with: name: wheels-${{ matrix.target }} path: dist/*.whl publish: name: Publish to PyPI runs-on: ubuntu-latest needs: build-wheels environment: pypi permissions: id-token: write steps: - uses: actions/checkout@v4 - uses: astral-sh/setup-uv@v5 with: python-version: '3.12' - uses: actions/download-artifact@v4 with: pattern: wheels-* merge-multiple: true path: dist - name: Publish run: uv publish --package-dir crates/justapi-py --trusted-publishing always --verbose