Automate deployments by connecting your GitLab repositories to Ankra GitOps
This guide shows you how to build a CI/CD pipeline with GitLab CI that automatically deploys your applications to Kubernetes when you push code. Your pipeline builds container images and updates the GitOps repository. Ankra handles the rest.
In Ankra, manifests are organized into Stacks. A Stack is a collection of related Kubernetes resources that are deployed together.
1
Open the Stacks Page
Navigate to your cluster → Stacks.
2
Create a New Stack
Click Create to open the Stack Builder.
3
Name Your Stack
Give your stack a descriptive name, like backend-services or production-apps.
4
Add a Manifest Using AI
Press ⌘+J (or Ctrl+J) to open the AI Assistant and describe your deployment:
Copy
Create a deployment manifest for my backend service:- Image: registry.gitlab.com/my-group/my-app/backend:latest- Namespace: production- 2 replicas- Port 8080- Health check on /health- 256Mi memory, 100m CPU requests
The AI will provide a manifest you can add to your stack.
5
Create the Stack
Review your configuration in the Builder tab, then click Create Stack.Ankra will commit the manifests to your GitOps repository and deploy them to your cluster.
You can view your stack’s manifests in the GitOps repository under clusters/{cluster-name}/manifests/.
This creates deploy_key (private) and deploy_key.pub (public).
2
Add Public Key to GitOps Repo
Go to your GitOps repository on GitLab → Settings → Repository → Deploy keys.Add the contents of deploy_key.pub and check Grant write permissions to this key.
3
Add Private Key to App Repo
Go to your application repository → Settings → CI/CD → Variables.Create a new variable:
Add a .gitlab-ci.yml file to your application repository that builds your container and updates the GitOps repo.
1
Create the Pipeline File
In your application repository, create .gitlab-ci.yml at the root.
2
Use the AI to Generate the Pipeline
Open the AI Assistant (⌘+J) and describe your pipeline:
Copy
Generate a GitLab CI pipeline that:- Triggers on push to main branch- Builds a Docker image from my Dockerfile- Pushes to GitLab Container Registry- Tags with the git SHA- Updates my GitOps repo at gitlab.com/my-group/infrastructure-gitops- Updates the image tag in clusters/my-cluster/manifests/backend-deployment.yaml
The AI will generate a complete pipeline tailored to your setup.
3
Add Registry Variables
If using an external registry (not GitLab Container Registry), add these variables under Settings → CI/CD → Variables:
Variable
Description
REGISTRY_USERNAME
Registry username (or _json_key for GCP)
REGISTRY_PASSWORD
Registry password or service account key
GITOPS_DEPLOY_KEY
The SSH private key from Step 3
GitLab Container Registry is available by default in GitLab CI via $CI_REGISTRY, $CI_REGISTRY_USER, and $CI_REGISTRY_PASSWORD — no extra variables needed.
Example Pipeline: GitLab Container Registry
Here’s a pipeline using GitLab’s built-in container registry. Use the AI to customize it for your setup:
To add CI/CD for additional services, use the AI Assistant to scaffold everything:
1
Add to Existing Stack or Create New
Either edit your existing stack or create a new one for the service.
2
Generate the Deployment Manifest
Open the AI Assistant (⌘+J) and describe your service:
Copy
Add a deployment for my frontend service:- Image: registry.gitlab.com/my-group/my-app/frontend- Namespace: production- 3 replicas- Port 3000- Expose via a Service on port 80
3
Generate the CI Pipeline
In your frontend app repo, create a .gitlab-ci.yml or ask the AI:
Copy
Generate a GitLab CI pipeline to build and deploy my frontend:- Build from ./frontend/Dockerfile- Push to GitLab Container Registry- Update clusters/my-cluster/manifests/frontend-deployment.yaml in my GitOps repo
4
Add the Variables
Copy the same CI/CD variables (GITOPS_DEPLOY_KEY, registry credentials) to the new project.
Use these prompts with the AI Assistant (⌘+J) to set up your CI/CD:
Create a Deployment
Copy
Create a deployment manifest for my backend service:- Image: registry.gitlab.com/my-group/backend:latest- Namespace: production- 2 replicas with rolling update strategy- Port 8080- Health checks on /health and /ready- Resource requests: 256Mi memory, 100m CPU- Resource limits: 512Mi memory, 500m CPU- Environment variables from a ConfigMap called backend-config
Create a Complete Service Stack
Copy
Set up a complete service stack for my API:- Deployment with 3 replicas- Service exposing port 80- Ingress with TLS using cert-manager- HorizontalPodAutoscaler scaling 2-10 replicas at 70% CPU- PodDisruptionBudget allowing 1 unavailable
Add Image Pull Secret
Copy
Create a docker registry secret for pulling images from:- Registry: registry.gitlab.com- Namespace: productionThen update my backend deployment to use this secret.
Generate GitLab CI Pipeline
Copy
Generate a GitLab CI pipeline that:- Builds my Docker image on push to main- Pushes to GitLab Container Registry- Updates clusters/prod/manifests/app-deployment.yaml in my GitOps repo- Only builds when files in src/ or Dockerfile change
Troubleshoot Deployment
Copy
My backend deployment isn't updating after CI pushed a new image.Help me troubleshoot why the pods aren't rolling out.
The AI Assistant has full context of your cluster. It can see your existing resources, logs, and events. Describe what you want to achieve and it will generate the right configuration.
Always use unique, immutable tags like $CI_COMMIT_SHA or $CI_PIPELINE_ID. Avoid relying solely on latest.Ask the AI: “Ensure my deployment uses immutable image tags and imagePullPolicy IfNotPresent”
Use GitLab Deploy Tokens for Pull Access
Instead of using Personal Access Tokens, create Deploy Tokens with read_registry scope for image pull secrets. They’re scoped to a project and easy to rotate.
Add Health Checks
Let the AI configure proper health checks for your deployments.Ask the AI: “Add appropriate liveness and readiness probes to my backend deployment for a Node.js app”
Set Resource Limits
Prevent runaway resource usage with proper limits.Ask the AI: “Review my deployment and suggest appropriate resource requests and limits based on a typical web API”
Use SOPS for Secrets
Encrypt sensitive values in your GitOps repository.Ask the AI: “Help me encrypt my database password using SOPS”
Protect CI/CD Variables
Mark sensitive variables as Protected and Masked in GitLab CI/CD settings. Use File type for SSH keys to avoid shell escaping issues.