Pipelines
Follow a commit from git push to live URL: the stages every ZopDay deploy runs, what triggers one, where the build happens, and what to do when a stage fails.
A ZopDay pipeline is the path a commit takes from your git branch to a live URL on your cluster or VM. Every deploy runs the same pipeline: ZopDay resolves where the service runs, clones the repo, detects how to build it, builds the image on GitHub Actions, and rolls it out. It is one pipeline, with no separate tools to chain. You run it in the Quickstart and see it per revision in Deployments.

Service drawer, Overview tab: the public URL, live revision, and git source the pipeline shipped. Earlier revisions are on the Revisions tab.
Before you start
- A service in an environment bound to a registered cluster or VM. See Projects and environments.
- For auto-deploy on push, the repo connected through the GitHub App integration.
- The
deployment:*policies to redeploy, change config, or roll back.
How it works
Pipeline stages
Resolve → Clone → Detect → Build (GitHub Actions) → Callback → Deploy → WatchRollout- Resolve. ZopDay reads the service, its environment, and the space (cluster or VM) the environment is bound to.
- Clone. ZopDay clones the repo at the configured branch.
- Detect. ZopDay works out the language, framework, and port. If the repo has a Dockerfile, ZopDay uses it as-is. If it doesn’t, ZopDay builds the image for you, so no Dockerfile is required.
- Build. ZopDay dispatches the build to a GitHub Actions runner, which builds the image and pushes it to the environment’s registry. Builds never run inside your cluster.
- Callback. The runner streams build logs back to ZopDay and reports the result over a signed callback. On success, the deploy stage is queued.
- Deploy. ZopDay rolls the new image out: as a Helm release on a Kubernetes cluster, or as a container behind Caddy on a VM.
- WatchRollout. ZopDay follows the rollout until the service reaches Active or fails.
Each stage writes an entry to the deploy’s append-only timeline when it starts and when it succeeds or fails, so you can see exactly where a deploy is and where it stopped.
Where builds run and images go
- Builds run on GitHub Actions, not in your cluster. The runner clones, builds, and pushes the image, then reports back.
- Images go to your registry. The image is pushed to the registry integration bound to the environment. If there isn’t one, it goes to the cloud’s default registry (ECR, Artifact Registry, or ACR) on the space’s cloud account.
- No standing cluster credentials. For each deploy, ZopDay mints a short-lived kubeconfig from your cloud account credentials (about 13 minutes on EKS, about 45 minutes on GKE). Nothing stays on your cluster afterwards.
Secrets handling
Environment variable values are treated as secrets. They are never shown back to you in the UI or returned by the API or MCP tools, and they are not written to the audit trail.
For datastores that ZopDay provisions, the root password goes to your cloud’s secret manager, and ZopDay keeps only the reference:
- AWS: Secrets Manager.
- GCP: Secret Manager.
- Azure: Key Vault.
See Provisioning datastores for how services connect to them.
Trigger a deploy
| Trigger | How it works |
|---|---|
| Push to the branch | With auto-deploy on, every push to the service’s configured branch starts a deploy. Auto-deploy needs the repo connected through the GitHub App integration, because it is driven by GitHub’s webhook. A service added from a plain repository URL never auto-deploys. |
| Manual deploy | Redeploy from the UI (or the redeploy_service MCP tool). For a git service, this rebuilds the branch at its latest commit. |
| Config change | Saving a change on the service’s Settings tab ships a config-only revision. The current image is reused and nothing is rebuilt. |
| Rollback | Re-ships an earlier active revision’s image as a new revision. See Rollbacks. |
Auto-deploy is a per-service setting. Turn it on only where you are happy for anyone who can push to the branch to ship to that environment. With it off, pushes don’t ship and someone redeploys explicitly.
If GitHub delivers the same webhook twice, ZopDay recognises the repeat and ignores it, so a retried delivery never creates a duplicate deploy.
Follow a deploy
The canvas opens the live rollout view as soon as a deploy starts. It shows the current stage, streams the build log from GitHub Actions, and shows the live URL once the service is active. A service’s deploy history, with each revision’s status, image, commit, and who triggered it, is on the service drawer’s Revisions tab.
Config-only revisions and rollbacks skip the build and finish sooner.
When a stage fails
If a stage fails, ZopDay retries the revision up to 3 times. If it still fails, the revision moves to a dead-letter state (dlq) and stops. The timeline shows the failing stage and its error.
ZopDay does not roll back automatically. The service’s current revision stays the last one that reached Active. Fix the cause and redeploy, or roll back to an earlier revision.
ZopDay also guards against a lost build callback. If the runner pushed the image but its success report never reached ZopDay, a watchdog finds the push in the build log and resumes the deploy.
Reference
Audit
Every change that starts or alters a deploy (a manual deploy, a config change, a rollback) is recorded in Activity → Audit Logs with the actor, the request, and the time. You can forward the audit feed to your SIEM. See Audit logs.
Troubleshooting
A push didn't start a deploy
Check that auto-deploy is on for the service and that the repo is connected through the GitHub App integration. A service added from a plain repository URL never auto-deploys; redeploy it manually instead.
A revision ended in dlq
The stage failed three retries in a row. Open the timeline to see the failing stage and its error, fix the cause, and redeploy. The service keeps running its last active revision meanwhile.
The build pushed an image but the deploy didn't continue
The build’s success callback was lost. A watchdog finds the push in the build log and resumes the deploy, so it lands without a rebuild.