test(ci): add per-service boot smoke tests#6271
Conversation
CI builds each service's dist and runs its unit tests but never starts the packaged service, so runtime classpath/linkage crashes on boot slip through — e.g. apache#6204 (Hadoop 3.4 -> Jersey NoClassDefFoundError, fixed by apache#6205) and apache#6206 (Arrow 19 -> Jackson version conflict, fixed by apache#6209), both caught only after landing on main. Add .github/scripts/smoke-boot.sh, which launches a packaged service from its unpacked dist and asserts it reaches a listening state (strict) or exits without a linkage/module error (shallow). Wire it into the platform matrix (one check per service, against the postgres already provisioned there; file-service uses shallow) and the amber job (texera-web, strict). Closes apache#6220
Automated Reviewer SuggestionsBased on the
|
Codecov Report✅ All modified and coverable lines are covered by tests. Additional details and impacted files@@ Coverage Diff @@
## main #6271 +/- ##
============================================
- Coverage 60.67% 60.64% -0.03%
- Complexity 3368 3372 +4
============================================
Files 1133 1133
Lines 44141 44141
Branches 4825 4825
============================================
- Hits 26782 26770 -12
- Misses 15901 15913 +12
Partials 1458 1458
☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
✅ No material benchmark regressions detected🟢 2 better · 🔴 0 worse · ⚪ 13 noise (<±5%) · 0 without baseline
Baseline detailsLatest main
Raw CSVconfig_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,486.23,200,128000,411,0.251,23243.88,37371.43,37371.43
1,100,10,64,20,2119.86,2000,1280000,943,0.576,104039.68,123575.96,123575.96
2,1000,10,64,20,18232.74,20000,12800000,1097,0.670,910115.63,942031.90,942031.90 |
There was a problem hiding this comment.
Pull request overview
Adds CI boot smoke tests to ensure each packaged Texera service can actually start from its built dist, catching runtime classpath/linkage regressions (e.g., NoClassDefFoundError, LinkageError, Jackson/Scala-module conflicts) that compile and unit-test clean.
Changes:
- Introduces
.github/scripts/smoke-boot.shto launch a dist executable and assert either “LISTEN” (strict) or “no linkage error” (shallow) within a timeout. - Extends the
platformjob matrix to run a per-service boot check (strict for most services; shallow forfile-service). - Adds an
amber-job boot check fortexera-webfrom the amber dist.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
.github/workflows/build.yml |
Adds per-service (and amber) CI steps to boot the freshly built/unzipped dist artifacts. |
.github/scripts/smoke-boot.sh |
New helper script implementing strict/shallow boot validation and linkage-error detection. |
💡 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>
There was a problem hiding this comment.
do we need this smoke-boot script, or maybe local-dev.sh up <service> is enough?
There was a problem hiding this comment.
the point is I want to have less scripts, so testing env can be closer to dev env, and closer to prod env. if we have separated scripts, it is easy to drift: something works in dev, but won't pass in CI, or something works in CI, won't actually work in prod.
There was a problem hiding this comment.
maybe we can write the simple logic:
try local-dev.sh up
detect port licensing
timeout after 5s
|
Superseded by #6274 — the platform-service boot checks moved into a dedicated texera-web's boot check will follow with the amber-integration work (#6047); #6220 stays open to track it. Closing in favor of #6274. |
…fra (apache#6274) ### What changes were proposed in this PR? The platform services' build jobs (the `platform` matrix) provision only postgres. A boot smoke test there can't fully start a service that needs more — `file-service` fail-fasts on **MinIO + LakeFS** during `run()` (S3 bucket creation + `LakeFSStorageClient.healthCheck()`), so it can only be checked shallowly. This PR adds 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 (via `.github/scripts/smoke-boot.sh`, from apache#6220). 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-artifact` → `download-artifact`), not rebuilt. - Infra is provisioned **once for the whole tier** (single job), like `amber-integration`. - **Ubuntu-only**, matching the `platform` job's OS scope. (`amber-integration` is 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 (apache#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 apache#6273. The boot smoke test script is from apache#6220. Follow-ups: the infra provisioning is now duplicated with `amber-integration` — extracting it into a shared composite action is tracked in apache#6275. (These separate `amber-integration` / `platform-integration` jobs are deliberate — apache#6047, re-scoped, covers the complementary sbt-side `@IntegrationTest` mechanism, not a single unified job.) A `texera-web` boot check, out of this PR's platform-only scope, is tracked in apache#6276 (under the apache#6220 umbrella). ### How was this PR tested? - LakeFS provisioning recipe validated locally (postgres + MinIO + LakeFS via docker) → LakeFS reaches healthy in ~9s. - Confirmed `storage.conf` defaults align with the provisioned endpoints (S3 `http://localhost:9000`, LakeFS `http://localhost:8000/api/v1`, JDBC `localhost:5432`), so each service boots against this infra with no extra env. - `smoke-boot.sh` was validated end-to-end in apache#6271 (config-service + texera-web reached LISTEN in CI; the negative case caught a reintroduced apache#6206 Arrow / Jackson boot crash). - `--network host` reachability, 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) --------- Signed-off-by: Meng Wang <mengw15@uci.edu> Co-authored-by: Copilot Autofix powered by AI <175728472+Copilot@users.noreply.github.com>
What changes were proposed in this PR?
CI builds each service's distributable and runs its unit tests, but never starts the packaged service, so runtime classpath/linkage problems that compile and unit-test clean — but crash the moment
mainruns — slip through. Two recent dependency bumps did exactly this onmain, caught only manually after merge: #6201 (Hadoop 3.4.3) crashedtexera-webon boot withNoClassDefFoundError(fixed by #6205), and #6185 (Arrow 19) crashedcomputing-unit-managing-serviceat startup with a Jackson version conflict (fixed by #6209).This PR adds a boot smoke test:
.github/scripts/smoke-boot.sh— launches a packaged service from its unpacked dist and asserts it either reaches a listening state (strict) or, for a service that fail-fasts on infra this job doesn't provision, exits without a linkage/module error (shallow). ANoClassDefFoundError/LinkageError/NoSuchMethodError/ Jackson-module conflict fails the check in any mode.platformjob — one boot check per matrix service, against the postgres already provisioned there.file-serviceusesshallow(it fail-fasts on MinIO + LakeFS, not provisioned here); the rest usestrict.amberjob — astrictboot check fortexera-web.Both past incidents crash early in init, so this catches that class of regression before merge without a fully provisioned environment.
Any related issues, documentation, discussions?
Closes #6220.
Incidents this would have caught: #6204 / #6205 (texera-web, Hadoop→Jersey), #6206 / #6209 (computing-unit-managing-service, Arrow→Jackson). Triggering upgrades: #6201, #6185.
How was this PR tested?
Validated locally against a CI-equivalent postgres (
postgres:latest,postgres/postgres, schema fromsql/texera_ddl.sql+sql/iceberg_postgres_catalog.sql+sql/texera_lakefs.sql):config-service(representative of the postgres-only platform services) launched from itsstagedist →smoke-boot.sh … 9094 strictreached LISTEN, exit 0.strictcorrectly failed (exit 1, HikariCP connection-refused dumped);shallowcorrectly passed (exit 0, no linkage error) — validating thefile-servicepath and that infra-connection failures are not mistaken for linkage errors.texera-weblaunched from the amberstagedist →smoke-boot.sh … 8080 strictreached LISTEN, exit 0 (confirmsamberHomePathconfig resolution and a postgres-only boot with no frontend-asset dependency).The other services (
access-control-service,computing-unit-managing-service,workflow-compiling-service,notebook-migration-service) follow the same Dropwizard +SqlServer.initConnectionpostgres-only boot pattern asconfig-service.Was this PR authored or co-authored using generative AI tooling?
Generated-by: Claude Code (claude-opus-4-8)