A GitOps-managed Kubernetes lab for testing Backstage plugins.
Used to test the following Backstage plugins:
This repository installs and manages the following services through ArgoCD:
- Jenkins
 - ArgoCD
 - Tekton Pipelines
 - Ollama, Open WebUI, and various LLM models
 
These manifests run on any Kubernetes cluster with a load balancer.
I personally use K3s, but this setup also works with Minikube or other distros.
It also provides Github and Gitlab workflows with test data.
├── apps
│   └── applicationset.yaml
├── manifests
│   ├── argocd
│   │   ├── base
│   │   │   ├── argocd-apps.yaml
│   │   │   ├── kustomization.yaml
│   │   │   ├── namespace.yaml
│   │   │   ├── roles.yaml
│   │   │   ├── secrets.yaml
│   │   │   └── service-accounts.yaml
│   │   └── overlays
│   │       └── defaults
│   │           └── kustomization.yaml
│   ├── jenkins
│   │   ├── base
│   │   │   ├── deployment.yaml
│   │   │   ├── kustomization.yaml
│   │   │   ├── namespace.yaml
│   │   │   ├── pvc.yaml
│   │   │   └── service.yaml
│   │   ├── docker
│   │   │   ├── casc
│   │   │   │   ├── base.yaml
│   │   │   │   └── jobs.yml
│   │   │   ├── compose.yml
│   │   │   ├── Dockerfile
│   │   │   └── plugins.txt
│   │   └── overlays
│   │       └── defaults
│   │           └── kustomization.yaml
│   ├── llms
│   │   ├── base
│   │   │   ├── deployment.yaml
│   │   │   ├── kustomization.yaml
│   │   │   ├── namespace.yaml
│   │   │   ├── pvc.yaml
│   │   │   └── service.yaml
│   │   └── overlays
│   │       └── defaults
│   │           └── kustomization.yaml
│   └── tekton
│       ├── base
│       │   ├── kustomization.yaml
│       │   ├── namespace.yaml
│       │   ├── roles.yaml
│       │   ├── secrets.yaml
│       │   ├── service-account.yaml
│       │   └── tekton.yaml
│       └── overlays
│           └── defaults
│               └── kustomization.yaml
├── README.md
└── test-artifacts
    ├── Jenkinsfile
    └── sbom-logsEach service folder contains a base manifest and environment overlays managed by ArgoCD ApplicationSets.
These manifests are designed for Kubernetes clusters with a LoadBalancer available.
Note: If you're using Minikube, you may need to run the tunnel command to expose LoadBalancer services.
ArgoCD is used as the GitOps delivery tool.
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yamlWait for ArgoCD to finish installing:
kubectl wait --for=condition=Ready pods --all -n argocd --timeout=300sExpose the ArgoCD server:
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "NodePort"}}'Note: Remove the default port at the end of the URL if present. The cluster server may not be the first one listed — adjust the
.clusters[index]value as needed.
kubectl config view -o jsonpath='{.clusters[0].cluster.server}'kubectl get svc argocd-server -n argocd -o jsonpath='{.spec.ports[0].nodePort}'kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -dDefault username: admin
Access the ArgoCD UI at:
https://<k8s-server-url>:<argocd-svc-port>
kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f https://github.com/argoproj/argo-rollouts/releases/latest/download/install.yamlkubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yamlOnce ArgoCD is running, apply the ApplicationSet that manages all environments:
kubectl apply -f apps/applicationset.yamlCheck the ArgoCD applications:
kubectl get applications -n argocdOnce synced, ArgoCD will deploy all services defined under manifests/.
You can run the after-setup.sh script to get information on:
- ArgoCD Serve port
 - ArgoCD Admin creds
 - ArgoCD Service Account token
 - Tekton Service Account Token
 - Service Ports
 
------------------------------
Backstage Lab 🧪 - After Setup
------------------------------
🖥️ ArgoCD Server port 30314
🔓 ArgoCD Admin creds
Username: admin
Password: <password>
🔄 ArgoCD Service Account
Name: backstage-rollouts
🪙 Token
<token>
⚓ Service Ports
jenkins     8080:31862/TCP,50000:30806/TCP
ollama      11434:31861/TCP
open-webui  3000:31343/TCP
⚗️ Tekton Service Account:
Name: backstage-tekton
🪙 Token
<token>
------------------------------After all pods are live, view service endpoints:
kubectl get svc -A -o wide| Service | Port | 
|---|---|
| Jenkins | 8080 | 
| Open WebUI | 3000 | 
| Ollama | 11434 | 
graph TD
    GitRepo[(GitOps Repo)]
    ArgoCD -->|Syncs manifests| K8sCluster[(Kubernetes Cluster)]
    K8sCluster --> Jenkins
    K8sCluster --> ArgoCD
    K8sCluster --> Tekton
    K8sCluster --> Ollama
    K8sCluster --> OpenWebUI
    To remove all GitOps-managed resources:
kubectl delete -f manifests/applicationset.yaml -n argocd
kubectl delete ns backstage-jenkins backstage-llms backstage-tekton