Initial 0.1.0 release: EmbeddingGemma ONNX inference (#1)
#17
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI | |
| on: | |
| push: | |
| branches: | |
| - main | |
| paths-ignore: | |
| - 'README' | |
| - 'COPYRIGHT' | |
| - 'LICENSE-*' | |
| - '**.md' | |
| - '**.txt' | |
| pull_request: | |
| paths-ignore: | |
| - 'README' | |
| - 'COPYRIGHT' | |
| - 'LICENSE-*' | |
| - '**.md' | |
| - '**.txt' | |
| workflow_dispatch: | |
| schedule: [cron: "0 1 */7 * *"] | |
| env: | |
| CARGO_TERM_COLOR: always | |
| RUSTFLAGS: -Dwarnings | |
| RUST_BACKTRACE: 1 | |
| jobs: | |
| # Check formatting (platform-independent, one OS is enough) | |
| rustfmt: | |
| name: rustfmt | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Install Rust | |
| run: rustup update stable && rustup default stable && rustup component add rustfmt | |
| - name: Check formatting | |
| run: cargo fmt --all -- --check | |
| # Apply clippy lints | |
| clippy: | |
| name: clippy | |
| strategy: | |
| matrix: | |
| os: | |
| - ubuntu-latest | |
| - macos-latest | |
| - windows-latest | |
| runs-on: ${{ matrix.os }} | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Install Rust | |
| # --no-self-update is necessary because the windows environment cannot self-update rustup.exe. | |
| run: rustup update stable --no-self-update && rustup default stable && rustup component add clippy | |
| - name: Install cargo-hack | |
| run: cargo install cargo-hack | |
| - name: Apply clippy lints | |
| # Skip the opt-in EP features (`cuda`, `tensorrt`, `directml`, | |
| # `rocm`, `coreml`) — those activate `ort/<ep>`, which requires | |
| # the corresponding vendor SDK at build time. Standard CI runners | |
| # don't have CUDA / TensorRT / ROCm installed, and `directml` / | |
| # `coreml` are platform-restricted. | |
| run: cargo hack clippy --each-feature --exclude-no-default-features --exclude-features cuda,tensorrt,directml,rocm,coreml | |
| # Run tests on some extra platforms | |
| cross: | |
| name: cross | |
| strategy: | |
| matrix: | |
| target: | |
| - aarch64-unknown-linux-gnu | |
| - aarch64-linux-android | |
| - aarch64-unknown-linux-musl | |
| - i686-linux-android | |
| - x86_64-linux-android | |
| - i686-pc-windows-gnu | |
| - x86_64-pc-windows-gnu | |
| - i686-unknown-linux-gnu | |
| - powerpc64-unknown-linux-gnu | |
| - riscv64gc-unknown-linux-gnu | |
| - wasm32-unknown-unknown | |
| - wasm32-unknown-emscripten | |
| - wasm32-wasip1 | |
| - wasm32-wasip1-threads | |
| - wasm32-wasip2 | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Cache cargo build and registry | |
| uses: actions/cache@v5 | |
| with: | |
| path: | | |
| ~/.cargo/registry | |
| ~/.cargo/git | |
| target | |
| key: ${{ runner.os }}-cross-${{ hashFiles('**/Cargo.lock') }} | |
| restore-keys: | | |
| ${{ runner.os }}-cross- | |
| - name: Install Rust | |
| run: rustup update stable && rustup default stable | |
| - name: cargo build --target ${{ matrix.target }} | |
| # The cross matrix verifies the no-inference subset (the | |
| # `Embedding`, `Options`, `Error` types) compiles on every | |
| # listed target, including wasm32-* and tier-2/3 native | |
| # platforms where ort prebuilds aren't available. The default | |
| # `inference` feature pulls `ort` + `tokenizers`, neither of | |
| # which targets wasm or most non-tier-1 native targets, so | |
| # passing default features here would only re-fail the build | |
| # in their C/FFI prereqs. The native inference path is | |
| # exercised by the `build` / `test` jobs below on | |
| # ubuntu-latest / macos-latest / windows-latest. | |
| run: | | |
| rustup target add ${{ matrix.target }} | |
| cargo build --target ${{ matrix.target }} --no-default-features | |
| build: | |
| name: build | |
| strategy: | |
| matrix: | |
| os: | |
| - ubuntu-latest | |
| - macos-latest | |
| - windows-latest | |
| runs-on: ${{ matrix.os }} | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Cache cargo build and registry | |
| uses: actions/cache@v5 | |
| with: | |
| path: | | |
| ~/.cargo/registry | |
| ~/.cargo/git | |
| target | |
| key: ${{ runner.os }}-build-${{ hashFiles('**/Cargo.lock') }} | |
| restore-keys: | | |
| ${{ runner.os }}-build- | |
| - name: Install Rust | |
| # --no-self-update is necessary because the windows environment cannot self-update rustup.exe. | |
| run: rustup update stable --no-self-update && rustup default stable | |
| - name: Install cargo-hack | |
| run: cargo install cargo-hack | |
| - name: Run build | |
| # See the clippy job for why the EP features are excluded. | |
| run: cargo hack build --feature-powerset --exclude-no-default-features --exclude-features cuda,tensorrt,directml,rocm,coreml | |
| test: | |
| name: test | |
| strategy: | |
| matrix: | |
| os: | |
| - ubuntu-latest | |
| - macos-latest | |
| - windows-latest | |
| runs-on: ${{ matrix.os }} | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Cache cargo build and registry | |
| uses: actions/cache@v5 | |
| with: | |
| path: | | |
| ~/.cargo/registry | |
| ~/.cargo/git | |
| target | |
| key: ${{ runner.os }}-test-${{ hashFiles('**/Cargo.lock') }} | |
| restore-keys: | | |
| ${{ runner.os }}-test- | |
| - name: Install Rust | |
| # --no-self-update is necessary because the windows environment cannot self-update rustup.exe. | |
| run: rustup update stable --no-self-update && rustup default stable | |
| - name: Install cargo-hack | |
| run: cargo install cargo-hack | |
| # Linux / macOS: full feature-powerset minus the EP features (see | |
| # the clippy job for that exclusion). `--exclude-no-default-features` | |
| # is intentionally NOT set so the powerset also runs the | |
| # `--no-default-features` and `--no-default-features --features serde` | |
| # combos — those exercise the cfg-gated `serde` derive paths in | |
| # `src/options.rs` that the default-features build can't reach. | |
| - name: Run test (Linux/macOS) | |
| if: runner.os != 'Windows' | |
| run: cargo hack test --feature-powerset --exclude-features cuda,tensorrt,directml,rocm,coreml | |
| # Windows: also exclude `inference` and `default`. ORT's prebuilt | |
| # binary on `x86_64-pc-windows-msvc` is linked against the dynamic | |
| # CRT (`/MD`), but the C/C++ build scripts in `tokenizers` deps | |
| # (`onig_sys`, `esaxx-rs`) link the static CRT (`/MT`). When both | |
| # end up in the same test executable — and `cargo test` compiles | |
| # examples like `embed_text.rs` that link ort + tokenizers — MSVC | |
| # emits `LNK2038` ("RuntimeLibrary mismatch") and the link aborts. | |
| # `default` is excluded because it implies `inference`. | |
| # | |
| # This is an upstream dependency mismatch, not something this crate | |
| # can resolve in its own code. The `build` and `clippy` Windows | |
| # jobs above still compile the crate end-to-end (no final link), | |
| # so lib-level regressions a Windows test binary would catch are | |
| # still caught. The `inference` path is exercised on the Linux and | |
| # macOS runners. | |
| - name: Run test (Windows — skip inference due to MSVC CRT conflict) | |
| if: runner.os == 'Windows' | |
| run: cargo hack test --feature-powerset --exclude-features cuda,tensorrt,directml,rocm,coreml,inference,default | |
| sanitizer: | |
| name: sanitizer | |
| runs-on: ubuntu-latest | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Cache cargo build and registry | |
| uses: actions/cache@v5 | |
| with: | |
| path: | | |
| ~/.cargo/registry | |
| ~/.cargo/git | |
| target | |
| key: ${{ runner.os }}-sanitizer-${{ hashFiles('**/Cargo.lock') }} | |
| restore-keys: | | |
| ${{ runner.os }}-sanitizer- | |
| - name: Install Rust | |
| run: rustup update nightly && rustup default nightly | |
| - name: Install rust-src | |
| run: rustup component add rust-src | |
| - name: ASAN / LSAN / MSAN / TSAN | |
| run: bash ci/sanitizer.sh | |
| miri-tb: | |
| name: miri-tb-${{ matrix.target }} | |
| strategy: | |
| matrix: | |
| include: | |
| - os: ubuntu-latest | |
| target: x86_64-unknown-linux-gnu | |
| - os: ubuntu-latest | |
| target: aarch64-unknown-linux-gnu | |
| - os: ubuntu-latest | |
| target: i686-unknown-linux-gnu | |
| - os: ubuntu-latest | |
| target: powerpc64-unknown-linux-gnu | |
| - os: ubuntu-latest | |
| target: s390x-unknown-linux-gnu | |
| - os: ubuntu-latest | |
| target: riscv64gc-unknown-linux-gnu | |
| - os: macos-latest | |
| target: aarch64-apple-darwin | |
| runs-on: ${{ matrix.os }} | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Cache cargo build and registry | |
| uses: actions/cache@v5 | |
| with: | |
| path: | | |
| ~/.cargo/registry | |
| ~/.cargo/git | |
| target | |
| key: ${{ runner.os }}-miri-${{ hashFiles('**/Cargo.lock') }} | |
| restore-keys: | | |
| ${{ runner.os }}-miri- | |
| - name: Miri | |
| run: | | |
| bash ci/miri_tb.sh "${{ matrix.target }}" | |
| miri-sb: | |
| name: miri-sb-${{ matrix.target }} | |
| strategy: | |
| matrix: | |
| include: | |
| - os: ubuntu-latest | |
| target: x86_64-unknown-linux-gnu | |
| - os: ubuntu-latest | |
| target: aarch64-unknown-linux-gnu | |
| - os: ubuntu-latest | |
| target: i686-unknown-linux-gnu | |
| - os: ubuntu-latest | |
| target: powerpc64-unknown-linux-gnu | |
| - os: ubuntu-latest | |
| target: s390x-unknown-linux-gnu | |
| - os: ubuntu-latest | |
| target: riscv64gc-unknown-linux-gnu | |
| - os: macos-latest | |
| target: aarch64-apple-darwin | |
| runs-on: ${{ matrix.os }} | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Cache cargo build and registry | |
| uses: actions/cache@v5 | |
| with: | |
| path: | | |
| ~/.cargo/registry | |
| ~/.cargo/git | |
| target | |
| key: ${{ runner.os }}-miri-${{ hashFiles('**/Cargo.lock') }} | |
| restore-keys: | | |
| ${{ runner.os }}-miri- | |
| - name: Miri | |
| run: | | |
| bash ci/miri_sb.sh "${{ matrix.target }}" | |
| # valgrind: | |
| # name: valgrind | |
| # runs-on: ubuntu-latest | |
| # steps: | |
| # - uses: actions/checkout@v6 | |
| # - name: Cache cargo build and registry | |
| # uses: actions/cache@v5 | |
| # with: | |
| # path: | | |
| # ~/.cargo/registry | |
| # ~/.cargo/git | |
| # target | |
| # key: ubuntu-latest-valgrind-${{ hashFiles('**/Cargo.lock') }} | |
| # restore-keys: | | |
| # ubuntu-latest-valgrind- | |
| # - name: Install Rust | |
| # run: rustup update stable && rustup default stable | |
| # - name: Install Valgrind | |
| # run: | | |
| # sudo apt-get update -y | |
| # sudo apt-get install -y valgrind | |
| # # Uncomment and customize when you have binaries to test: | |
| # # - name: cargo build foo | |
| # # run: cargo build --bin foo | |
| # # working-directory: integration | |
| # # - name: Run valgrind foo | |
| # # run: valgrind --error-exitcode=1 --leak-check=full --show-leak-kinds=all ./target/debug/foo | |
| # # working-directory: integration | |
| coverage: | |
| name: coverage | |
| runs-on: ubuntu-latest | |
| needs: | |
| - rustfmt | |
| - clippy | |
| - build | |
| - cross | |
| - test | |
| - sanitizer | |
| steps: | |
| - uses: actions/checkout@v6 | |
| - name: Install Rust | |
| run: rustup update nightly && rustup default nightly | |
| - name: Install cargo-tarpaulin | |
| run: cargo install cargo-tarpaulin | |
| - name: Cache cargo build and registry | |
| uses: actions/cache@v5 | |
| with: | |
| path: | | |
| ~/.cargo/registry | |
| ~/.cargo/git | |
| target | |
| key: ${{ runner.os }}-coverage-${{ hashFiles('**/Cargo.lock') }} | |
| restore-keys: | | |
| ${{ runner.os }}-coverage- | |
| - name: Run tarpaulin | |
| env: | |
| RUSTFLAGS: "--cfg tarpaulin" | |
| # `--all-features` would activate `cuda` / `tensorrt` / `rocm` | |
| # / `directml` / `coreml`, which require the corresponding | |
| # vendor SDKs to compile — see the clippy job. Cover only the | |
| # features that actually compile on a stock ubuntu-latest | |
| # runner. | |
| run: cargo tarpaulin --features inference,serde --run-types tests --run-types doctests --workspace --out xml | |
| - name: Upload to codecov.io | |
| uses: codecov/codecov-action@v6 | |
| with: | |
| token: ${{ secrets.CODECOV_TOKEN }} | |
| slug: ${{ github.repository }} | |
| fail_ci_if_error: true |