Skip to main content

Debugging deploys

You never need kubectl. Everything a red deploy can tell you is reachable through the API and the console.

Configuration rejected (HTTP 400)

Validation runs at upload, before anything is stored. The response lists every problem at once, with suggestions for typos:

{
"valid": false,
"errors": [
"runtime node requires runtimeConfig.command; Pagifier never inspects package.json",
"unknown field \"artefact\" — did you mean \"artifact\"?"
]
}

Fix the file and re-run POST /v1/validate until it returns the resolved configuration. Put validation in your PR pipeline so this never reaches a deploy.

Build failed

The Release captures the tail of the build log. With ?wait=true it arrives in the terminal stream; otherwise fetch the status:

curl -H "Authorization: Bearer $TOKEN" \
"$PAGIFIER_URL/v1/applications/my-app/environments/prod"
{
"activeRelease": {
"phase": "Failed",
"message": "build job failed: BackoffLimitExceeded",
"buildLog": "src/App.tsx(42,7): error TS2304: Cannot find name 'foo'\n..."
}
}

Common causes: a build command that works locally but not in a clean checkout, a missing artifact.directory after the build (the error names the directory it looked for), or an artifact digest mismatch (the upload was corrupted or tampered with — re-upload).

Deployed but not Available

phase: Deploying that never becomes Available means pods are not passing their readiness probe. Check the probe path — healthCheck: /health must return 200 — and the app logs:

curl -H "Authorization: Bearer $TOKEN" \
"$PAGIFIER_URL/v1/applications/my-app/environments/prod/logs?tailLines=200"

With autoRollback: true (the prod default), a stalled rollout reverts automatically and the notification names the failed release.

Canary aborted

The Release message and the deploy notification name the exact gate and value:

canary aborted: analysis gates exhausted the failure budget:
gate error-rate: 0.031 exceeds max 0.01

The primary release never stopped serving — there is nothing to roll back. Fix the regression and upload again. Current canary state (weight, last analysis) is always visible on the status endpoint and in the console.

What changed?

Every upload response includes configChanges — the diff between the new resolved configuration and the currently active release. To inspect the full snapshot a release runs with:

curl -H "Authorization: Bearer $TOKEN" \
"$PAGIFIER_URL/v1/applications/my-app/environments/prod/releases/RELEASE_ID/config"

Audit trail

GET .../events merges the platform audit log (who uploaded, who rolled back) with Kubernetes events (build started, canary advanced, cutover) for the application.