Skip to content

Commit c4dd86b

Browse files
authored
ci(e2e-http): split into 2 PR-triggered workflows (lite + full) sharing reusable shape workflow (PR-2 of 2) (#1744)
* ci(e2e-http): split into 2 PR-triggered workflows (lite + full) sharing reusable shape workflow Follow-up to #1740 / #1743. Replaces #1740's intra-job matrix on ``e2e-http-smoke`` with two separate top-level workflows, each PR-triggered and each pinned to one deployment shape. The matrix in #1740 ran identical lanes through the smoke layer; the only difference between lanes was which lazy-init backend the api picked, and the smoke hurl files all set ``enable_*: false`` so neither lane actually exercised pgvector / PG-graph / qdrant / neo4j data paths. This PR moves the shape variation up one layer so each PR runs *both* the smoke layer *and* the provider-aware layer under each shape — the provider layer is where real ingest (embedding + KG extraction) and recall happen, so under this structure the lite job actually exercises the pgvector + PG-graph data path and the full job actually exercises qdrant + neo4j. LLM token cost per PR doubles; this was confirmed acceptable. Files: - ``e2e-http-shape.yml`` (NEW, reusable) — takes ``shape`` input, runs smoke + provider-preflight + provider-aware suite for that shape. ``SHAPE`` env var threads through to ``up.sh``, which sources the matching ``tests/e2e_http/shapes/<shape>.env`` (introduced in #1743). Artifact upload names include the shape so multi-shape runs do not clash. - ``e2e-http-lite.yml`` (NEW, top-level) — PR-triggered + manual; calls ``e2e-http-shape.yml`` with ``shape: lite`` (pgvector + PG-graph). - ``e2e-http-full.yml`` (NEW, top-level) — PR-triggered + manual; calls ``e2e-http-shape.yml`` with ``shape: full-neo4j`` (Qdrant + Neo4j). - ``e2e-http-smoke.yml`` (DELETED) — superseded. - ``cicd-pull-request.yml`` (DELETED) — superseded; the lite/full workflows now PR-trigger directly. Adding a new shape (e.g. nebula) is one new ``e2e-http-<name>.yml`` caller file plus the matching ``shapes/<name>.env`` from #1743. Doc references to the deleted workflow file names (e.g. ``docs/modularization/hurl-coverage-matrix.md``) are deferred to a follow-up sweep — the ``e2e-http-smoke`` *job* name still exists inside ``e2e-http-shape.yml``, so most of those references remain semantically correct. * ci/test: rename shapes to <vector>-<graph>; add qdrant-nebula workflow "full" was misleading because Qdrant+Neo4j and Qdrant+Nebula are equally "full" deployments. Switch to ``<vector>-<graph>`` naming with ``lite`` kept as the special name for the single-PG (pgvector + PG-graph) ApeRAG-Lite deployment: - ``full-neo4j`` → ``qdrant-neo4j`` - ``full-nebula`` → ``qdrant-nebula`` - ``lite`` unchanged The new naming scales: a future hybrid like ``pgvector-neo4j`` slots in cleanly without needing a "full / fuller / fullest" hierarchy. Also wires Nebula into PR-triggered CI per request — every PR now runs all three shapes through both the smoke and the provider-aware layer. LLM token cost per PR triples; this is acceptable for now and a fake provider is on the roadmap to drop the cost back down. Files: - ``tests/e2e_http/shapes/qdrant-{neo4j,nebula}.env`` (renamed; header comments updated) - ``.github/workflows/e2e-http-qdrant-neo4j.yml`` (renamed from ``e2e-http-full.yml``; display name "E2E HTTP Qdrant + Neo4j"; ``shape: qdrant-neo4j``) - ``.github/workflows/e2e-http-qdrant-nebula.yml`` (NEW; display name "E2E HTTP Qdrant + Nebula"; ``shape: qdrant-nebula``) - ``Makefile`` shortcuts: ``test-http-smoke-compose-qdrant-neo4j`` / ``-qdrant-nebula`` (old ``-full`` target dropped — only existed in #1743 / origin/main, not yet referenced anywhere external) - ``tests/e2e_http/runners/compose/README.md`` reflects new names * test(unit): update e2e-http workflow contract test for new shape structure
1 parent 52444d4 commit c4dd86b

11 files changed

Lines changed: 127 additions & 64 deletions

File tree

.github/workflows/cicd-pull-request.yml

Lines changed: 0 additions & 14 deletions
This file was deleted.
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
name: E2E HTTP Lite
2+
3+
# ApeRAG-Lite deployment shape: pgvector + PG-graph (single-PG).
4+
# Runs the smoke + provider-aware HTTP suite against this shape.
5+
6+
on:
7+
pull_request:
8+
types: [opened, synchronize, reopened, ready_for_review]
9+
workflow_dispatch:
10+
11+
permissions:
12+
contents: read
13+
14+
jobs:
15+
e2e-http-compose:
16+
if: ${{ !github.event.pull_request.draft }}
17+
uses: ./.github/workflows/e2e-http-shape.yml
18+
secrets: inherit
19+
with:
20+
shape: lite
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
name: E2E HTTP Qdrant + Nebula
2+
3+
# Distributed deployment shape: Qdrant (vector) + Nebula (graph).
4+
# Runs the smoke + provider-aware HTTP suite against this shape.
5+
6+
on:
7+
pull_request:
8+
types: [opened, synchronize, reopened, ready_for_review]
9+
workflow_dispatch:
10+
11+
permissions:
12+
contents: read
13+
14+
jobs:
15+
e2e-http-compose:
16+
if: ${{ !github.event.pull_request.draft }}
17+
uses: ./.github/workflows/e2e-http-shape.yml
18+
secrets: inherit
19+
with:
20+
shape: qdrant-nebula
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
name: E2E HTTP Qdrant + Neo4j
2+
3+
# Distributed deployment shape: Qdrant (vector) + Neo4j (graph).
4+
# Runs the smoke + provider-aware HTTP suite against this shape.
5+
6+
on:
7+
pull_request:
8+
types: [opened, synchronize, reopened, ready_for_review]
9+
workflow_dispatch:
10+
11+
permissions:
12+
contents: read
13+
14+
jobs:
15+
e2e-http-compose:
16+
if: ${{ !github.event.pull_request.draft }}
17+
uses: ./.github/workflows/e2e-http-shape.yml
18+
secrets: inherit
19+
with:
20+
shape: qdrant-neo4j
Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,33 @@
1-
name: E2E HTTP
1+
name: E2E HTTP (shape)
2+
3+
# Reusable workflow that runs the HTTP E2E suite (smoke + provider-aware)
4+
# against a single deployment SHAPE. Top-level callers (e2e-http-lite.yml,
5+
# e2e-http-full.yml) bind the shape so each shape produces its own status
6+
# check, and adding a new shape is a one-line caller file.
27

38
on:
49
workflow_call:
5-
# ``workflow_dispatch`` lets a diagnostic task fire the full suite against
6-
# the current ref without opening a dummy PR. See task #11: after Phase A
7-
# (log preservation) merges, Phase B (causation verdict) may need to
8-
# replay the provider-aware suite on demand rather than waiting for a
9-
# natural PR failure.
10+
inputs:
11+
shape:
12+
description: "Deployment shape name (must match tests/e2e_http/shapes/<shape>.env)"
13+
required: true
14+
type: string
1015
workflow_dispatch:
16+
inputs:
17+
shape:
18+
description: "Deployment shape name (must match tests/e2e_http/shapes/<shape>.env)"
19+
required: true
20+
type: string
21+
default: lite
1122

1223
jobs:
1324
e2e-http-smoke:
1425
runs-on: ubuntu-latest
1526
timeout-minutes: 45
1627
permissions:
1728
contents: read
18-
strategy:
19-
fail-fast: false
20-
# Two deployment-shape combos. Connector-level "swap one DB" coverage
21-
# already lives in compat-test.yml's matrix (Qdrant/pgvector,
22-
# PG/Neo4j/Nebula); this matrix exists to prove the full HTTP stack
23-
# boots and runs end-to-end under each shape.
24-
matrix:
25-
combo:
26-
- name: lite
27-
vector: pgvector
28-
graph: postgresql
29-
- name: full
30-
vector: qdrant
31-
graph: neo4j
32-
name: e2e-http-smoke (${{ matrix.combo.name }})
3329
env:
34-
VECTOR_DB_TYPE: ${{ matrix.combo.vector }}
35-
GRAPH_DB_TYPE: ${{ matrix.combo.graph }}
30+
SHAPE: ${{ inputs.shape }}
3631
steps:
3732
- uses: actions/checkout@v4
3833

@@ -71,7 +66,7 @@ jobs:
7166
if: failure()
7267
uses: actions/upload-artifact@v4
7368
with:
74-
name: e2e-http-bootstrap-artifacts-${{ matrix.combo.name }}
69+
name: e2e-http-bootstrap-artifacts-${{ inputs.shape }}-smoke
7570
path: tests/e2e_http/bootstrap/.generated
7671
if-no-files-found: ignore
7772
# The bootstrap directory name starts with "." — actions/upload-artifact@v4
@@ -122,6 +117,7 @@ jobs:
122117
permissions:
123118
contents: read
124119
env:
120+
SHAPE: ${{ inputs.shape }}
125121
E2E_ALIBABACLOUD_API_KEY: ${{ secrets.E2E_ALIBABACLOUD_API_KEY }}
126122
E2E_OPENROUTER_API_KEY: ${{ secrets.E2E_OPENROUTER_API_KEY }}
127123
steps:
@@ -162,7 +158,7 @@ jobs:
162158
if: failure()
163159
uses: actions/upload-artifact@v4
164160
with:
165-
name: e2e-http-provider-bootstrap-artifacts
161+
name: e2e-http-bootstrap-artifacts-${{ inputs.shape }}-provider
166162
path: tests/e2e_http/bootstrap/.generated
167163
if-no-files-found: ignore
168164
include-hidden-files: true
@@ -176,7 +172,7 @@ jobs:
176172
if: failure()
177173
uses: actions/upload-artifact@v4
178174
with:
179-
name: e2e-http-provider-diagnostic-artifacts
175+
name: e2e-http-provider-diagnostic-artifacts-${{ inputs.shape }}
180176
path: tests/e2e_http/.diagnostic-artifacts
181177
if-no-files-found: ignore
182178
# ``.diagnostic-artifacts`` starts with a dot (hidden). v4 default skips
@@ -187,8 +183,8 @@ jobs:
187183
- name: Dump Compose diagnostics on failure
188184
if: failure()
189185
run: |
190-
docker compose -f docker-compose.yml ps || true
191-
docker compose -f docker-compose.yml logs --no-color api postgres redis qdrant es || true
186+
docker compose --profile neo4j --profile nebula -f docker-compose.yml ps || true
187+
docker compose --profile neo4j --profile nebula -f docker-compose.yml logs --no-color || true
192188
193189
- name: Stop Compose stack
194190
if: always()

Makefile

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ help:
5151
@printf " make test-http-full Run full HTTP suite against an existing target\n"
5252
@printf " make test-http-up-compose / test-http-down-compose\n"
5353
@printf " make test-http-smoke-compose / test-http-full-compose\n"
54-
@printf " make test-http-smoke-compose-lite / test-http-smoke-compose-full (DB-combo shortcuts)\n"
54+
@printf " make test-http-smoke-compose-{lite,qdrant-neo4j,qdrant-nebula} (per-shape shortcuts)\n"
5555
@printf " make test-http-up-k8s / test-http-down-k8s\n"
5656
@printf " make test-http-smoke-k8s / test-http-full-k8s\n\n"
5757
@printf "Build / API\n"
@@ -205,7 +205,7 @@ add-license:
205205
.PHONY: test-all test-unit test-integration test-e2e test-e2e-perf \
206206
test-http-bootstrap test-http-smoke test-http-full \
207207
test-http-up-compose test-http-down-compose test-http-smoke-compose test-http-full-compose \
208-
test-http-smoke-compose-lite test-http-smoke-compose-full \
208+
test-http-smoke-compose-lite test-http-smoke-compose-qdrant-neo4j test-http-smoke-compose-qdrant-nebula \
209209
test-http-up-k8s test-http-down-k8s test-http-smoke-k8s test-http-full-k8s
210210
test-all: test-unit test-integration test-e2e
211211

@@ -286,8 +286,11 @@ test-http-full-compose:
286286
test-http-smoke-compose-lite:
287287
@SHAPE=lite ./tests/e2e_http/scripts/run_compose_smoke.sh
288288

289-
test-http-smoke-compose-full:
290-
@SHAPE=full-neo4j ./tests/e2e_http/scripts/run_compose_smoke.sh
289+
test-http-smoke-compose-qdrant-neo4j:
290+
@SHAPE=qdrant-neo4j ./tests/e2e_http/scripts/run_compose_smoke.sh
291+
292+
test-http-smoke-compose-qdrant-nebula:
293+
@SHAPE=qdrant-nebula ./tests/e2e_http/scripts/run_compose_smoke.sh
291294

292295
test-http-up-k8s:
293296
@./tests/e2e_http/runners/k8s/up.sh

tests/e2e_http/runners/compose/README.md

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,9 @@ This runner is intentionally replaceable. The suite must remain runnable against
2020
ApeRAG supports several real production deployment forms — different choices of vector backend (Qdrant or pgvector) and graph backend (PostgreSQL, Neo4j, or Nebula). Each named combination is a *shape*.
2121

2222
```
23-
SHAPE=lite ./tests/e2e_http/runners/compose/up.sh
24-
SHAPE=full-neo4j ./tests/e2e_http/runners/compose/up.sh
23+
SHAPE=lite ./tests/e2e_http/runners/compose/up.sh
24+
SHAPE=qdrant-neo4j ./tests/e2e_http/runners/compose/up.sh
25+
SHAPE=qdrant-nebula ./tests/e2e_http/runners/compose/up.sh
2526
```
2627

2728
Each shape file under `tests/e2e_http/shapes/<shape>.env` declares:
@@ -37,9 +38,11 @@ Adding a new shape = adding one new file. The runner / Makefile / CI all referen
3738

3839
### Available shapes (today)
3940

40-
- **lite** — single-PG ApeRAG-Lite: pgvector + PG-graph, no qdrant/neo4j containers
41-
- **full-neo4j** — distributed: Qdrant + Neo4j
42-
- **full-nebula** — distributed: Qdrant + Nebula
41+
Shapes are named `<vector>-<graph>`, with **lite** as the special name for the single-PG (pgvector + PG-graph) ApeRAG-Lite deployment:
42+
43+
- **lite** — single-PG ApeRAG-Lite: pgvector + PG-graph, no qdrant/neo4j/nebula containers
44+
- **qdrant-neo4j** — distributed: Qdrant + Neo4j
45+
- **qdrant-nebula** — distributed: Qdrant + Nebula
4346

4447
### Backward compatibility
4548

tests/e2e_http/shapes/full-nebula.env

Lines changed: 0 additions & 9 deletions
This file was deleted.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# SHAPE: qdrant-nebula — distributed deployment with Qdrant + Nebula.
2+
#
3+
# Same as qdrant-neo4j but with Nebula as the graph backend (activated
4+
# via the "nebula" compose profile).
5+
SHAPE_VECTOR_DB_TYPE=qdrant
6+
SHAPE_GRAPH_DB_TYPE=nebula
7+
SHAPE_COMPOSE_SERVICES="postgres redis es qdrant api"
8+
SHAPE_COMPOSE_PROFILES="--profile nebula"
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# SHAPE: full-neo4j — distributed deployment with Qdrant + Neo4j.
1+
# SHAPE: qdrant-neo4j — distributed deployment with Qdrant + Neo4j.
22
#
33
# Postgres holds relational data only. Vector data lives in Qdrant.
44
# Graph data lives in Neo4j (activated via the "neo4j" compose profile).

0 commit comments

Comments
 (0)