ci(stagex): build parser_http_server and parser_grpc_server images - #447
ci(stagex): build parser_http_server and parser_grpc_server images#447pepe-anchor wants to merge 2 commits into
Conversation
The TVC deployment-details step hardcoded parser_app, so the only binary that ever got a reproducible digest and a paste-ready deploy block was parser_app. The pivot we are switching to (parser_http_server) needs the same treatment before it can be deployed or probed. Generalize the extraction over the matrix target and add the two missing images. QOS version stays at 0.12.0 here; the bump is PRS-581 PR 7. Co-Authored-By: Claude <noreply@anthropic.com>
There was a problem hiding this comment.
Pull request overview
Adds StageX image builds and deployment metadata for additional parser servers.
Changes:
- Adds gRPC and HTTP server matrix targets.
- Generalizes TVC deployment details per target.
- Adds an HTTP server Containerfile.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 3 comments.
| File | Description |
|---|---|
.github/workflows/stagex.yml |
Extends image builds and TVC release metadata. |
images/parser_http_server/Containerfile |
Defines the HTTP server image build. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
| # pre-fetch all workspace deps; we need them to build with `--network=none` later | ||
| RUN cargo fetch | ||
|
|
||
| WORKDIR /src/parser/http-server |
| if [ -n "$SEMVER_TAG" ] && gh release view "$SEMVER_TAG" >/dev/null 2>&1; then | ||
| existing_body=$(gh release view "$SEMVER_TAG" --json body --jq .body) | ||
| preserved=$(printf '%s\n' "$existing_body" | awk ' | ||
| /<!-- BEGIN_TVC_DEPLOY -->/ { skipping = 1; next } | ||
| /<!-- END_TVC_DEPLOY -->/ { skipping = 0; next } | ||
| preserved=$(printf '%s\n' "$existing_body" | awk -v b="$begin_sentinel" -v e="$end_sentinel" ' | ||
| $0 == b { skipping = 1; next } | ||
| $0 == e { skipping = 0; next } | ||
| !skipping | ||
| ') | ||
| new_body="${RUNNER_TEMP}/release_notes.md" | ||
| new_body="${RUNNER_TEMP}/release_notes_${TARGET_NAME}.md" | ||
| { | ||
| printf '%s\n\n' "$preserved" | ||
| echo "<!-- BEGIN_TVC_DEPLOY -->" | ||
| echo "$begin_sentinel" | ||
| cat "$deploy_md" | ||
| echo "<!-- END_TVC_DEPLOY -->" | ||
| echo "$end_sentinel" | ||
| } > "$new_body" | ||
| gh release edit "$SEMVER_TAG" --notes-file "$new_body" \ |
| - name: parser_grpc_server | ||
| - name: parser_http_server |
The matrix gained parser_grpc_server and parser_http_server, but the root Makefile had no rule for either, so both legs died at the Build step before Docker ran. images/parser_grpc_server/Containerfile was missing entirely. parser_grpc_server mirrors parser_gateway rather than parser_app: the crate has no [features] table and is not a TVC pivot, so vsock/CHAIN_FEATURES are deliberately omitted. Chains still link in through parser_app's default features, since --no-default-features applies to the package being built, not to its path dependencies. Also fixes a lost update on the release body. Three legs now run the deployment-details step concurrently, each doing gh release view then gh release edit with a full-body overwrite. Per-target sentinels keep a leg's own block idempotent across re-runs but do not serialize legs, so whichever edit landed last dropped the others' sections. Retry with a fresh read and verify the write stuck. Co-Authored-By: Claude <noreply@anthropic.com>
…e pivot PR PR 02 added the image build plumbing but not the parser/http-server crate, which lands here. Neither half built on its own, so the features move into this PR and #447 is closed rather than merged. Co-Authored-By: Claude <noreply@anthropic.com>
|
Closing unmerged. The features moved into #450. The split did not work: this PR added Two other things were broken here and are fixed in #450:
Verified on the merged branch: all five |
Why
PRS-581 deploys
parser_http_serveras the TVC pivot. The stagex "TVC deployment details" step hardcodesparser_app, so it is the only binary that ever gets a reproducible executable digest and a paste-ready deploy block. Without this, the pivot cannot be deployed or probed at all, which blocks the/dev/nsmreachability probe and every later step in the stack.Landing it early so image builds are never the thing holding the stack up.
What
parser_grpc_serverandparser_http_serverto the stagex build matrix.TARGET_NAMEenv, per-target container URL, per-target extract container and binary path, per-target deploy-md and release-note sentinels so parallel matrix legs cannot clobber each other's release body edits.images/parser_http_server/Containerfile, mirroringparser_app's. It keeps--features "vsock ${CHAIN_FEATURES}", which is load-bearing:vsockswitchesqos_core::EPHEMERAL_KEY_FILEto the in-enclave path, and without it the deployed pivot panics at startup and TVC reports 0 healthy replicas.Two changes from the x402 branch were deliberately NOT taken, because they belong to other PRs:
ci:stagextostagex. Main's label is kept.qos_version="v2026.2.6". Main's0.12.0is kept; the QOS bump is its own PR in this stack.Test evidence
The stagex path only runs on a labelled PR, so this needs the
ci:stagexlabel to be validated. What was verified locally:I have NOT run the stagex build itself. Please add
ci:stagexand confirm all matrix legs go green, including the two new ones, before merging.Rollback
Revert the commit. CI-only change plus one new Containerfile; nothing is deployed by merging it.
Linear
PRS-581
Stack position: independent of the rest of the stack, based on
main. Can merge in any order.🤖 Generated with Claude Code