ci: add platform-integration job to boot each service against real infra#6274
Conversation
The platform services' build jobs provision only postgres, so a boot smoke test there cannot fully start a service that needs more — file-service fail-fasts on MinIO + LakeFS at boot. Add a platform-integration job (mirroring amber-integration) that provisions postgres + MinIO + LakeFS and boots each packaged platform service from its dist, asserting it reaches a listening state without a runtime classpath/linkage crash. Every service has its real dependencies here, so all run in strict mode (file-service included). Dists are shipped in as CI artifacts from the platform job (upload/download) rather than rebuilt. Reuses .github/scripts/smoke-boot.sh. Ubuntu-only, to match the platform job's OS scope. Extracting the shared infra provisioning into a composite action (DRY with amber-integration) is deferred to apache#6047. Closes apache#6273
Automated Reviewer SuggestionsBased on the
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #6274 +/- ##
============================================
+ Coverage 60.67% 60.73% +0.06%
+ Complexity 3368 3363 -5
============================================
Files 1133 1135 +2
Lines 44141 44191 +50
Branches 4825 4830 +5
============================================
+ Hits 26782 26839 +57
+ Misses 15901 15892 -9
- Partials 1458 1460 +2
☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
| config | throughput | MB/s | latency | max Δ latest / 7d | |
|---|---|---|---|---|---|
| 🔴 | bs=10 sw=10 sl=64 | 355 | 0.217 | 29,159/34,055/34,055 us | 🔴 +16.7% / 🔴 +132.3% |
| 🟢 | bs=100 sw=10 sl=64 | 768 | 0.469 | 132,771/137,663/137,663 us | 🟢 -11.4% / 🔴 +32.9% |
| ⚪ | bs=1000 sw=10 sl=64 | 870 | 0.531 | 1,152,848/1,206,411/1,206,411 us | ⚪ within ±5% / 🔴 +17.3% |
Baseline details
Latest main 29233cc from same runner
| config | metric | PR | latest main | 7d avg | Δ latest | Δ 7d |
|---|---|---|---|---|---|---|
| bs=10 sw=10 sl=64 | throughput | 355 tuples/sec | 388 tuples/sec | 779.42 tuples/sec | -8.5% | -54.5% |
| bs=10 sw=10 sl=64 | MB/s | 0.217 MB/s | 0.237 MB/s | 0.476 MB/s | -8.4% | -54.4% |
| bs=10 sw=10 sl=64 | p50 | 29,159 us | 24,979 us | 12,550 us | +16.7% | +132.3% |
| bs=10 sw=10 sl=64 | p95 | 34,055 us | 38,751 us | 15,115 us | -12.1% | +125.3% |
| bs=10 sw=10 sl=64 | p99 | 34,055 us | 38,751 us | 18,652 us | -12.1% | +82.6% |
| bs=100 sw=10 sl=64 | throughput | 768 tuples/sec | 765 tuples/sec | 1,000 tuples/sec | +0.4% | -23.2% |
| bs=100 sw=10 sl=64 | MB/s | 0.469 MB/s | 0.467 MB/s | 0.61 MB/s | +0.4% | -23.2% |
| bs=100 sw=10 sl=64 | p50 | 132,771 us | 129,949 us | 99,872 us | +2.2% | +32.9% |
| bs=100 sw=10 sl=64 | p95 | 137,663 us | 155,411 us | 107,073 us | -11.4% | +28.6% |
| bs=100 sw=10 sl=64 | p99 | 137,663 us | 155,411 us | 114,377 us | -11.4% | +20.4% |
| bs=1000 sw=10 sl=64 | throughput | 870 tuples/sec | 877 tuples/sec | 1,020 tuples/sec | -0.8% | -14.7% |
| bs=1000 sw=10 sl=64 | MB/s | 0.531 MB/s | 0.535 MB/s | 0.622 MB/s | -0.7% | -14.7% |
| bs=1000 sw=10 sl=64 | p50 | 1,152,848 us | 1,144,423 us | 987,499 us | +0.7% | +16.7% |
| bs=1000 sw=10 sl=64 | p95 | 1,206,411 us | 1,184,948 us | 1,028,784 us | +1.8% | +17.3% |
| bs=1000 sw=10 sl=64 | p99 | 1,206,411 us | 1,184,948 us | 1,057,136 us | +1.8% | +14.1% |
Raw CSV
config_idx,batch_size,schema_width,string_len,num_batches,total_ms,total_tuples,total_bytes,tuples_per_sec,mb_per_sec,lat_p50_us,lat_p95_us,lat_p99_us
0,10,10,64,20,563.47,200,128000,355,0.217,29158.58,34054.84,34054.84
1,100,10,64,20,2605.15,2000,1280000,768,0.469,132770.97,137663.07,137663.07
2,1000,10,64,20,22995.19,20000,12800000,870,0.531,1152848.49,1206410.55,1206410.55There was a problem hiding this comment.
Pull request overview
Adds an infra-provisioned GitHub Actions job to boot each packaged platform service against a more complete “real” dependency stack (Postgres + MinIO + LakeFS), using dists produced by the existing platform matrix and shipped via artifacts. This extends CI coverage to catch runtime/linkage failures that only appear when executing the service launcher.
Changes:
- Upload each platform service’s
distzip from theplatformmatrix as a CI artifact for downstream consumption. - Add a
platform-integrationjob that provisions Postgres + MinIO + LakeFS once, downloads all service dists, and runs a strict boot smoke test for each service. - Introduce
.github/scripts/smoke-boot.shto launch a packaged service, wait for TCP LISTEN, and fail on common runtime classpath/linkage errors.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
.github/workflows/build.yml |
Upload platform service dists as artifacts; add platform-integration job that provisions Postgres/MinIO/LakeFS and boots each service from its dist. |
.github/scripts/smoke-boot.sh |
New boot-smoke helper script that launches a dist binary, waits for LISTEN, and detects common linkage/classpath failures. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com> Signed-off-by: Meng Wang <mengw15@uci.edu>
|
Design note — why a dedicated The script doesn't reimplement how a service starts — it runs
|
|
three changes needed:
|
Restructure the platform-integration job to mirror amber-integration: run it as an independent, per-service matrix that builds each service's dist on its own classpath and boots it against real infra, instead of depending on the platform job via CI artifacts. - Drop the upload/download-artifact hand-off and `needs: platform` so platform and platform-integration run in parallel. - Split platform-integration into a per-service matrix (like platform), one boot check per service. - Provision MinIO + LakeFS only for file-service (matrix.object_store); postgres backs every service's JOOQ codegen and boot. - Add a dedicated run_platform_integration trigger mirroring run_amber_integration (LABEL_STACKS + decide output + both build.yml callers), including a dedicated `platform-integration` label so a spec-only change can fire it without the full platform job -- a proper superset of platform's trigger, as amber-integration is of amber's. - smoke-boot.sh: drop the shallow/strict mode argument now that every service boots against real infra, and stop passing the stale `strict` arg from the caller.
346b342 to
b197f29
Compare
|
Thanks @Yicong-Huang — all three are addressed in 1. Label trigger. Added a dedicated 2. Per-service matrix. 3. No artifacts / parallel. Dropped the All six |
### What changes were proposed in this PR? Add a boot smoke test for `texera-web` to the `amber-integration` job: build the amber dist in-job and launch the packaged `bin/texera-web-application` via `.github/scripts/smoke-boot.sh` (from apache#6220), asserting it reaches a listening state (port 8080) without a runtime classpath/linkage crash. `texera-web` was left out of apache#6274's `platform-integration` checks because it's built in the `amber` job, not `platform`; its boot check belongs in the infra-provisioned `amber-integration` job (mirroring how `platform-integration` hosts the platform boot checks). - **Self-contained**: the dist is built in-job (`sbt WorkflowExecutionService/dist`), not shipped as an artifact — so `amber-integration` stays independent of `amber` and runs in parallel (the `platform-integration` ∥ `platform` shape from apache#6274). The compile is already warm from the integration-test run. - **postgres-only**: `texera-web` boots via `TexeraWebApplication.run` → `SqlServer.initConnection` (+ `createAdminUser`); no S3 / LakeFS at boot, so `amber-integration`'s postgres suffices. Config resolves through `Utils.amberHomePath` (a working-dir search for a dir named `amber`), finding `./amber` from the checkout root and reading `amber/src/main/resources/web-config.yml`. - **ubuntu-only**: the boot is pure-JVM and OS-independent, so it doesn't also run on the macOS leg. Concrete regression it catches: apache#6204 (Hadoop 3.4 → Jersey `NoClassDefFoundError`) — compiled and unit-tested clean but crashed `texera-web` on boot. ### Any related issues, documentation, discussions? Closes apache#6276. Boot script from apache#6220; mirrors the `platform-integration` boot checks in apache#6274. ### How was this PR tested? - Verified `texera-web`'s boot path touches postgres only (`SqlServer.initConnection` + `AuthResource.createAdminUser`; no S3 / LakeFS / MinIO anywhere in the class). - Confirmed `FileAssetsBundle("../../frontend/dist", …)` registers lazily (its `run()` only constructs + registers the servlet; the filesystem check is request-time), so the absent frontend build in CI doesn't block boot. - Confirmed the launcher name (`bin/texera-web-application`, per the prod image `CMD`) and port (8080, per `web-config.yml`). - Exercised end-to-end by this workflow's own `amber-integration` CI run (ubuntu leg). ### Was this PR authored or co-authored using generative AI tooling? Generated-by: Claude Code (claude-opus-4-8)
What changes were proposed in this PR?
The platform services' build jobs (the
platformmatrix) provision only postgres. A boot smoke test there can't fully start a service that needs more —file-servicefail-fasts on MinIO + LakeFS duringrun()(S3 bucket creation +LakeFSStorageClient.healthCheck()), so it can only be checked shallowly.This PR adds a
platform-integrationjob (mirroringamber-integration) that provisions postgres + MinIO + LakeFS and boots each packaged platform service from its dist, asserting it reaches a listening state without a runtime classpath/linkage crash (via.github/scripts/smoke-boot.sh, from #6220). Every service has its real dependencies here, so all run in strict mode —file-serviceincluded.platformjob (upload-artifact→download-artifact), not rebuilt.amber-integration.platformjob's OS scope. (amber-integrationis cross-OS because its Python-UDF / native specs are arm64-mac-sensitive; these boot checks are pure-JVM and OS-independent.)This is the infra-provisioned home for the platform services' integration checks (#6273); the boot smoke test is its first inhabitant, and future platform integration tests (e.g.
file-service's S3 / LakeFS paths) can live here too.Any related issues, documentation, discussions?
Closes #6273. The boot smoke test script is from #6220.
Follow-ups: the infra provisioning is now duplicated with
amber-integration— extracting it into a shared composite action is tracked in #6275. (These separateamber-integration/platform-integrationjobs are deliberate — #6047, re-scoped, covers the complementary sbt-side@IntegrationTestmechanism, not a single unified job.) Atexera-webboot check, out of this PR's platform-only scope, is tracked in #6276 (under the #6220 umbrella).How was this PR tested?
storage.confdefaults align with the provisioned endpoints (S3http://localhost:9000, LakeFShttp://localhost:8000/api/v1, JDBClocalhost:5432), so each service boots against this infra with no extra env.smoke-boot.shwas validated end-to-end in test(ci): add per-service boot smoke tests #6271 (config-service + texera-web reached LISTEN in CI; the negative case caught a reintroduced computing-unit-managing-service fails to start: jackson-databind 2.21.0 incompatible with jackson-module-scala 2.18.8 #6206 Arrow / Jackson boot crash).--network hostreachability, the artifact flow, and each service's strict boot are exercised by this workflow's own CI run.Was this PR authored or co-authored using generative AI tooling?
Generated-by: Claude Code (claude-opus-4-8)