Repository navigation
Expand file tree
/
Copy pathMakefile
More file actions
361 lines (294 loc) · 13.4 KB
/
Copy pathMakefile
File metadata and controls
361 lines (294 loc) · 13.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
.PHONY: help local-setup local-deploy local-down security-scan build push deploy monitor logs clean
# Variables
AWS_REGION ?= us-east-1
AWS_ACCOUNT_ID ?= 123456789
ECR_REPO_NAME = netflix-clone
EKS_CLUSTER_NAME = netflix-clone-prod
DOCKER_IMAGE = ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/${ECR_REPO_NAME}
IMAGE_TAG ?= latest
NAMESPACE ?= production
# Colors
RED = \033[0;31m
GREEN = \033[0;32m
YELLOW = \033[1;33m
BLUE = \033[0;34m
NC = \033[0m # No Color
help: ## Display this help menu
@echo "$(BLUE)Netflix-Clone DevSecOps Pipeline - Available Commands$(NC)"
@echo ""
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "$(GREEN)%-30s$(NC) %s\n", $$1, $$2}'
# ============================================================================
# LOCAL DEVELOPMENT
# ============================================================================
local-setup: ## Setup local development environment
@echo "$(BLUE)Setting up local development environment...$(NC)"
npm install
docker pull node:18-alpine
docker pull postgres:15-alpine
docker pull redis:7-alpine
@echo "$(GREEN)✓ Local environment ready$(NC)"
local-build: ## Build Docker image locally
@echo "$(BLUE)Building Docker image...$(NC)"
docker build -t ${ECR_REPO_NAME}:${IMAGE_TAG} \
--build-arg BUILD_DATE=$$(date -u +'%Y-%m-%dT%H:%M:%SZ') \
--build-arg VCS_REF=$$(git rev-parse --short HEAD) \
.
@echo "$(GREEN)✓ Image built: ${ECR_REPO_NAME}:${IMAGE_TAG}$(NC)"
local-deploy: ## Deploy using Docker Compose
@echo "$(BLUE)Deploying services with Docker Compose...$(NC)"
docker-compose up -d
@echo "$(GREEN)✓ Services started$(NC)"
@echo ""
@echo "Access services at:"
@echo " Netflix App: http://localhost:3000"
@echo " Jenkins: http://localhost:8080"
@echo " Prometheus: http://localhost:9090"
@echo " Grafana: http://localhost:3001 (admin/admin)"
@echo " Kibana: http://localhost:5601"
@echo " SonarQube: http://localhost:9000"
@echo " Jaeger: http://localhost:16686"
local-down: ## Stop Docker Compose services
@echo "$(BLUE)Stopping services...$(NC)"
docker-compose down
@echo "$(GREEN)✓ Services stopped$(NC)"
local-logs: ## Show Docker Compose logs
docker-compose logs -f netflix-clone
local-status: ## Show Docker Compose status
docker-compose ps
# ============================================================================
# SECURITY SCANNING
# ============================================================================
scan-code: ## Run SAST analysis with SonarQube
@echo "$(BLUE)Running SAST analysis...$(NC)"
sonar-scanner \
-Dsonar.projectKey=netflix-clone \
-Dsonar.sources=src \
-Dsonar.host.url=http://localhost:9000 \
-Dsonar.login=admin \
-Dsonar.password=admin
@echo "$(GREEN)✓ Code quality scan completed$(NC)"
scan-dependencies: ## Scan dependencies for vulnerabilities
@echo "$(BLUE)Scanning dependencies...$(NC)"
npm audit --json > audit.json
@echo "$(GREEN)✓ Dependency scan completed$(NC)"
scan-secrets: ## Scan for hardcoded secrets
@echo "$(BLUE)Scanning for secrets...$(NC)"
@if command -v trufflehog &> /dev/null; then \
trufflehog filesystem . --json > secrets-report.json; \
else \
echo "$(YELLOW)⚠ TruffleHog not installed$(NC)"; \
fi
@echo "$(GREEN)✓ Secret scan completed$(NC)"
scan-docker: ## Scan Docker image for vulnerabilities
@echo "$(BLUE)Scanning Docker image...$(NC)"
@if command -v trivy &> /dev/null; then \
trivy image --severity HIGH,CRITICAL \
--format json \
--output trivy-report.json \
${ECR_REPO_NAME}:${IMAGE_TAG}; \
fi
@if command -v grype &> /dev/null; then \
grype ${ECR_REPO_NAME}:${IMAGE_TAG} \
-o json > grype-report.json; \
fi
@echo "$(GREEN)✓ Docker image scan completed$(NC)"
security-scan: scan-code scan-dependencies scan-secrets scan-docker ## Run all security scans
@echo "$(GREEN)✓ All security scans completed$(NC)"
# ============================================================================
# AWS & DOCKER REGISTRY
# ============================================================================
aws-login: ## Login to AWS ECR
@echo "$(BLUE)Logging into AWS ECR...$(NC)"
aws ecr get-login-password --region ${AWS_REGION} | \
docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com
@echo "$(GREEN)✓ Logged into ECR$(NC)"
ecr-create: ## Create ECR repository
@echo "$(BLUE)Creating ECR repository...$(NC)"
aws ecr create-repository \
--repository-name ${ECR_REPO_NAME} \
--region ${AWS_REGION} \
--encryption-configuration encryptionType=AES 2>/dev/null || \
echo "$(YELLOW)Repository already exists$(NC)"
# ============================================================================
# BUILD & PUSH
# ============================================================================
build: local-build ## Build Docker image
push: aws-login ## Push image to ECR
@echo "$(BLUE)Pushing image to ECR...$(NC)"
docker tag ${ECR_REPO_NAME}:${IMAGE_TAG} ${DOCKER_IMAGE}:${IMAGE_TAG}
docker tag ${ECR_REPO_NAME}:${IMAGE_TAG} ${DOCKER_IMAGE}:latest
docker push ${DOCKER_IMAGE}:${IMAGE_TAG}
docker push ${DOCKER_IMAGE}:latest
@echo "$(GREEN)✓ Image pushed to ECR$(NC)"
# ============================================================================
# KUBERNETES
# ============================================================================
k8s-cluster-create: ## Create EKS cluster
@echo "$(BLUE)Creating EKS cluster...$(NC)"
eksctl create cluster \
--name ${EKS_CLUSTER_NAME} \
--region ${AWS_REGION} \
--nodegroup-name standard-workers \
--node-type t3.medium \
--nodes 3 \
--managed
@echo "$(GREEN)✓ EKS cluster created$(NC)"
k8s-cluster-delete: ## Delete EKS cluster
@echo "$(YELLOW)Deleting EKS cluster...$(NC)"
eksctl delete cluster --name ${EKS_CLUSTER_NAME} --region ${AWS_REGION}
@echo "$(GREEN)✓ EKS cluster deleted$(NC)"
k8s-deploy: ## Deploy application to Kubernetes
@echo "$(BLUE)Deploying to Kubernetes...$(NC)"
kubectl create namespace ${NAMESPACE} --dry-run=client -o yaml | kubectl apply -f -
kubectl apply -f k8s-deployment.yaml
kubectl wait --for=condition=available --timeout=300s \
deployment/netflix-clone -n ${NAMESPACE}
@echo "$(GREEN)✓ Application deployed$(NC)"
k8s-rollout-status: ## Check rollout status
kubectl rollout status deployment/netflix-clone -n ${NAMESPACE}
k8s-scale: ## Scale deployment (usage: make k8s-scale REPLICAS=5)
@echo "$(BLUE)Scaling deployment to ${REPLICAS} replicas...$(NC)"
kubectl scale deployment/netflix-clone --replicas=${REPLICAS} -n ${NAMESPACE}
@echo "$(GREEN)✓ Deployment scaled$(NC)"
k8s-restart: ## Restart deployment
@echo "$(BLUE)Restarting deployment...$(NC)"
kubectl rollout restart deployment/netflix-clone -n ${NAMESPACE}
@echo "$(GREEN)✓ Deployment restarted$(NC)"
k8s-delete: ## Delete deployment
@echo "$(YELLOW)Deleting deployment...$(NC)"
kubectl delete deployment netflix-clone -n ${NAMESPACE}
@echo "$(GREEN)✓ Deployment deleted$(NC)"
k8s-status: ## Show Kubernetes resources status
@echo "$(BLUE)Kubernetes Resources:$(NC)"
kubectl get all -n ${NAMESPACE}
@echo ""
@echo "$(BLUE)Pods:$(NC)"
kubectl get pods -n ${NAMESPACE} -o wide
@echo ""
@echo "$(BLUE)Services:$(NC)"
kubectl get svc -n ${NAMESPACE}
# ============================================================================
# ARGOCD & GITOPS
# ============================================================================
argocd-install: ## Install ArgoCD
@echo "$(BLUE)Installing ArgoCD...$(NC)"
kubectl create namespace argocd --dry-run=client -o yaml | kubectl apply -f -
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
@echo "$(GREEN)✓ ArgoCD installed$(NC)"
argocd-deploy: ## Deploy ArgoCD application
@echo "$(BLUE)Deploying ArgoCD application...$(NC)"
kubectl apply -f argocd-applicationset.yaml
@echo "$(GREEN)✓ ArgoCD application deployed$(NC)"
argocd-login: ## Get ArgoCD initial password
@echo "$(BLUE)Getting ArgoCD initial password...$(NC)"
@kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d
@echo ""
argocd-port-forward: ## Port forward to ArgoCD server
@echo "$(BLUE)Forwarding to ArgoCD on localhost:8443...$(NC)"
kubectl port-forward svc/argocd-server -n argocd 8443:443
# ============================================================================
# MONITORING & OBSERVABILITY
# ============================================================================
prometheus-install: ## Install Prometheus
@echo "$(BLUE)Installing Prometheus...$(NC)"
kubectl apply -f prometheus-setup.yaml
@echo "$(GREEN)✓ Prometheus installed$(NC)"
grafana-install: ## Install Grafana
@echo "$(BLUE)Installing Grafana...$(NC)"
kubectl apply -f grafana-setup.yaml
@echo "$(GREEN)✓ Grafana installed$(NC)"
monitoring-install: prometheus-install grafana-install ## Install all monitoring tools
@echo "$(GREEN)✓ Monitoring stack installed$(NC)"
prometheus-port-forward: ## Port forward to Prometheus
@echo "$(BLUE)Forwarding to Prometheus on localhost:9090...$(NC)"
kubectl port-forward svc/prometheus 9090:9090 -n monitoring
grafana-port-forward: ## Port forward to Grafana
@echo "$(BLUE)Forwarding to Grafana on localhost:3000...$(NC)"
kubectl port-forward svc/grafana 3000:3000 -n monitoring
# ============================================================================
# LOGGING & DEBUGGING
# ============================================================================
logs-app: ## Show application logs
kubectl logs -f deployment/netflix-clone -n ${NAMESPACE}
logs-previous: ## Show previous pod logs (for crashes)
kubectl logs --previous deployment/netflix-clone -n ${NAMESPACE}
logs-all-pods: ## Show logs from all pods
kubectl logs -f -l app=netflix-clone -n ${NAMESPACE}
describe-pod: ## Describe pod (usage: make describe-pod POD=pod-name)
kubectl describe pod ${POD} -n ${NAMESPACE}
debug-pod: ## Debug pod with shell access (usage: make debug-pod POD=pod-name)
@echo "$(BLUE)Starting debug session...$(NC)"
kubectl debug pod/${POD} -n ${NAMESPACE} -it --image=busybox
port-forward-app: ## Port forward to application
@echo "$(BLUE)Forwarding app to localhost:8080...$(NC)"
kubectl port-forward svc/netflix-clone 8080:80 -n ${NAMESPACE}
# ============================================================================
# CI/CD & JENKINS
# ============================================================================
jenkins-install: ## Install Jenkins
@echo "$(BLUE)Installing Jenkins...$(NC)"
helm repo add jenkinsci https://charts.jenkins.io
helm repo update
helm install jenkins jenkinsci/jenkins --namespace jenkins --create-namespace
@echo "$(GREEN)✓ Jenkins installed$(NC)"
jenkins-port-forward: ## Port forward to Jenkins
@echo "$(BLUE)Forwarding to Jenkins on localhost:8080...$(NC)"
kubectl port-forward svc/jenkins 8080:8080 -n jenkins
jenkins-logs: ## Show Jenkins logs
kubectl logs -f -l app.kubernetes.io/name=jenkins -n jenkins
# ============================================================================
# MAINTENANCE & CLEANUP
# ============================================================================
test: ## Run unit tests
@echo "$(BLUE)Running tests...$(NC)"
npm test -- --coverage
@echo "$(GREEN)✓ Tests completed$(NC)"
lint: ## Run code linting
@echo "$(BLUE)Running linter...$(NC)"
npm run lint
@echo "$(GREEN)✓ Linting completed$(NC)"
format: ## Format code
@echo "$(BLUE)Formatting code...$(NC)"
npm run format
@echo "$(GREEN)✓ Code formatted$(NC)"
clean: ## Clean local artifacts
@echo "$(YELLOW)Cleaning artifacts...$(NC)"
rm -rf node_modules dist coverage
rm -f *-report.json *.log
docker-compose down -v
@echo "$(GREEN)✓ Cleanup completed$(NC)"
clean-all: clean ## Complete cleanup including images
@echo "$(YELLOW)Removing Docker images...$(NC)"
docker rmi ${ECR_REPO_NAME}:${IMAGE_TAG} 2>/dev/null || true
docker system prune -f
@echo "$(GREEN)✓ Complete cleanup done$(NC)"
# ============================================================================
# FULL PIPELINE
# ============================================================================
pipeline-local: local-setup build security-scan local-deploy logs-app ## Run complete local pipeline
@echo "$(GREEN)✓ Local pipeline completed$(NC)"
pipeline-aws: build security-scan ecr-create push k8s-deploy argocd-deploy ## Run complete AWS pipeline
@echo "$(GREEN)✓ AWS pipeline completed$(NC)"
setup-all: ## Complete setup (AWS + monitoring)
@echo "$(BLUE)Running complete setup...$(NC)"
chmod +x setup-devsecops-pipeline.sh
./setup-devsecops-pipeline.sh
@echo "$(GREEN)✓ Complete setup finished$(NC)"
# ============================================================================
# UTILITIES
# ============================================================================
versions: ## Show component versions
@echo "$(BLUE)Component Versions:$(NC)"
@echo "Docker: $$(docker --version)"
@echo "kubectl: $$(kubectl version --client --short 2>/dev/null || echo 'not installed')"
@echo "helm: $$(helm version --short 2>/dev/null || echo 'not installed')"
@echo "aws: $$(aws --version 2>/dev/null || echo 'not installed')"
info: ## Show configuration info
@echo "$(BLUE)Configuration:$(NC)"
@echo "AWS Region: ${AWS_REGION}"
@echo "AWS Account: ${AWS_ACCOUNT_ID}"
@echo "ECR Repo: ${ECR_REPO_NAME}"
@echo "EKS Cluster: ${EKS_CLUSTER_NAME}"
@echo "Namespace: ${NAMESPACE}"
@echo "Docker Image: ${DOCKER_IMAGE}"
.DEFAULT_GOAL := help