|
1 | 1 | # Detect OpenShift vs Kubernetes |
2 | 2 | KUBECTL_CMD := $(shell command -v oc 2>/dev/null || echo kubectl) |
3 | 3 |
|
4 | | -# Get current namespace from kubectl/oc, fallback to sast-ai-workflow |
| 4 | +# Environment-specific settings |
| 5 | +DEV_NAMESPACE := sast-ai-dev |
| 6 | +PROD_NAMESPACE := sast-ai-prod |
| 7 | + |
| 8 | +# Get current namespace from kubectl/oc, fallback to dev |
5 | 9 | CURRENT_NAMESPACE := $(shell $(KUBECTL_CMD) config view --minify --output 'jsonpath={..namespace}' 2>/dev/null) |
6 | | -NAMESPACE ?= $(if $(CURRENT_NAMESPACE),$(CURRENT_NAMESPACE),sast-ai-workflow) |
| 10 | +NAMESPACE ?= $(if $(CURRENT_NAMESPACE),$(CURRENT_NAMESPACE),$(DEV_NAMESPACE)) |
7 | 11 |
|
8 | 12 | RELEASE_NAME ?= sast-ai-orchestrator |
9 | 13 | CHART_PATH ?= ./sast-ai-chart |
10 | 14 | HELM_TIMEOUT ?= 300s |
11 | 15 |
|
12 | 16 | .DEFAULT_GOAL := help |
13 | 17 |
|
14 | | -.PHONY: deploy |
15 | | -deploy: ## Deploy SAST AI to the cluster |
16 | | - @echo "Deploying SAST AI..." |
17 | | - @echo "Namespace: $(NAMESPACE)" |
18 | | - @echo "Release: $(RELEASE_NAME)" |
| 18 | +.PHONY: deploy-dev |
| 19 | +deploy-dev: ## Deploy to development environment (sast-ai-dev namespace) |
| 20 | + @echo "🚀 Deploying SAST AI to DEVELOPMENT environment..." |
| 21 | + @echo "Namespace: $(DEV_NAMESPACE)" |
| 22 | + @echo "Release: $(RELEASE_NAME)-dev" |
| 23 | + @echo "Using: $(KUBECTL_CMD)" |
| 24 | + @$(MAKE) _deploy NAMESPACE=$(DEV_NAMESPACE) RELEASE_NAME=$(RELEASE_NAME)-dev VALUES_FILE=values-dev.yaml |
| 25 | + |
| 26 | +.PHONY: deploy-prod |
| 27 | +deploy-prod: ## Deploy to production environment (sast-ai-prod namespace) |
| 28 | + @echo "🚀 Deploying SAST AI to PRODUCTION environment..." |
| 29 | + @echo "Namespace: $(PROD_NAMESPACE)" |
| 30 | + @echo "Release: $(RELEASE_NAME)-prod" |
19 | 31 | @echo "Using: $(KUBECTL_CMD)" |
| 32 | + @$(MAKE) _deploy NAMESPACE=$(PROD_NAMESPACE) RELEASE_NAME=$(RELEASE_NAME)-prod VALUES_FILE=values-prod.yaml |
| 33 | + |
| 34 | +.PHONY: _deploy |
| 35 | +_deploy: ## Internal deployment target |
20 | 36 | @helm repo add bitnami https://charts.bitnami.com/bitnami >/dev/null 2>&1 || true |
21 | 37 | @helm repo update >/dev/null 2>&1 |
22 | 38 | @cd $(CHART_PATH) && helm dependency update |
23 | 39 | @helm install $(RELEASE_NAME) $(CHART_PATH) \ |
24 | 40 | -f $(CHART_PATH)/values.yaml \ |
| 41 | + -f $(CHART_PATH)/$(VALUES_FILE) \ |
25 | 42 | -n $(NAMESPACE) \ |
26 | 43 | --create-namespace \ |
27 | 44 | --timeout=$(HELM_TIMEOUT) \ |
28 | 45 | --set app.env.SAST_AI_WORKFLOW_NAMESPACE=$(NAMESPACE) |
29 | | - @echo "Deployment completed!" |
30 | | - @$(MAKE) wait-pods |
31 | | - @echo "Checking for ArgoCD availability..." |
| 46 | + @echo "✅ Deployment completed!" |
| 47 | + @$(MAKE) wait-pods NAMESPACE=$(NAMESPACE) |
| 48 | + @echo "🔍 Checking for ArgoCD availability..." |
32 | 49 | @if $(KUBECTL_CMD) get crd applications.argoproj.io >/dev/null 2>&1; then \ |
33 | | - echo "ArgoCD detected! Creating ArgoCD Application..."; \ |
34 | | - $(MAKE) argocd; \ |
| 50 | + echo "📦 ArgoCD detected! Creating ArgoCD Application..."; \ |
| 51 | + $(MAKE) argocd NAMESPACE=$(NAMESPACE); \ |
35 | 52 | else \ |
36 | | - echo "ArgoCD not available in cluster, skipping ArgoCD Application creation."; \ |
| 53 | + echo "⚠️ ArgoCD not available in cluster, skipping ArgoCD Application creation."; \ |
37 | 54 | fi |
38 | | - @$(MAKE) show-access |
| 55 | + @$(MAKE) show-access NAMESPACE=$(NAMESPACE) |
39 | 56 |
|
40 | | -.PHONY: upgrade |
41 | | -upgrade: ## Upgrade existing deployment |
42 | | - @echo "Upgrading SAST AI..." |
| 57 | +.PHONY: upgrade-dev |
| 58 | +upgrade-dev: ## Upgrade development deployment |
| 59 | + @echo "⬆️ Upgrading SAST AI DEVELOPMENT deployment..." |
| 60 | + @$(MAKE) _upgrade NAMESPACE=$(DEV_NAMESPACE) RELEASE_NAME=$(RELEASE_NAME)-dev VALUES_FILE=values-dev.yaml |
| 61 | + |
| 62 | +.PHONY: upgrade-prod |
| 63 | +upgrade-prod: ## Upgrade production deployment |
| 64 | + @echo "⬆️ Upgrading SAST AI PRODUCTION deployment..." |
| 65 | + @$(MAKE) _upgrade NAMESPACE=$(PROD_NAMESPACE) RELEASE_NAME=$(RELEASE_NAME)-prod VALUES_FILE=values-prod.yaml |
| 66 | + |
| 67 | +.PHONY: _upgrade |
| 68 | +_upgrade: ## Internal upgrade target |
43 | 69 | @helm repo add bitnami https://charts.bitnami.com/bitnami >/dev/null 2>&1 || true |
44 | 70 | @helm repo update >/dev/null 2>&1 |
45 | 71 | @cd $(CHART_PATH) && helm dependency update |
46 | 72 | @helm upgrade $(RELEASE_NAME) $(CHART_PATH) \ |
47 | 73 | -f $(CHART_PATH)/values.yaml \ |
| 74 | + -f $(CHART_PATH)/$(VALUES_FILE) \ |
48 | 75 | -n $(NAMESPACE) \ |
49 | 76 | --timeout=$(HELM_TIMEOUT) \ |
50 | 77 | --set app.env.SAST_AI_WORKFLOW_NAMESPACE=$(NAMESPACE) |
51 | | - @echo "Upgrade completed!" |
52 | | - @$(MAKE) wait |
| 78 | + @echo "✅ Upgrade completed!" |
| 79 | + @$(MAKE) wait-pods NAMESPACE=$(NAMESPACE) |
53 | 80 |
|
54 | | -.PHONY: install |
55 | | -install: deploy ## Alias for deploy |
| 81 | +.PHONY: clean-dev |
| 82 | +clean-dev: ## Remove development deployment |
| 83 | + @echo "🧹 Removing SAST AI DEVELOPMENT deployment..." |
| 84 | + @$(MAKE) _clean NAMESPACE=$(DEV_NAMESPACE) RELEASE_NAME=$(RELEASE_NAME)-dev |
56 | 85 |
|
57 | | -.PHONY: clean |
58 | | -clean: ## Remove the deployment |
59 | | - @echo "Removing SAST AI deployment..." |
60 | | - @echo "Checking for ArgoCD Application..." |
61 | | - @if $(KUBECTL_CMD) get crd applications.argoproj.io >/dev/null 2>&1; then \ |
62 | | - if $(KUBECTL_CMD) get application $(RELEASE_NAME)-syncer -n $(NAMESPACE) >/dev/null 2>&1; then \ |
63 | | - echo "Removing ArgoCD Application..."; \ |
64 | | - echo "Removing finalizers to prevent hanging..."; \ |
65 | | - $(KUBECTL_CMD) patch application $(RELEASE_NAME)-syncer -n $(NAMESPACE) --type='merge' -p='{"metadata":{"finalizers":[]}}' 2>/dev/null || true; \ |
66 | | - $(KUBECTL_CMD) delete application $(RELEASE_NAME)-syncer -n $(NAMESPACE) --ignore-not-found=true; \ |
67 | | - echo "ArgoCD Application removed!"; \ |
68 | | - else \ |
69 | | - echo "ArgoCD Application '$(RELEASE_NAME)-syncer' not found in namespace '$(NAMESPACE)'"; \ |
70 | | - fi; \ |
71 | | - else \ |
72 | | - echo "ArgoCD not available in cluster, skipping ArgoCD Application removal."; \ |
73 | | - fi |
| 86 | +.PHONY: clean-prod |
| 87 | +clean-prod: ## Remove production deployment |
| 88 | + @echo "🧹 Removing SAST AI PRODUCTION deployment..." |
| 89 | + @$(MAKE) _clean NAMESPACE=$(PROD_NAMESPACE) RELEASE_NAME=$(RELEASE_NAME)-prod |
| 90 | + |
| 91 | +.PHONY: _clean |
| 92 | +_clean: ## Internal clean target |
74 | 93 | @if helm list -n $(NAMESPACE) | grep -q "^$(RELEASE_NAME)"; then \ |
75 | 94 | helm uninstall $(RELEASE_NAME) -n $(NAMESPACE) --timeout=$(HELM_TIMEOUT); \ |
76 | | - echo "Deployment removed!"; \ |
| 95 | + @echo "Cleaning up remaining resources by label..." |
| 96 | + @$(KUBECTL_CMD) delete all,pvc,secrets,configmaps,ingress,routes,networkpolicy,pdb,sa,role,rolebinding,job -n $(NAMESPACE) -l "app.kubernetes.io/instance=$(RELEASE_NAME)" --ignore-not-found=true 2>/dev/null || true |
| 97 | + @echo "Force cleaning any remaining resources with release name prefix..." |
| 98 | + @for resource_type in deployment replicaset pod service configmap secret pvc role rolebinding serviceaccount networkpolicy poddisruptionbudget job cronjob ingress route; do \ |
| 99 | + $(KUBECTL_CMD) get $$resource_type -n $(NAMESPACE) -o name 2>/dev/null | grep "$(RELEASE_NAME)" | xargs -r $(KUBECTL_CMD) delete -n $(NAMESPACE) --ignore-not-found=true 2>/dev/null || true; \ |
| 100 | + done |
| 101 | + @echo "Cleanup completed!" |
| 102 | + echo "✅ Deployment removed from $(NAMESPACE)"; \ |
77 | 103 | else \ |
78 | 104 | echo "Release '$(RELEASE_NAME)' not found in namespace '$(NAMESPACE)'"; \ |
79 | 105 | fi |
80 | | - @echo "Cleaning up remaining resources by label..." |
81 | | - @$(KUBECTL_CMD) delete all,pvc,secrets,configmaps,ingress,routes,networkpolicy,pdb,sa,role,rolebinding,job -n $(NAMESPACE) -l "app.kubernetes.io/instance=$(RELEASE_NAME)" --ignore-not-found=true 2>/dev/null || true |
82 | | - @echo "Force cleaning any remaining resources with release name prefix..." |
83 | | - @for resource_type in deployment replicaset pod service configmap secret pvc role rolebinding serviceaccount networkpolicy poddisruptionbudget job cronjob ingress route; do \ |
84 | | - $(KUBECTL_CMD) get $$resource_type -n $(NAMESPACE) -o name 2>/dev/null | grep "$(RELEASE_NAME)" | xargs -r $(KUBECTL_CMD) delete -n $(NAMESPACE) --ignore-not-found=true 2>/dev/null || true; \ |
85 | | - done |
86 | | - @echo "Cleanup completed!" |
| 106 | + |
| 107 | +.PHONY: status |
| 108 | +status: ## Show deployment status |
| 109 | + @echo "📊 SAST AI Deployment Status" |
| 110 | + @echo "============================" |
| 111 | + @echo "" |
| 112 | + @echo "🔍 Development Environment ($(DEV_NAMESPACE)):" |
| 113 | + @helm status $(RELEASE_NAME)-dev -n $(DEV_NAMESPACE) 2>/dev/null || echo " ❌ Not deployed" |
| 114 | + @echo "" |
| 115 | + @echo "🔍 Production Environment ($(PROD_NAMESPACE)):" |
| 116 | + @helm status $(RELEASE_NAME)-prod -n $(PROD_NAMESPACE) 2>/dev/null || echo " ❌ Not deployed" |
87 | 117 |
|
88 | 118 | .PHONY: wait-pods |
89 | 119 | wait-pods: ## Wait for pods to be ready |
@@ -150,10 +180,19 @@ argocd: ## Deploy ArgoCD Application to current namespace |
150 | 180 |
|
151 | 181 | .PHONY: help |
152 | 182 | help: ## Show this help message |
153 | | - @echo "SAST AI Deployment Helper" |
| 183 | + @echo "SAST AI Deployment Commands" |
| 184 | + @echo "============================" |
| 185 | + @echo "" |
| 186 | + @echo "Environment-specific deployments:" |
| 187 | + @echo " deploy-dev Deploy to development environment (sast-ai-dev namespace)" |
| 188 | + @echo " deploy-prod Deploy to production environment (sast-ai-prod namespace)" |
| 189 | + @echo " upgrade-dev Upgrade development deployment" |
| 190 | + @echo " upgrade-prod Upgrade production deployment" |
| 191 | + @echo " clean-dev Remove development deployment" |
| 192 | + @echo " clean-prod Remove production deployment" |
154 | 193 | @echo "" |
155 | | - @echo " make deploy # Deploy and wait until ready (sast-ai-workflow)" |
156 | | - @echo " make upgrade # Upgrade and wait until ready" |
157 | | - @echo " make clean # Remove deployment" |
158 | | - @echo " make argocd # Deploy ArgoCD Application" |
| 194 | + @echo "Utility commands:" |
| 195 | + @echo " status Show deployment status for both environments" |
| 196 | + @echo " argocd Deploy ArgoCD Application" |
159 | 197 | @echo "" |
| 198 | + @awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " %-12s %s\n", $$1, $$2}' $(MAKEFILE_LIST) |
0 commit comments