Set Up Argo CI/CD with Ephemeral Preview Environments
From an empty cluster to a pull request that builds your code inside your own cluster and deploys itself to a live HTTPS URL β with the two prerequisites people miss called out before you hit them.
π The two requirements people miss
- MinIO before Argo CI. Argo CI needs artifact storage. Without MinIO installed (or your own S3 bucket configured) the install is refused outright.
- The branch pattern must match your pull request. An instance set to
mainignores a pull request fromfeature/login. Nothing fails β nothing happens at all, which is harder to debug.
What you'll end up with: an ephemeral environment per pull request
Open a pull request, and within a couple of minutes it carries three green SeaGit status checks and a comment linking to a live preview URL running that exact commit β built by a pipeline in your own cluster, pushed to your own registry, deployed to its own ephemeral environment without touching production. Each of these preview environments is a real deployment slot on its own hostname, created for that commit and discarded when you are done with it.
Measured on a minimal Python (FastAPI) service with a 3-step default pipeline: the build finished in 31 seconds, the deployment reached started 84 seconds later, and the preview URL answered HTTP 200 about 2 minutes 20 seconds after the pull request was opened. Larger images with more dependencies take proportionally longer to build; the deploy half stays roughly constant.
Prerequisites
- A cluster that is up and running, with an ingress controller.
- A domain attached to the environment, and the matching External DNS add-on on the cluster β so the hostnames you pick actually resolve. For a RouteΒ 53 domain see Deploy an App on an AWS RouteΒ 53 Domain.
- The SeaGit GitHub App installed on the repositories you want to build (Providers).
- A plan that includes MinIO β or your own S3 bucket to use instead.
Step 1 β Add a node pool for builds
On your cluster, add a custom node pool named builds. Give it room to grow and let it scale from a small minimum β build load is bursty, and a pool that scales back down costs you nothing between builds.
β οΈ If you skip this and point everything at your application nodes, the first symptom is build pods sitting in Pending forever because the application pool is already at its maximum. Adding capacity later fixes it, but the build that triggered it has already timed out.
Adding a node pool is a change to the cluster, so allow a few minutes for it to apply before moving on.
Step 2 β Connect the providers Argo CI needs
Under Providers, make sure you have:
- A GitHub provider β used to clone your repositories.
- A registry β choose
ECRto push into the AWS account behind your cluster, or connect another registry. - A token/API-key provider for the webhook secret β this authenticates build events so only you can trigger your pipelines.
- A provider holding a SeaGit API key β how finished builds report their result back. When you create the API key, tick βStore API Key as Provider credentials?β and this provider is created for you.
Skipping the API-key provider is the classic silent failure: builds succeed, but SeaGit never hears about it and the deployment sits at queued indefinitely.
Step 3 β Install MinIO
On the cluster's add-ons, install MinIO. It gives Argo CI somewhere to keep build artifacts, caches, and logs, all inside your own cluster.
Standalone mode is enough for build artifacts. Distributed mode is available on Startup plans and above. If you would rather use your own S3 bucket, skip this step and fill in Argo CI's Artifact Storage settings in the next step instead.
Wait for MinIO to reach applied before continuing β Argo CI checks for it at install time, not later.
Step 4 β Install Argo CI
Install the Argo CI add-on on the same cluster and fill in the form:
- Github Provider, Docker Registry, Webhook Password (Provider) and Seagit API Key (Provider) β the providers from Step 2.
- Workflow Node Pool β select
builds, the pool from Step 1. - Host Name β where the pipeline dashboard is served, e.g.
argoci.your-domain. - Webhook Host Name β the endpoint that receives build events, e.g.
argohook.your-domain.
The install takes a few minutes. When it reports applied, open the dashboard host name in a browser β it should answer over HTTPS with a valid certificate.
Step 5 β Install Argo CD (optional)
If you want a Git repository to be the source of truth for cluster state, install Argo CD as well. Point its Node Pool at builds too, and give it a host name such as argocd.your-domain. It has no MinIO requirement and does not affect the build path β SeaGit deploys your applications either way.
Step 6 β Point an environment at the build server
A cluster with Argo CI installed is capable of building. The environment decides whether it actually does.
Open your environment β Build Servers β add one:
- Type: Argo Workflows
- Cluster: the cluster you just set up β only clusters with Argo CI installed appear here
If the dropdown is empty, Argo CI has not finished installing, or it was installed on a different cluster than the one this environment uses.
Step 7 β Create the application and instance
Create an application with Source Code (Git) as its source, and select your repository. If your repository was connected recently and does not appear, refresh the repository list.
Two fields decide whether your pull requests will build:
Branch or Pattern
This is what routes a pull request to this instance. Enter a specific branch (main) to build only that branch, or a glob pattern (ci-*, feature/*, release/**) to match a family of branches.
The pull request's source branch must match this pattern. A pull request from a branch that doesn't match produces no status checks and no comments β it looks exactly like a broken integration, but it is working as designed. Decide your branch convention here first, then name your branches to match.
Create New Blank Repository for this instance in AWS ECR?
Tick this when you are pushing to ECR and the repository doesn't exist yet. SeaGit creates it in every AWS account behind the target environment. A build cannot create its own registry repository β if it is missing, the push fails with NAME_UNKNOWN: The repository with name ββ¦β does not exist.
For applications built from source, the repository is named after your Git repository, not the instance β so several instances of the same service share one registry repository and are distinguished by image tag. That is usually what you want: one repository per service, one tag per commit.
Note the trade-off the form warns about: with this option on, no deployment is created automatically at instance creation β the first image has to exist before anything can be deployed. Your first pull request provides it.
Step 8 β Open a pull request
Push a branch whose name matches the pattern from Step 7 and open a pull request. Here is the sequence you should see:
pull request opened
β
βββΆ Seagit Dispatch Status β routed to 1 instance
β a preview slot is created for this commit
β
βββΆ Seagit Build Status (CI) β³ β β build success
β pipeline clones, builds and pushes your-registry/your-repo:<commit>
β the check links to the pipeline run
β
βββΆ Seagit Deployment Status (CD) β³ β β deployment succeeded
image is rolled out, DNS and TLS are set up
comment posted with the live preview URLYou also get two comments on the pull request β a Build Summary and a Deployment Summary β each linking to the instance, the environment, and the deployment in your dashboard.
Open the preview URL. It runs that commit, on its own hostname, over HTTPS, fully isolated from your production deployment. Push another commit to the same branch and the same slot is rebuilt and redeployed. When you are happy with it, promote it β see Deployments.
Troubleshooting
These are the failures that actually come up, with the signature that identifies each one.
| What you see | Cause | Fix |
|---|---|---|
Argo CI install refused: MinIO needs to get installed first! | No artifact storage on the cluster. | Install MinIO and wait for applied, or fill in Artifact Storage with your own S3 bucket. |
| Pull request has no checks and no comments | The source branch doesn't match the instance's branch pattern β or the GitHub App isn't installed on that repository. | Compare the branch name to the pattern; confirm the App has access to the repository. |
| Dispatch is green, but no build starts | The environment has no build server attached, or it points at a cluster without Argo CI. | Add the build server on the environment (Step 6). |
Build fails: NAME_UNKNOWN: The repository β¦ does not exist | The registry repository was never created β the option in Step 7 was left off. | Turn on Create New Blank Repository for this instance in AWS ECR? on the instance, or create the repository yourself, then re-run the build. |
Build pods stuck Pending | No schedulable capacity in the selected Workflow Node Pool. | Raise the pool's maximum, or confirm Argo CI is pointing at the pool you actually created. |
| Build is green, deployment stays queued | The build has no way to report back β usually a missing SeaGit API key provider. | Set Seagit API Key (Provider) on the Argo CI add-on and re-apply it. |
| Deployment succeeds but the URL never resolves | The cluster is missing the External DNS add-on for that domain's provider. | Install the matching External DNS add-on β see DNS & Domains. |
Frequently Asked Questions
Do I need MinIO to use Argo CI?
You need artifact storage, and MinIO is the in-cluster way to provide it. Installing Argo CI without either MinIO installed or an S3 bucket set in its Artifact Storage settings is refused with the error "MinIO needs to get installed first!" β the install does not start. MinIO is unavailable on the Free plan and its distributed mode requires a Startup plan or above, so on Free you supply your own S3 bucket instead.
Why does my pull request have no status checks or comments?
Almost always the pull request source branch does not match the branch pattern set on the application instance. An instance set to "main" ignores a pull request opened from "feature/login" β nothing fails and nothing is reported, because the change was never routed to that instance. The other cause is the SeaGit GitHub App not being installed on that repository.
Why does my build fail with NAME_UNKNOWN: the repository does not exist?
A build can push an image but cannot create the registry repository it pushes to. Turn on "Create New Blank Repository for this instance in AWS ECR?" on the instance so SeaGit pre-creates the repository in every AWS account behind the target environment, or create the repository yourself, then re-run the build. For applications built from source the repository is named after the Git repository, not the instance.
The build is green but the deployment stays queued. What is missing?
The build has no way to report its result back to SeaGit, which is almost always a missing Seagit API Key provider on the Argo CI add-on. Set that provider and re-apply the add-on. The key is injected into the Argo namespaces as a Kubernetes Secret and SeaGit validates it by hash.
How long does a build and deploy take?
Measured on a minimal Python (FastAPI) service with the 3-step default pipeline: the build finished in 31 seconds, the deployment reached started 84 seconds later, and the preview URL answered HTTP 200 roughly 2 minutes 20 seconds after the pull request was opened. Larger images with more dependencies take proportionally longer to build, while the deploy half stays roughly constant.
Next Steps
GitOps & build infrastructure β
What each piece does and why the order matters.
Previews, promotion & rollback β
What to do with the preview once it is live.
Variables & secrets β
Runtime configuration for the app you just deployed.
Other build & deploy routes β
Own the trigger yourself, or keep your existing CI.