grounds push (or portal-initiated build) creates one Push row that you can inspect, retry, and tail logs from.
States
A push moves through a small state machine. Forge persists the current state on the row and emits SSE events on transitions.build_failed and deploy_failed are terminal but retryable: forge keeps your JAR and manifest, so a retry doesn’t re-upload.
Identity & idempotency
Each push has:- A UUID (
id) you’ll see referenced everywhere — CLI output, portal URLs, log streams. - A content hash computed over the JAR + manifest. If you push the exact same bytes twice, forge re-uses the previous build instead of rebuilding from scratch.
Tailing logs
Two log streams per push:--no-follow to get a snapshot and exit.
Retrying
A failed build or failed deploy can be retried without re-uploading:pending. The original failed push is preserved for history.
Listing
Rolling back
If a successful push introduced a bug and you need the previous image back, open the app’s Pushes tab in the portal and click Roll back on the prior push. Forge re-deploys that push’s already-built image without re-running kaniko, so the rollback lands in seconds. The rollback creates a fresh push row pointing at the sameimageTag, so the audit log records the action.
Promoting a staging push
For pushes that targetedstaging and reached ready, the portal’s Pushes tab also shows a Promote action. Promote copies the built image into a new push targeting dev — no rebuild, no kaniko run. Use it to ship the exact artifact you just verified in a preview env, instead of re-running the build pipeline and risking a different image (e.g., upstream base-image drift).
What survives a push
- The previous deployment for
devis replaced. State (world chunks, plugin data files) survives because the volume is attached at the namespace level — but anything in-memory is lost. - For
staging, each push creates a new preview env, so nothing survives across pushes; that’s the point.
