name: CI
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
CARGO_TERM_COLOR: always
RUSTFLAGS: -D warnings
jobs:
check:
name: Format, Build & Test
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: jlumbroso/free-disk-space@main
with:
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: true
docker-images: true
swap-storage: true
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- uses: Swatinem/rust-cache@v2
with:
cache-directories: |
~/.cargo/bin
target/infino-bench/rustfs
- name: Install cargo-llvm-cov
run: |
if ! command -v cargo-llvm-cov &> /dev/null; then
cargo install cargo-llvm-cov --locked
fi
- run: make ci
- name: RustFS storage wire + smoke tests
run: cargo test --features test-helpers --test supertable 'storage::rustfs_s3_wire::|storage::smoke_rustfs::' -- --test-threads=1
public-api:
name: Public API surface
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@nightly
- uses: Swatinem/rust-cache@v2
with:
cache-directories: |
~/.cargo/bin
- name: Install cargo-public-api
run: |
if ! command -v cargo-public-api &> /dev/null; then
cargo install cargo-public-api --locked
fi
- run: make public-api
python:
name: Python wheel & tests (${{ matrix.os }})
runs-on: ${{ matrix.os }}
env:
RUSTFLAGS: ""
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, ubuntu-24.04-arm, macos-14]
steps:
- uses: actions/checkout@v4
- name: Free disk space
if: runner.os == 'Linux'
uses: jlumbroso/free-disk-space@main
with:
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: true
docker-images: true
swap-storage: true
- uses: dtolnay/rust-toolchain@stable
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- uses: Swatinem/rust-cache@v2
with:
workspaces: infino-python
- run: make python-wheel
- name: Smoke-test wheel with uv
shell: bash
run: |
python3 -m pip install --upgrade uv
uv venv /tmp/uv-smoke
uv pip install --python /tmp/uv-smoke infino-python/dist/*.whl pytest pyarrow pandas duckdb
/tmp/uv-smoke/bin/python -m pytest infino-python/tests/ -v
- name: Type-check stubs
if: matrix.os == 'ubuntu-latest'
run: make python-typecheck
- uses: actions/upload-artifact@v4
with:
name: wheel-${{ matrix.os }}
path: infino-python/dist
python-examples:
name: Python examples (end to end)
runs-on: ubuntu-latest
timeout-minutes: 45
env:
RUSTFLAGS: ""
AZURE_AI_ENDPOINT: ${{ secrets.AZURE_AI_ENDPOINT }}
AZURE_AI_API_KEY: ${{ secrets.AZURE_AI_API_KEY }}
DEFAULT_AZURE_MODEL: gpt-5.4
steps:
- uses: actions/checkout@v4
- name: Free disk space
uses: jlumbroso/free-disk-space@main
with:
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: true
docker-images: true
swap-storage: true
- uses: dtolnay/rust-toolchain@stable
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- uses: Swatinem/rust-cache@v2
with:
workspaces: infino-python
- name: Cache HuggingFace assets
uses: actions/cache@v4
with:
path: ~/.cache/huggingface
key: hf-${{ runner.os }}-${{ hashFiles('infino-python/examples/_shared/loaders.py', 'infino-python/examples/_shared/embedding.py') }}
restore-keys: hf-${{ runner.os }}-
- run: make python-examples-test
node:
name: Node bindings (${{ matrix.os }})
runs-on: ${{ matrix.os }}
env:
RUSTFLAGS: ""
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-14]
steps:
- uses: actions/checkout@v4
- name: Free disk space
if: runner.os == 'Linux'
uses: jlumbroso/free-disk-space@main
with:
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: true
docker-images: true
swap-storage: true
- uses: dtolnay/rust-toolchain@stable
- uses: actions/setup-node@v4
with:
node-version: "20"
- uses: Swatinem/rust-cache@v2
with:
workspaces: infino-node
- run: make node-test
node-examples:
name: Node examples (end to end)
runs-on: ubuntu-latest
timeout-minutes: 30
env:
RUSTFLAGS: ""
steps:
- uses: actions/checkout@v4
- name: Free disk space
uses: jlumbroso/free-disk-space@main
with:
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: true
docker-images: true
swap-storage: true
- uses: dtolnay/rust-toolchain@stable
- uses: actions/setup-node@v4
with:
node-version: "20"
- uses: Swatinem/rust-cache@v2
with:
workspaces: infino-node
- run: cd infino-node && npm install && npm run build:debug
- run: make node-example
locomo-recall:
name: LOCOMO recall test
runs-on: ubuntu-latest
timeout-minutes: 30
steps:
- uses: actions/checkout@v4
- name: Free disk space
uses: jlumbroso/free-disk-space@main
with:
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: true
docker-images: true
swap-storage: true
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
- run: cargo run --example locomo-recall -- --fail-under=0.68
object-store-e2e-guard:
name: Object store e2e (secret check)
runs-on: ubuntu-latest
environment: ci
outputs:
azure: ${{ steps.check.outputs.azure }}
gcs: ${{ steps.check.outputs.gcs }}
any: ${{ steps.check.outputs.any }}
steps:
- id: check
run: |
azure=false; gcs=false
if [ -n "${{ secrets.AZURE_STORAGE_ACCOUNT_KEY }}" ] && [ -n "${{ secrets.INFINO_REAL_AZURE_CONTAINER }}" ]; then azure=true; fi
if [ -n "${{ secrets.GCP_SA_KEY }}" ] && [ -n "${{ secrets.INFINO_REAL_GCS_BUCKET }}" ]; then gcs=true; fi
any=false; if [ "$azure" = true ] || [ "$gcs" = true ]; then any=true; fi
{ echo "azure=$azure"; echo "gcs=$gcs"; echo "any=$any"; } >> "$GITHUB_OUTPUT"
object-store-e2e:
name: Object store e2e
needs: object-store-e2e-guard
if: needs.object-store-e2e-guard.outputs.any == 'true'
runs-on: ubuntu-latest
environment: ci
timeout-minutes: 30
env:
RUSTFLAGS: ""
INFINO_TEST_REAL_AZURE: "1"
INFINO_TEST_REAL_GCS: "1"
AZURE_STORAGE_ACCOUNT_NAME: ${{ secrets.AZURE_STORAGE_ACCOUNT_NAME }}
AZURE_STORAGE_ACCOUNT_KEY: ${{ secrets.AZURE_STORAGE_ACCOUNT_KEY }}
AZURE_STORAGE_CONTAINER_NAME: ${{ secrets.INFINO_REAL_AZURE_CONTAINER }}
INFINO_REAL_GCS_BUCKET: ${{ secrets.INFINO_REAL_GCS_BUCKET }}
GOOGLE_SERVICE_ACCOUNT_KEY: ${{ secrets.GCP_SA_KEY }}
INFINO_E2E_PREFIX: e2e/${{ github.run_id }}
steps:
- uses: actions/checkout@v4
- name: Free disk space
uses: jlumbroso/free-disk-space@main
with:
tool-cache: false
android: true
dotnet: true
haskell: true
large-packages: true
docker-images: true
swap-storage: true
- uses: dtolnay/rust-toolchain@stable
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- uses: actions/setup-node@v4
with:
node-version: "20"
- uses: Swatinem/rust-cache@v2
- name: Build Python binding
run: |
python3 -m pip install --upgrade uv
uv venv /tmp/uv-object-store-e2e
source /tmp/uv-object-store-e2e/bin/activate
uv pip install maturin pytest pyarrow
maturin develop --manifest-path infino-python/Cargo.toml
- name: Build Node binding
working-directory: infino-node
run: |
npm install
npm run build:debug
- name: Azure · Python
if: needs.object-store-e2e-guard.outputs.azure == 'true'
run: |
source /tmp/uv-object-store-e2e/bin/activate
python -m pytest infino-python/tests/test_azure_e2e.py -v
- name: Azure · Node
if: needs.object-store-e2e-guard.outputs.azure == 'true'
working-directory: infino-node
run: node --test __test__/azure.e2e.test.mjs
- name: GCS · Python
if: needs.object-store-e2e-guard.outputs.gcs == 'true'
run: |
source /tmp/uv-object-store-e2e/bin/activate
python -m pytest infino-python/tests/test_gcs_e2e.py -v
- name: GCS · Node
if: needs.object-store-e2e-guard.outputs.gcs == 'true'
working-directory: infino-node
run: node --test __test__/gcs.e2e.test.mjs
- name: Clean up Azure blobs
if: always() && needs.object-store-e2e-guard.outputs.azure == 'true'
continue-on-error: true
run: |
az storage blob delete-batch \
--account-name "$AZURE_STORAGE_ACCOUNT_NAME" \
--account-key "$AZURE_STORAGE_ACCOUNT_KEY" \
--source "$AZURE_STORAGE_CONTAINER_NAME" \
--pattern "$INFINO_E2E_PREFIX/*"
- name: Clean up GCS objects
if: always() && needs.object-store-e2e-guard.outputs.gcs == 'true'
continue-on-error: true
run: |
printf '%s' "$GOOGLE_SERVICE_ACCOUNT_KEY" > /tmp/gcs-key.json
gcloud auth activate-service-account --key-file=/tmp/gcs-key.json
gcloud storage rm -r "gs://$INFINO_REAL_GCS_BUCKET/$INFINO_E2E_PREFIX/" || true
rm -f /tmp/gcs-key.json