Build a GitOps Pipeline with ArgoCD and Helm (2026 Project Walkthrough)
A complete GitOps setup with ArgoCD and Helm ā from installing ArgoCD to auto-deploying your app when you push to Git.
GitOps means your Git repo is the source of truth. Push a change to Git ā your cluster updates automatically. This walkthrough shows you how to build that with ArgoCD and Helm.
What You Will Build
Developer pushes to Git
ā
GitHub repo (Helm chart updated)
ā
ArgoCD detects drift
ā
ArgoCD applies changes to Kubernetes
ā
App updated ā no kubectl apply needed
Prerequisites
- Running Kubernetes cluster (minikube, kind, or cloud)
- kubectl configured
- Helm 3 installed
- A GitHub account
Step 1: Install ArgoCD
kubectl create namespace argocd
kubectl apply -n argocd -f \
https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# Wait for all pods to be running
kubectl get pods -n argocd -wAccess the ArgoCD UI:
kubectl port-forward svc/argocd-server -n argocd 8080:443Get the initial admin password:
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath="{.data.password}" | base64 -dLogin at https://localhost:8080 with username admin.
Step 2: Create Your Helm Chart
Create a simple Helm chart for your app:
helm create myappThis generates:
myapp/
āāā Chart.yaml
āāā values.yaml
āāā templates/
āāā deployment.yaml
āāā service.yaml
āāā ingress.yaml
Edit values.yaml:
replicaCount: 2
image:
repository: nginx
tag: "1.25"
pullPolicy: IfNotPresent
service:
type: ClusterIP
port: 80
resources:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 200m
memory: 256MiStep 3: Push Chart to GitHub
# Create a new repo on GitHub: github.com/yourname/myapp-gitops
git init
git add .
git commit -m "initial helm chart"
git remote add origin https://github.com/yourname/myapp-gitops.git
git push -u origin mainYour repo structure:
myapp-gitops/
āāā helm/
āāā myapp/
āāā Chart.yaml
āāā values.yaml
āāā templates/
Step 4: Create ArgoCD Application
Create argocd-app.yaml:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: myapp
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/yourname/myapp-gitops
targetRevision: main
path: helm/myapp
destination:
server: https://kubernetes.default.svc
namespace: production
syncPolicy:
automated:
prune: true # delete resources removed from git
selfHeal: true # revert manual changes
syncOptions:
- CreateNamespace=trueApply it:
kubectl apply -f argocd-app.yamlArgoCD will now sync your app from Git to the cluster.
Step 5: Make a Change and Watch It Deploy
Update values.yaml ā change the image tag:
image:
repository: nginx
tag: "1.26" # changed from 1.25Push to GitHub:
git add .
git commit -m "update nginx to 1.26"
git pushArgoCD detects the change within 3 minutes and applies it. Watch in the UI or:
kubectl get pods -n production -wYou'll see new pods come up with the new image, old ones terminate.
Step 6: Separate Values Per Environment
Use different values files for dev/staging/production:
helm/myapp/
āāā Chart.yaml
āāā values.yaml # defaults
āāā values-staging.yaml # staging overrides
āāā values-production.yaml # production overrides
values-production.yaml:
replicaCount: 5
image:
tag: "1.26"
resources:
requests:
cpu: 500m
memory: 512MiArgoCD Application for production:
source:
repoURL: https://github.com/yourname/myapp-gitops
path: helm/myapp
helm:
valueFiles:
- values.yaml
- values-production.yamlVerify Everything Works
# Check ArgoCD sync status
kubectl get applications -n argocd
# Check app is running
kubectl get pods -n production
# Check sync history in ArgoCD UI
# Every Git commit becomes a deployable versionWhat to Add Next
- Image Updater ā ArgoCD Image Updater watches container registries and auto-updates image tags in Git
- Secrets ā Use Sealed Secrets or External Secrets Operator
- Multi-cluster ā One ArgoCD managing 10+ clusters
- ApplicationSet ā One template, multiple Applications (one per environment)
Resources
Today I Fixed
Short real fixes from production ā posted daily
Stay ahead of the curve
Get the latest DevOps, Kubernetes, AWS, and AI/ML guides delivered straight to your inbox. No spam ā just practical engineering content.
Related Articles
ArgoCD App of Apps Not Syncing ā Every Fix (2026)
Your ArgoCD App of Apps pattern stopped syncing. Child apps aren't created, parent shows OutOfSync, or sync is stuck. Here are every cause and the exact fix.
ArgoCD Resource Hook Failed: How to Debug and Fix It
ArgoCD PreSync or PostSync hooks failing silently? Here's how to find the real error, fix hook job issues, and stop your deployments from getting stuck.
ArgoCD App Stuck in 'Unknown' Sync Status ā Here's the Fix
If your ArgoCD application is stuck showing Unknown sync status and refresh doesn't help, this guide walks you through the exact steps to diagnose and fix it ā including RBAC issues, webhook problems, and cluster connectivity errors.