Skip to content
Closed
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
41 commits
Select commit Hold shift + click to select a range
a014965
Rust plugins
crivetimihai Oct 14, 2025
637d0c1
Rust plugins
crivetimihai Oct 14, 2025
30c5ace
Rust plugins
crivetimihai Oct 14, 2025
b290020
Rust plugins
crivetimihai Oct 14, 2025
2608e30
Rust plugins
crivetimihai Oct 14, 2025
f70c8ea
Rust plugins docker build
crivetimihai Oct 15, 2025
956e1e4
Rust plugins docker build
crivetimihai Oct 15, 2025
f62ada3
Rust plugins docker build
crivetimihai Oct 15, 2025
f7ce8ff
Rust plugins docker build
crivetimihai Oct 15, 2025
fb9174b
Rust plugins docker build
crivetimihai Oct 15, 2025
438b294
Rust plugins docker build
crivetimihai Oct 16, 2025
0274b62
Toggle permissions fix (#1250)
kevalmahajan Oct 14, 2025
902243b
feat: Tool output schema support in db and service layer (#1263)
mattsanchez Oct 16, 2025
82bd25e
UI updates for 1258 (#1269)
crivetimihai Oct 16, 2025
a20be5c
Permissions
crivetimihai Oct 17, 2025
1149071
feat: plugin client server mtls support (#1196)
terylt Oct 17, 2025
6490f37
Fix catalog not showing (#1275)
crivetimihai Oct 17, 2025
54dcb34
Fix catalog not showing (#1276)
crivetimihai Oct 17, 2025
b72c8a0
Add support to build MCP Gateway for s390x platform (#1206)
p4yl04d3r Oct 17, 2025
7a7301a
Fix jti consistency for token creation (#1255)
kevalmahajan Oct 17, 2025
fc43dde
Fix test warnings and mypy type issues (#1268)
jonpspri Oct 17, 2025
e4a3123
chore: add linters for plugins and fix linting issues (#1240)
araujof Oct 17, 2025
38299a2
Fix JWT token follows default variable payload expiry instead of UI (…
kevalmahajan Oct 17, 2025
3a7d985
fix: align cookie scope and RBAC redirects with app root path (#1252)
ESnark Oct 17, 2025
a1267f1
Fix UI margins (#1272)
rh-rahulshetty Oct 17, 2025
b6f34f9
Add CI/CD verification for complete build pipeline (#1257)
jonpspri Oct 17, 2025
81effbe
Rest pass api 746 (#1273)
rakdutta Oct 18, 2025
0311b66
Update CHANGELOG
crivetimihai Oct 18, 2025
acc6247
Consolidate and enhance linting tool configuration (#1271)
jonpspri Oct 18, 2025
a5487d5
Run linters
crivetimihai Oct 18, 2025
3515105
Run linters
crivetimihai Oct 18, 2025
97885e2
fix: gateway test failures and warnings (#1281)
jonpspri Oct 18, 2025
94cc3bc
fix: Testing logger intermittent failures and type-checking in auth (…
jonpspri Oct 18, 2025
7a301a5
Enforce Scoped Uniqueness for Prompts, Resources, and A2A Agents; Upd…
rakdutta Oct 19, 2025
b694ca2
REST API and UI pagination (#1277)
madhav165 Oct 19, 2025
0a94110
fix: Intermittent logger failure in test_passthrough_headers (#1284)
jonpspri Oct 19, 2025
5999d1c
Update CHANGELOG and README (#1288)
crivetimihai Oct 19, 2025
ba89c3a
Feat: gRPC-to-MCP Protocol Translation closes #1171 (#1172)
crivetimihai Oct 19, 2025
c255015
feat: Make Rust plugin builds optional with ENABLE_RUST_BUILD flag
crivetimihai Oct 19, 2025
7ef8052
docs: Update documentation for optional Rust plugin builds
crivetimihai Oct 19, 2025
66657eb
feat: Make Rust plugin builds optional in containers
crivetimihai Oct 19, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
324 changes: 324 additions & 0 deletions .github/workflows/rust-plugins.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,324 @@
name: Rust Plugins CI/CD

on:
push:
branches: [main, develop]
paths:
- "plugins_rust/**"
- "plugins/pii_filter/**"
- ".github/workflows/rust-plugins.yml"
pull_request:
branches: [main, develop]
paths:
- "plugins_rust/**"
- "plugins/pii_filter/**"
workflow_dispatch:

env:
CARGO_TERM_COLOR: always
RUST_BACKTRACE: 1

jobs:
# Rust unit tests and linting
rust-tests:
name: Rust Tests (${{ matrix.os }})
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
rust: [stable]

steps:
- uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@master
with:
toolchain: ${{ matrix.rust }}
components: rustfmt, clippy

- name: Cache Cargo registry
uses: actions/cache@v4
with:
path: ~/.cargo/registry
key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }}

- name: Cache Cargo index
uses: actions/cache@v4
with:
path: ~/.cargo/git
key: ${{ runner.os }}-cargo-index-${{ hashFiles('**/Cargo.lock') }}

- name: Cache Cargo build
uses: actions/cache@v4
with:
path: plugins_rust/target
key: ${{ runner.os }}-cargo-build-${{ hashFiles('**/Cargo.lock') }}

- name: Check formatting
working-directory: plugins_rust
run: cargo fmt --all -- --check

- name: Run Clippy
working-directory: plugins_rust
run: cargo clippy --all-targets --all-features -- -D warnings

- name: Run Rust tests
working-directory: plugins_rust
run: cargo test --verbose

- name: Run Rust integration tests
working-directory: plugins_rust
run: cargo test --test integration --verbose

# Build wheels for multiple platforms
build-wheels:
name: Build wheels on ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]

steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Install maturin
run: pip install maturin

- name: Build wheels
working-directory: plugins_rust
run: maturin build --release --out dist

- name: Upload wheels as artifacts
uses: actions/upload-artifact@v4
with:
name: wheels-${{ matrix.os }}
path: plugins_rust/dist/*.whl

# Python integration tests with Rust extensions
python-integration:
name: Python Integration Tests (${{ matrix.os }}, Python ${{ matrix.python-version }})
runs-on: ${{ matrix.os }}
needs: build-wheels
strategy:
fail-fast: false
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
python-version: ["3.11", "3.12"]

steps:
- uses: actions/checkout@v4

- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install maturin pytest pytest-cov

- name: Build and install Rust extension
working-directory: plugins_rust
run: maturin develop --release

- name: Install Python plugin dependencies
run: |
pip install pydantic

- name: Run Python unit tests (Rust)
run: pytest tests/unit/mcpgateway/plugins/test_pii_filter_rust.py -v

- name: Run differential tests
run: pytest tests/differential/test_pii_filter_differential.py -v

# Benchmarks
benchmarks:
name: Performance Benchmarks
runs-on: ubuntu-latest
needs: build-wheels

steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install maturin pydantic

- name: Build and install Rust extension
working-directory: plugins_rust
run: maturin develop --release

- name: Run Rust benchmarks
working-directory: plugins_rust
run: |
cargo install cargo-criterion || true
cargo criterion --message-format=json > benchmark-results.json || true

- name: Run Python comparison benchmarks
run: |
python benchmarks/compare_pii_filter.py --output benchmark-comparison.json

- name: Upload benchmark results
uses: actions/upload-artifact@v4
with:
name: benchmark-results
path: |
plugins_rust/benchmark-results.json
benchmark-comparison.json

# Security audit
security-audit:
name: Security Audit
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Install cargo-audit
run: cargo install cargo-audit

- name: Run security audit
working-directory: plugins_rust
run: cargo audit

# Coverage report
coverage:
name: Code Coverage
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable
with:
components: llvm-tools-preview

- name: Install coverage tools
run: |
pip install maturin pytest pytest-cov pydantic
cargo install cargo-tarpaulin

- name: Build Rust extension
working-directory: plugins_rust
run: maturin develop --release

- name: Run Python tests with coverage
run: |
pytest tests/unit/mcpgateway/plugins/test_pii_filter_rust.py \
tests/differential/test_pii_filter_differential.py \
--cov=plugins.pii_filter \
--cov-report=xml \
--cov-report=html

- name: Run Rust coverage
working-directory: plugins_rust
run: cargo tarpaulin --out Xml --output-dir coverage

- name: Upload Python coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: ./coverage.xml
flags: python
name: python-coverage

- name: Upload Rust coverage to Codecov
uses: codecov/codecov-action@v4
with:
files: ./plugins_rust/coverage/cobertura.xml
flags: rust
name: rust-coverage

# Build documentation
documentation:
name: Build Documentation
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v4

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Build Rust docs
working-directory: plugins_rust
run: cargo doc --no-deps --document-private-items

- name: Upload documentation
uses: actions/upload-artifact@v4
with:
name: rust-docs
path: plugins_rust/target/doc

# Release build (only on tags)
release:
name: Release Build
runs-on: ${{ matrix.os }}
if: startsWith(github.ref, 'refs/tags/')
needs: [rust-tests, python-integration]
strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]

steps:
- uses: actions/checkout@v4

- name: Set up Python
uses: actions/setup-python@v5
with:
python-version: "3.11"

- name: Install Rust toolchain
uses: dtolnay/rust-toolchain@stable

- name: Install maturin
run: pip install maturin

- name: Build release wheels
working-directory: plugins_rust
run: maturin build --release --out dist

- name: Upload release artifacts
uses: actions/upload-artifact@v4
with:
name: release-wheels-${{ matrix.os }}
path: plugins_rust/dist/*.whl

- name: Publish to PyPI (if tag)
if: startsWith(github.ref, 'refs/tags/')
env:
MATURIN_PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }}
working-directory: plugins_rust
run: maturin publish --username __token__ --password $MATURIN_PYPI_TOKEN
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -176,6 +176,10 @@ docs/_build/
# PyBuilder
target/

# Rust plugin benchmarks
plugins_rust/benchmarks/results/*.json
plugins_rust/benchmarks/results/*.csv

# Jupyter Notebook
.ipynb_checkpoints

Expand Down
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -368,7 +368,7 @@ repos:
description: Verifies test files in tests/ directories start with `test_`.
language: python
files: (^|/)tests/.+\.py$
exclude: ^tests/(.*/)?(pages|helpers|fuzzers|scripts|fixtures|migration|utils|manual|async)/.*\.py$|^tests/migration/.*\.py$|^tests/async/(async_validator|benchmarks|monitor_runner|profile_compare|profiler)\.py$ # Exclude page object, helper, fuzzer, script, fixture, util, manual, migration, and async utility files
exclude: ^tests/(.*/)?(pages|helpers|fuzzers|scripts|fixtures|migration|utils|manual|async|load)/.*\.py$|^tests/migration/.*\.py$|^tests/async/(async_validator|benchmarks|monitor_runner|profile_compare|profiler)\.py$|^tests/load/ # Exclude page object, helper, fuzzer, script, fixture, util, manual, migration, async, and load utility files
args: [--pytest-test-first] # `test_.*\.py`

# - repo: https://github.com/pycqa/flake8
Expand Down
Loading
Loading