CI/CD Pipeline: Laptop to Production
0%Writing code is only 50% of the job. How does that code reliably get from your laptop, through rigorous automated testing, packaged into Docker, and deployed into a Kubernetes cluster serving millions? Welcome to Continuous Integration and Continuous Deployment.
0 / 5 Lessons Completed
// Interactive Simulator
The Deployment Journey
Watch the code travel. Click the Play button below to simulate pushing code to GitHub, triggering Jenkins, building Docker, provisioning Terraform, and deploying live to Kubernetes.
// Architecture
Production Folder Structure
In a modern microservices environment, infrastructure code lives right alongside your application code. This is called "GitOps."
- monorepo/
- ├── backend/ // Node.js / Express
- ├── frontend/ // Next.js / React
- ├── docker/ // Dockerfiles and docker-compose.yml
- ├── k8s/ // Kubernetes YAMLs (deployment, service, ingress)
- ├── terraform/ // AWS infrastructure provisioning
- ├── .github/ // GitHub Actions workflows
- └── Jenkinsfile // Pipeline definition
// YAML & HCL
Infrastructure Code Examples
Every step of the deployment is defined in code. Here are the core files that make the magic happen.
k8s/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-deployment
spec:
replicas: 3 # Ensures 3 pods are always running
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
spec:
containers:
- name: nodejs-api
image: quizkaal/app:v1.0.1 # Tagged from DockerHub
ports:
- containerPort: 8080
kind: Deployment
metadata:
name: api-deployment
spec:
replicas: 3 # Ensures 3 pods are always running
selector:
matchLabels:
app: api
template:
metadata:
labels:
app: api
spec:
containers:
- name: nodejs-api
image: quizkaal/app:v1.0.1 # Tagged from DockerHub
ports:
- containerPort: 8080
k8s/service.yaml
apiVersion: v1
kind: Service
metadata:
name: api-service
spec:
type: ClusterIP # Internal load balancing
selector:
app: api # Matches the deployment
ports:
- protocol: TCP
port: 80
targetPort: 8080 # Routes to container port
kind: Service
metadata:
name: api-service
spec:
type: ClusterIP # Internal load balancing
selector:
app: api # Matches the deployment
ports:
- protocol: TCP
port: 80
targetPort: 8080 # Routes to container port
// Get Hired