SEAGIT DOCS
Argo CI/CD Setup

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 main ignores a pull request from feature/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.

βœ“ Seagit Dispatch Statusβœ“ Seagit Build Status (CI)βœ“ Seagit Deployment Status (CD)

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 ECR to 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 URL

You 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 seeCauseFix
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 commentsThe 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 startsThe 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 existThe 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 PendingNo 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 queuedThe 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 resolvesThe 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