bcbd1bdb22
Integ / changes (push) Has been skipped
Pre-commit / pre-commit (push) Failing after 1s
CLI exit codes / changes (push) Has been skipped
Test (Install) / changes (push) Has been skipped
Test (Python) / changes (push) Has been skipped
Test (TypeScript) / changes (push) Has been skipped
CLI exit codes / cli-gate (push) Has been cancelled
Test (Install) / test-install-gate (push) Has been cancelled
Integ / integ-gate (push) Has been cancelled
Test (Python) / test-python-gate (push) Has been cancelled
Test (TypeScript) / test-typescript-gate (push) Has been cancelled
Test (Install) / python-minimal (3.12) (push) Has been cancelled
Test (Install) / python-minimal (3.11) (push) Has been cancelled
Test (Install) / python-extra (agno, mirage.agents.agno) (push) Has been cancelled
Test (Install) / python-extra (chroma, mirage.resource.chroma) (push) Has been cancelled
Test (Install) / python-extra (pdf, mirage.core.filetype.pdf) (push) Has been cancelled
Integ / integ (push) Has been cancelled
Integ / integ-database (push) Has been cancelled
Integ / integ-database-ts (push) Has been cancelled
Integ / integ-data (push) Has been cancelled
Integ / integ-ssh (push) Has been cancelled
Integ / integ-ssh-ts (push) Has been cancelled
Test (Python) / audit (push) Has been cancelled
Test (TypeScript) / test (push) Has been cancelled
Test (TypeScript) / python-fs-shim (push) Has been cancelled
CLI exit codes / Python CLI (push) Has been cancelled
CLI exit codes / TypeScript CLI (push) Has been cancelled
CLI exit codes / Cross-language snapshot interop (push) Has been cancelled
Test (Python) / test (push) Has been cancelled
Test (Python) / import-isolation (deepagents, openai, mirage.agents.openai_agents) (push) Has been cancelled
Test (Python) / import-isolation (deepagents, pydantic-ai, mirage.agents.pydantic_ai) (push) Has been cancelled
Integ / integ-ts (push) Has been cancelled
Integ / integ-fuse (push) Has been cancelled
Test (Install) / python-extra (databricks, mirage.resource.databricks_volume) (push) Has been cancelled
Test (Install) / python-extra (deepagents, mirage.agents.langchain) (push) Has been cancelled
Test (Install) / python-extra (email, mirage.resource.email) (push) Has been cancelled
Test (Install) / python-extra (fuse, mirage.fuse.mount) (push) Has been cancelled
Test (Install) / python-extra (hdf5, mirage.core.filetype.hdf5) (push) Has been cancelled
Test (Install) / python-extra (hf, mirage.resource.hf_buckets) (push) Has been cancelled
Test (Install) / python-extra (lancedb, mirage.resource.lancedb) (push) Has been cancelled
Test (Install) / python-extra (langfuse, mirage.resource.langfuse) (push) Has been cancelled
Test (Install) / python-extra (mongodb, mirage.resource.mongodb) (push) Has been cancelled
Test (Install) / python-extra (nextcloud, mirage.resource.nextcloud) (push) Has been cancelled
Test (Install) / python-extra (openai, mirage.agents.openai_agents) (push) Has been cancelled
Test (Install) / python-extra (openhands, mirage.agents.openhands, 3.12) (push) Has been cancelled
Test (Install) / python-extra (parquet, mirage.core.filetype.parquet) (push) Has been cancelled
Test (Install) / python-extra (postgres, mirage.resource.postgres) (push) Has been cancelled
Test (Install) / python-extra (pydantic-ai, mirage.agents.pydantic_ai) (push) Has been cancelled
Test (Install) / python-extra (qdrant, mirage.resource.qdrant) (push) Has been cancelled
Test (Install) / python-extra (redis, mirage.resource.redis) (push) Has been cancelled
Test (Install) / python-extra (s3, mirage.resource.s3) (push) Has been cancelled
Test (Install) / python-extra (ssh, mirage.resource.ssh) (push) Has been cancelled
Test (Install) / ts-minimal (push) Has been cancelled
776 lines
25 KiB
YAML
776 lines
25 KiB
YAML
name: Integ
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
"on":
|
|
push:
|
|
branches: [main]
|
|
paths:
|
|
- integ/**
|
|
- data/**
|
|
- python/**
|
|
- typescript/**
|
|
- .github/workflows/test_integ.yml
|
|
pull_request:
|
|
branches: [main]
|
|
workflow_dispatch:
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
changes:
|
|
runs-on: ubuntu-latest
|
|
if: github.event_name == 'pull_request'
|
|
permissions:
|
|
pull-requests: read
|
|
outputs:
|
|
core: ${{ steps.filter.outputs.core }}
|
|
ts: ${{ steps.filter.outputs.ts }}
|
|
database: ${{ steps.filter.outputs.database }}
|
|
data: ${{ steps.filter.outputs.data }}
|
|
ssh: ${{ steps.filter.outputs.ssh }}
|
|
fuse: ${{ steps.filter.outputs.fuse }}
|
|
steps:
|
|
- uses: dorny/paths-filter@v4
|
|
id: filter
|
|
with:
|
|
filters: |
|
|
core:
|
|
- 'integ/**'
|
|
- 'data/**'
|
|
- 'python/**'
|
|
- '.github/workflows/test_integ.yml'
|
|
ts:
|
|
- 'integ/**'
|
|
- 'typescript/**'
|
|
- '.github/workflows/test_integ.yml'
|
|
database:
|
|
- 'integ/mongodb.py'
|
|
- 'integ/mongodb.ts'
|
|
- 'integ/truth_mongodb.txt'
|
|
- 'integ/postgres.py'
|
|
- 'integ/postgres.ts'
|
|
- 'integ/truth_postgres.txt'
|
|
- 'integ/chroma.py'
|
|
- 'integ/chroma.ts'
|
|
- 'integ/truth_chroma.txt'
|
|
- 'integ/check_lines.sh'
|
|
- 'python/mirage/accessor/mongodb.py'
|
|
- 'python/mirage/core/mongodb/**'
|
|
- 'python/mirage/commands/builtin/mongodb/**'
|
|
- 'python/mirage/resource/mongodb/**'
|
|
- 'python/mirage/accessor/postgres.py'
|
|
- 'python/mirage/core/postgres/**'
|
|
- 'python/mirage/commands/builtin/postgres/**'
|
|
- 'python/mirage/resource/postgres/**'
|
|
- 'python/mirage/accessor/chroma.py'
|
|
- 'python/mirage/core/chroma/**'
|
|
- 'python/mirage/commands/builtin/chroma/**'
|
|
- 'python/mirage/resource/chroma/**'
|
|
- 'integ/qdrant.py'
|
|
- 'integ/qdrant.ts'
|
|
- 'integ/truth_qdrant.txt'
|
|
- 'python/mirage/accessor/qdrant.py'
|
|
- 'python/mirage/core/qdrant/**'
|
|
- 'python/mirage/commands/builtin/qdrant/**'
|
|
- 'python/mirage/resource/qdrant/**'
|
|
- 'typescript/**'
|
|
- '.github/workflows/test_integ.yml'
|
|
data:
|
|
- 'integ/**'
|
|
- 'python/**'
|
|
- '.github/workflows/test_integ.yml'
|
|
ssh:
|
|
- 'integ/ssh.py'
|
|
- 'integ/ssh.ts'
|
|
- 'integ/truth.txt'
|
|
- 'integ/cases.py'
|
|
- 'integ/cases.ts'
|
|
- 'python/mirage/accessor/ssh.py'
|
|
- 'python/mirage/core/ssh/**'
|
|
- 'python/mirage/commands/builtin/ssh/**'
|
|
- 'python/mirage/resource/ssh/**'
|
|
- 'typescript/packages/node/src/accessor/ssh.ts'
|
|
- 'typescript/packages/node/src/core/ssh/**'
|
|
- 'typescript/packages/node/src/commands/builtin/ssh/**'
|
|
- 'typescript/packages/node/src/resource/ssh/**'
|
|
- 'typescript/packages/node/src/ops/ssh/**'
|
|
- '.github/workflows/test_integ.yml'
|
|
fuse:
|
|
- 'integ/fuse.py'
|
|
- 'integ/fuse.ts'
|
|
- 'integ/truth_fuse.txt'
|
|
- 'integ/check_lines.sh'
|
|
- 'integ/package.json'
|
|
- 'python/mirage/fuse/**'
|
|
- 'python/mirage/workspace/fuse.py'
|
|
- 'typescript/packages/node/src/fuse/**'
|
|
- 'typescript/packages/node/src/workspace/fuse.ts'
|
|
- 'typescript/packages/node/src/workspace.ts'
|
|
- '.github/workflows/test_integ.yml'
|
|
|
|
integ:
|
|
needs: changes
|
|
if: ${{ !cancelled() && (github.event_name != 'pull_request' || needs.changes.outputs.core == 'true') }}
|
|
runs-on: ubuntu-latest
|
|
services:
|
|
redis:
|
|
image: redis:7
|
|
ports:
|
|
- 6379:6379
|
|
options: >-
|
|
--health-cmd "redis-cli ping"
|
|
--health-interval 10s
|
|
--health-timeout 5s
|
|
--health-retries 5
|
|
env:
|
|
REDIS_URL: redis://localhost:6379/0
|
|
steps:
|
|
- uses: actions/checkout@v7
|
|
|
|
- name: Set up Python
|
|
uses: actions/setup-python@v6
|
|
with:
|
|
python-version: "3.12"
|
|
|
|
- name: Install uv
|
|
uses: astral-sh/setup-uv@v7
|
|
with:
|
|
enable-cache: true
|
|
|
|
- name: Install Python dependencies
|
|
working-directory: python
|
|
run: uv sync --all-extras --no-extra camel
|
|
|
|
- name: Run RAM backend and diff against truth
|
|
run: |
|
|
./python/.venv/bin/python integ/ram.py > /tmp/ram.out
|
|
diff integ/truth.txt /tmp/ram.out
|
|
|
|
- name: Run Disk backend and diff against truth
|
|
run: |
|
|
./python/.venv/bin/python integ/disk.py > /tmp/disk.out
|
|
diff integ/truth.txt /tmp/disk.out
|
|
|
|
- name: Run Redis backend and diff against truth
|
|
run: |
|
|
./python/.venv/bin/python integ/redis.py > /tmp/redis.out
|
|
diff integ/truth.txt /tmp/redis.out
|
|
|
|
- name: Run Safeguard scenarios and diff against truth
|
|
run: |
|
|
./python/.venv/bin/python integ/safeguard.py > /tmp/safeguard.out
|
|
diff integ/truth_safeguard.txt /tmp/safeguard.out
|
|
|
|
- name: Run History scenarios and diff against truth
|
|
run: |
|
|
./python/.venv/bin/python integ/history.py > /tmp/history.out
|
|
diff integ/truth_history.txt /tmp/history.out
|
|
|
|
- name: Run s3 + gcs + minio integ (moto) and diff against truth
|
|
run: |
|
|
./python/.venv/bin/python integ/s3.py > /tmp/s3.out
|
|
diff integ/truth_s3.txt /tmp/s3.out
|
|
|
|
- name: Run shared command suite on s3 (moto) and diff against shared truth
|
|
run: |
|
|
./python/.venv/bin/python integ/s3_cases.py > /tmp/s3_cases.out
|
|
diff integ/truth.txt /tmp/s3_cases.out
|
|
|
|
- name: Run onedrive integ (fake Graph) and diff against truth
|
|
run: |
|
|
./python/.venv/bin/python integ/onedrive.py > /tmp/onedrive.out
|
|
diff integ/truth_onedrive.txt /tmp/onedrive.out
|
|
|
|
- name: Run shared command suite on onedrive (fake Graph) and diff against shared truth
|
|
run: |
|
|
./python/.venv/bin/python integ/onedrive_cases.py > /tmp/onedrive_cases.out
|
|
diff integ/truth.txt /tmp/onedrive_cases.out
|
|
|
|
- name: Run lancedb integ (embedded) and diff against truth
|
|
run: |
|
|
./python/.venv/bin/python integ/lancedb.py > /tmp/lancedb.out
|
|
diff integ/truth_lancedb.txt /tmp/lancedb.out
|
|
|
|
- name: Run find arg-error suite (SaaS backends, dummy creds) and diff
|
|
run: |
|
|
./python/.venv/bin/python integ/find_arg_errors.py > /tmp/fae.out
|
|
diff integ/truth_find_arg_errors.txt /tmp/fae.out
|
|
|
|
- name: Run cross-mount commands (ram -> ram/redis/s3 via moto)
|
|
run: ./python/.venv/bin/python integ/cross_commands.py
|
|
|
|
- name: Run virtual-root mount switching (ram/disk/yaml)
|
|
run: ./python/.venv/bin/python integ/root.py
|
|
|
|
integ-ts:
|
|
needs: changes
|
|
if: ${{ !cancelled() && (github.event_name != 'pull_request' || needs.changes.outputs.ts == 'true') }}
|
|
runs-on: ubuntu-latest
|
|
services:
|
|
redis:
|
|
image: redis:7
|
|
ports:
|
|
- 6379:6379
|
|
options: >-
|
|
--health-cmd "redis-cli ping"
|
|
--health-interval 10s
|
|
--health-timeout 5s
|
|
--health-retries 5
|
|
env:
|
|
REDIS_URL: redis://localhost:6379/0
|
|
S3_BUCKET: mirage-integ
|
|
S3_ENDPOINT: http://localhost:9000
|
|
S3_REGION: us-east-1
|
|
AWS_ACCESS_KEY_ID: minio
|
|
AWS_SECRET_ACCESS_KEY: minio123
|
|
steps:
|
|
- uses: actions/checkout@v7
|
|
|
|
- name: Set up Node
|
|
uses: actions/setup-node@v6
|
|
with:
|
|
node-version: '24'
|
|
|
|
- name: Set up pnpm
|
|
uses: pnpm/action-setup@v6
|
|
with:
|
|
version: 10.32.1
|
|
|
|
- name: Install dependencies
|
|
working-directory: typescript
|
|
run: pnpm install --frozen-lockfile=false
|
|
|
|
- name: Build mirage-core
|
|
working-directory: typescript
|
|
run: pnpm --filter @struktoai/mirage-core build
|
|
|
|
- name: Build mirage-node
|
|
working-directory: typescript
|
|
run: pnpm --filter @struktoai/mirage-node build
|
|
|
|
- name: Build mirage-browser
|
|
working-directory: typescript
|
|
run: pnpm --filter @struktoai/mirage-browser build
|
|
|
|
- name: Start MinIO
|
|
run: |
|
|
for i in $(seq 1 5); do
|
|
docker pull minio/minio:latest && break
|
|
echo "docker pull failed (attempt $i), retrying"; sleep 10
|
|
done
|
|
docker run -d --name minio -p 9000:9000 \
|
|
-e MINIO_ROOT_USER=minio -e MINIO_ROOT_PASSWORD=minio123 \
|
|
minio/minio:latest server /data
|
|
for i in $(seq 1 30); do
|
|
curl -sf http://localhost:9000/minio/health/live && break
|
|
sleep 1
|
|
done
|
|
|
|
- name: Create MinIO bucket
|
|
run: |
|
|
for i in 1 2 3; do
|
|
if curl -fsSL https://dl.min.io/client/mc/release/linux-amd64/mc -o /tmp/mc \
|
|
&& chmod +x /tmp/mc && /tmp/mc --version >/dev/null 2>&1; then
|
|
break
|
|
fi
|
|
echo "mc download attempt $i failed; retrying"; sleep 3
|
|
done
|
|
/tmp/mc --version
|
|
/tmp/mc alias set local http://localhost:9000 minio minio123
|
|
/tmp/mc mb local/mirage-integ || true
|
|
/tmp/mc mb local/mirage-integ-s3 || true
|
|
/tmp/mc mb local/mirage-integ-gcs || true
|
|
/tmp/mc mb local/mirage-integ-minio || true
|
|
|
|
- name: Run RAM backend and diff against truth
|
|
working-directory: integ
|
|
run: |
|
|
pnpm exec tsx ram.ts > /tmp/ts-ram.out
|
|
diff truth.txt /tmp/ts-ram.out
|
|
|
|
- name: Run Disk backend and diff against truth
|
|
working-directory: integ
|
|
run: |
|
|
pnpm exec tsx disk.ts > /tmp/ts-disk.out
|
|
diff truth.txt /tmp/ts-disk.out
|
|
|
|
- name: Run OPFS backend and diff against truth
|
|
working-directory: integ
|
|
run: |
|
|
pnpm exec tsx opfs.ts > /tmp/ts-opfs.out
|
|
diff truth.txt /tmp/ts-opfs.out
|
|
|
|
- name: Run Redis backend and diff against truth
|
|
working-directory: integ
|
|
run: |
|
|
pnpm exec tsx redis.ts > /tmp/ts-redis.out
|
|
diff truth.txt /tmp/ts-redis.out
|
|
|
|
- name: Run Safeguard scenarios and diff against truth
|
|
working-directory: integ
|
|
run: |
|
|
pnpm exec tsx safeguard.ts > /tmp/ts-safeguard.out
|
|
diff truth_safeguard.txt /tmp/ts-safeguard.out
|
|
|
|
- name: Run shared command suite on S3 (MinIO) and diff against truth
|
|
working-directory: integ
|
|
run: |
|
|
pnpm exec tsx s3_cases.ts > /tmp/ts-s3.out
|
|
diff truth.txt /tmp/ts-s3.out
|
|
|
|
- name: Run s3-native suite (multi-cloud/MinIO) and diff against truth
|
|
working-directory: integ
|
|
run: |
|
|
pnpm exec tsx s3.ts > /tmp/ts-s3-native.out
|
|
diff truth_s3_ts.txt /tmp/ts-s3-native.out
|
|
|
|
- name: Run cross-mount commands (ram -> ram/s3 via MinIO)
|
|
working-directory: integ
|
|
run: pnpm exec tsx cross_commands.ts
|
|
|
|
- name: Run notion integ (TS, mock server) and diff against truth
|
|
working-directory: integ
|
|
run: |
|
|
pnpm exec tsx notion.ts > /tmp/notion_ts.out
|
|
diff truth_notion.txt /tmp/notion_ts.out
|
|
|
|
- name: Run lancedb integ (TS, embedded) and diff against truth
|
|
working-directory: integ
|
|
run: |
|
|
pnpm exec tsx lancedb.ts > /tmp/ts-lancedb.out
|
|
diff truth_lancedb.txt /tmp/ts-lancedb.out
|
|
|
|
- name: Run find arg-error suite (SaaS backends, dummy creds) and diff
|
|
working-directory: integ
|
|
run: |
|
|
pnpm exec tsx find_arg_errors.ts > /tmp/ts-fae.out
|
|
diff truth_find_arg_errors.txt /tmp/ts-fae.out
|
|
|
|
integ-database:
|
|
needs: changes
|
|
if: ${{ !cancelled() && (github.event_name != 'pull_request' || needs.changes.outputs.database == 'true') }}
|
|
runs-on: ubuntu-latest
|
|
services:
|
|
postgres:
|
|
image: postgres:16
|
|
env:
|
|
POSTGRES_USER: mirage
|
|
POSTGRES_PASSWORD: mirage
|
|
POSTGRES_DB: mirage_integ
|
|
ports:
|
|
- 5432:5432
|
|
options: >-
|
|
--health-cmd pg_isready
|
|
--health-interval 10s
|
|
--health-timeout 5s
|
|
--health-retries 10
|
|
chroma:
|
|
image: chromadb/chroma:latest
|
|
ports:
|
|
- 8000:8000
|
|
qdrant:
|
|
image: qdrant/qdrant:latest
|
|
ports:
|
|
- 6333:6333
|
|
env:
|
|
MONGODB_URI: mongodb://localhost:27017/?replicaSet=rs0
|
|
POSTGRES_DSN: postgres://mirage:mirage@localhost:5432/mirage_integ
|
|
steps:
|
|
- uses: actions/checkout@v7
|
|
|
|
- name: Set up Python
|
|
uses: actions/setup-python@v6
|
|
with:
|
|
python-version: "3.12"
|
|
|
|
- name: Install uv
|
|
uses: astral-sh/setup-uv@v7
|
|
with:
|
|
enable-cache: true
|
|
|
|
- name: Install Python dependencies
|
|
working-directory: python
|
|
run: uv sync --all-extras --no-extra camel
|
|
|
|
- name: Wait for ChromaDB OSS
|
|
run: |
|
|
for i in $(seq 1 30); do
|
|
curl -sf http://localhost:8000/api/v2/heartbeat && exit 0
|
|
sleep 1
|
|
done
|
|
echo "ChromaDB did not become healthy" >&2
|
|
exit 1
|
|
|
|
- name: Wait for Qdrant
|
|
run: |
|
|
for i in $(seq 1 30); do
|
|
curl -sf http://localhost:6333/readyz && exit 0
|
|
sleep 1
|
|
done
|
|
echo "Qdrant did not become healthy" >&2
|
|
exit 1
|
|
|
|
- name: Start MongoDB replica set
|
|
run: |
|
|
docker run -d --name mongo -p 27017:27017 mongo:8 \
|
|
mongod --replSet rs0 --bind_ip_all
|
|
for i in $(seq 1 30); do
|
|
docker exec mongo mongosh --quiet --eval 'db.runCommand({ping:1}).ok' >/dev/null 2>&1 && break
|
|
sleep 1
|
|
done
|
|
docker exec mongo mongosh --quiet --eval \
|
|
"rs.initiate({_id:'rs0',members:[{_id:0,host:'localhost:27017'}]})"
|
|
for i in $(seq 1 30); do
|
|
[ "$(docker exec mongo mongosh --quiet --eval 'db.hello().isWritablePrimary' 2>/dev/null)" = "true" ] && break
|
|
sleep 1
|
|
done
|
|
|
|
- name: Run MongoDB backend and check against truth
|
|
shell: bash
|
|
run: |
|
|
set -o pipefail
|
|
./python/.venv/bin/python integ/mongodb.py 2>&1 \
|
|
| bash integ/check_lines.sh integ/truth_mongodb.txt
|
|
|
|
- name: Run Postgres backend and check against truth
|
|
shell: bash
|
|
run: |
|
|
set -o pipefail
|
|
./python/.venv/bin/python integ/postgres.py 2>&1 \
|
|
| bash integ/check_lines.sh integ/truth_postgres.txt
|
|
|
|
- name: Run chroma integ (ChromaDB OSS) and diff against truth
|
|
run: |
|
|
./python/.venv/bin/python integ/chroma.py > /tmp/chroma.out
|
|
diff integ/truth_chroma.txt /tmp/chroma.out
|
|
|
|
- name: Run qdrant integ and diff against truth
|
|
run: |
|
|
./python/.venv/bin/python integ/qdrant.py > /tmp/qdrant.out
|
|
diff integ/truth_qdrant.txt /tmp/qdrant.out
|
|
|
|
integ-database-ts:
|
|
needs: changes
|
|
if: ${{ !cancelled() && (github.event_name != 'pull_request' || needs.changes.outputs.database == 'true') }}
|
|
runs-on: ubuntu-latest
|
|
services:
|
|
postgres:
|
|
image: postgres:16
|
|
env:
|
|
POSTGRES_USER: mirage
|
|
POSTGRES_PASSWORD: mirage
|
|
POSTGRES_DB: mirage_integ
|
|
ports:
|
|
- 5432:5432
|
|
options: >-
|
|
--health-cmd pg_isready
|
|
--health-interval 10s
|
|
--health-timeout 5s
|
|
--health-retries 10
|
|
chroma:
|
|
image: chromadb/chroma:latest
|
|
ports:
|
|
- 8000:8000
|
|
qdrant:
|
|
image: qdrant/qdrant:latest
|
|
ports:
|
|
- 6333:6333
|
|
env:
|
|
MONGODB_URI: mongodb://localhost:27017/?replicaSet=rs0
|
|
POSTGRES_DSN: postgres://mirage:mirage@localhost:5432/mirage_integ
|
|
steps:
|
|
- uses: actions/checkout@v7
|
|
|
|
- name: Set up Node
|
|
uses: actions/setup-node@v6
|
|
with:
|
|
node-version: '24'
|
|
|
|
- name: Set up pnpm
|
|
uses: pnpm/action-setup@v6
|
|
with:
|
|
version: 10.32.1
|
|
|
|
- name: Install dependencies
|
|
working-directory: typescript
|
|
run: pnpm install --frozen-lockfile=false
|
|
|
|
- name: Build mirage-core
|
|
working-directory: typescript
|
|
run: pnpm --filter @struktoai/mirage-core build
|
|
|
|
- name: Build mirage-node
|
|
working-directory: typescript
|
|
run: pnpm --filter @struktoai/mirage-node build
|
|
|
|
- name: Wait for ChromaDB OSS
|
|
run: |
|
|
for i in $(seq 1 30); do
|
|
curl -sf http://localhost:8000/api/v2/heartbeat && exit 0
|
|
sleep 1
|
|
done
|
|
echo "ChromaDB did not become healthy" >&2
|
|
exit 1
|
|
|
|
- name: Start MongoDB replica set
|
|
run: |
|
|
docker run -d --name mongo -p 27017:27017 mongo:8 \
|
|
mongod --replSet rs0 --bind_ip_all
|
|
for i in $(seq 1 30); do
|
|
docker exec mongo mongosh --quiet --eval 'db.runCommand({ping:1}).ok' >/dev/null 2>&1 && break
|
|
sleep 1
|
|
done
|
|
docker exec mongo mongosh --quiet --eval \
|
|
"rs.initiate({_id:'rs0',members:[{_id:0,host:'localhost:27017'}]})"
|
|
for i in $(seq 1 30); do
|
|
[ "$(docker exec mongo mongosh --quiet --eval 'db.hello().isWritablePrimary' 2>/dev/null)" = "true" ] && break
|
|
sleep 1
|
|
done
|
|
|
|
- name: Wait for Qdrant
|
|
run: |
|
|
for i in $(seq 1 30); do
|
|
curl -sf http://localhost:6333/readyz && exit 0
|
|
sleep 1
|
|
done
|
|
echo "Qdrant did not become healthy" >&2
|
|
exit 1
|
|
|
|
- name: Run MongoDB backend (TS) and check against truth
|
|
shell: bash
|
|
working-directory: integ
|
|
run: |
|
|
set -o pipefail
|
|
pnpm exec tsx mongodb.ts 2>&1 \
|
|
| bash check_lines.sh truth_mongodb.txt
|
|
|
|
- name: Run Postgres backend (TS) and check against truth
|
|
shell: bash
|
|
working-directory: integ
|
|
run: |
|
|
set -o pipefail
|
|
pnpm exec tsx postgres.ts 2>&1 \
|
|
| bash check_lines.sh truth_postgres.txt
|
|
|
|
- name: Run TS chroma integ (ChromaDB OSS) and diff against truth
|
|
working-directory: integ
|
|
run: |
|
|
pnpm exec tsx chroma.ts > /tmp/ts-chroma.out
|
|
diff truth_chroma.txt /tmp/ts-chroma.out
|
|
|
|
- name: Run TS qdrant integ and diff against truth
|
|
working-directory: integ
|
|
run: |
|
|
pnpm exec tsx qdrant.ts > /tmp/ts-qdrant.out
|
|
diff truth_qdrant.txt /tmp/ts-qdrant.out
|
|
|
|
integ-data:
|
|
needs: changes
|
|
if: ${{ !cancelled() && (github.event_name != 'pull_request' || needs.changes.outputs.data == 'true') }}
|
|
runs-on: ubuntu-latest
|
|
services:
|
|
nextcloud:
|
|
image: nextcloud:30-apache
|
|
ports:
|
|
- 8080:80
|
|
env:
|
|
SQLITE_DATABASE: nextcloud
|
|
NEXTCLOUD_ADMIN_USER: admin
|
|
NEXTCLOUD_ADMIN_PASSWORD: admin123
|
|
NEXTCLOUD_TRUSTED_DOMAINS: localhost
|
|
env:
|
|
NEXTCLOUD_URL: http://localhost:8080/remote.php/dav/files/admin/
|
|
NEXTCLOUD_USERNAME: admin
|
|
NEXTCLOUD_PASSWORD: admin123
|
|
steps:
|
|
- uses: actions/checkout@v7
|
|
|
|
- name: Set up Python
|
|
uses: actions/setup-python@v6
|
|
with:
|
|
python-version: "3.12"
|
|
|
|
- name: Install uv
|
|
uses: astral-sh/setup-uv@v7
|
|
with:
|
|
enable-cache: true
|
|
|
|
- name: Install Python dependencies
|
|
working-directory: python
|
|
run: uv sync --all-extras --no-extra camel
|
|
|
|
- name: Run dify integ (mock server) and diff against truth
|
|
run: |
|
|
./python/.venv/bin/python integ/dify.py > /tmp/dify.out
|
|
diff integ/truth_dify.txt /tmp/dify.out
|
|
|
|
- name: Run notion integ (mock server) and diff against truth
|
|
run: |
|
|
./python/.venv/bin/python integ/notion.py > /tmp/notion.out
|
|
diff integ/truth_notion.txt /tmp/notion.out
|
|
|
|
- name: Wait for Nextcloud install
|
|
shell: bash
|
|
run: |
|
|
for i in $(seq 1 60); do
|
|
if curl -sf http://localhost:8080/status.php | grep -q '"installed":true'; then
|
|
echo "Nextcloud is installed"
|
|
exit 0
|
|
fi
|
|
sleep 5
|
|
done
|
|
echo "Nextcloud did not finish installing in time" >&2
|
|
curl -s http://localhost:8080/status.php || true
|
|
exit 1
|
|
|
|
- name: Run Nextcloud backend and check against truth
|
|
shell: bash
|
|
run: |
|
|
set -o pipefail
|
|
./python/.venv/bin/python integ/nextcloud.py 2>&1 \
|
|
| bash integ/check_lines.sh integ/truth_nextcloud.txt
|
|
|
|
- name: Run shared cases on Nextcloud and diff against truth
|
|
run: |
|
|
./python/.venv/bin/python integ/nextcloud_cases.py > /tmp/nextcloud_cases.out
|
|
diff integ/truth.txt /tmp/nextcloud_cases.out
|
|
|
|
integ-ssh:
|
|
needs: changes
|
|
if: ${{ !cancelled() && (github.event_name != 'pull_request' || needs.changes.outputs.ssh == 'true') }}
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v7
|
|
|
|
- name: Set up Python
|
|
uses: actions/setup-python@v6
|
|
with:
|
|
python-version: "3.12"
|
|
|
|
- name: Install uv
|
|
uses: astral-sh/setup-uv@v7
|
|
with:
|
|
enable-cache: true
|
|
|
|
- name: Install Python dependencies
|
|
working-directory: python
|
|
run: uv sync --all-extras --no-extra camel
|
|
|
|
- name: Run ssh integ (mock sftp server) and diff against truth
|
|
run: |
|
|
./python/.venv/bin/python integ/ssh.py > /tmp/ssh.out
|
|
diff integ/truth.txt /tmp/ssh.out
|
|
|
|
integ-ssh-ts:
|
|
needs: changes
|
|
if: ${{ !cancelled() && (github.event_name != 'pull_request' || needs.changes.outputs.ssh == 'true') }}
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v7
|
|
|
|
- name: Set up Node
|
|
uses: actions/setup-node@v6
|
|
with:
|
|
node-version: '24'
|
|
|
|
- name: Set up pnpm
|
|
uses: pnpm/action-setup@v6
|
|
with:
|
|
version: 10.32.1
|
|
|
|
- name: Install dependencies
|
|
working-directory: typescript
|
|
run: pnpm install --frozen-lockfile=false
|
|
|
|
- name: Build mirage-core
|
|
working-directory: typescript
|
|
run: pnpm --filter @struktoai/mirage-core build
|
|
|
|
- name: Build mirage-node
|
|
working-directory: typescript
|
|
run: pnpm --filter @struktoai/mirage-node build
|
|
|
|
- name: Run TS ssh integ (mock sftp server) and diff against truth
|
|
working-directory: integ
|
|
run: |
|
|
pnpm exec tsx ssh.ts > /tmp/ts-ssh.out
|
|
diff truth.txt /tmp/ts-ssh.out
|
|
|
|
integ-fuse:
|
|
needs: changes
|
|
if: ${{ !cancelled() && (github.event_name != 'pull_request' || needs.changes.outputs.fuse == 'true') }}
|
|
runs-on: ubuntu-latest
|
|
steps:
|
|
- uses: actions/checkout@v7
|
|
|
|
- name: Install libfuse (fusermount3 + libfuse2 for mfusepy, libfuse3 headers for fuse-native)
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install -y fuse3 libfuse3-dev libfuse2t64 || \
|
|
sudo apt-get install -y fuse3 libfuse3-dev libfuse2
|
|
|
|
- name: Set up Python
|
|
uses: actions/setup-python@v6
|
|
with:
|
|
python-version: "3.12"
|
|
|
|
- name: Install uv
|
|
uses: astral-sh/setup-uv@v7
|
|
with:
|
|
enable-cache: true
|
|
|
|
- name: Install Python dependencies
|
|
working-directory: python
|
|
run: uv sync --all-extras --no-extra camel
|
|
|
|
- name: Run Python FUSE mount and check (real libfuse)
|
|
run: |
|
|
./python/.venv/bin/python integ/fuse.py 2>&1 \
|
|
| bash integ/check_lines.sh integ/truth_fuse.txt
|
|
|
|
- name: Set up Node
|
|
uses: actions/setup-node@v6
|
|
with:
|
|
node-version: '24'
|
|
|
|
- name: Set up pnpm
|
|
uses: pnpm/action-setup@v6
|
|
with:
|
|
version: 10.32.1
|
|
|
|
- name: Install dependencies (builds @zkochan/fuse-native against libfuse3)
|
|
working-directory: typescript
|
|
run: pnpm install --frozen-lockfile=false
|
|
|
|
- name: Build mirage-core
|
|
working-directory: typescript
|
|
run: pnpm --filter @struktoai/mirage-core build
|
|
|
|
- name: Build mirage-node
|
|
working-directory: typescript
|
|
run: pnpm --filter @struktoai/mirage-node build
|
|
|
|
- name: Run TypeScript FUSE mount and check (real libfuse)
|
|
working-directory: integ
|
|
run: |
|
|
pnpm exec tsx fuse.ts 2>&1 \
|
|
| bash check_lines.sh truth_fuse.txt
|
|
|
|
gate:
|
|
name: integ-gate
|
|
runs-on: ubuntu-latest
|
|
needs: [changes, integ, integ-ts, integ-database, integ-database-ts, integ-data, integ-ssh, integ-ssh-ts, integ-fuse]
|
|
if: always()
|
|
steps:
|
|
- name: Check required jobs
|
|
run: |
|
|
results="${{ join(needs.*.result, ' ') }}"
|
|
echo "$results"
|
|
case "$results" in
|
|
*failure*|*cancelled*) exit 1 ;;
|
|
esac
|