Skip to content

Commit f3fd61b

Browse files
authored
Merge pull request #92 from RHEcosystemAppEng/support-new-pipeline-setup
separate dev and prod env setup
2 parents 7080f32 + c779397 commit f3fd61b

File tree

9 files changed

+382
-110
lines changed

9 files changed

+382
-110
lines changed

.github/workflows/build-dev-image.yml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,7 @@ jobs:
5858
with:
5959
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
6060
tags: |
61-
type=raw,value=latest-dev,enable={{is_default_branch}}
62-
type=sha,prefix={{branch}}-
61+
type=raw,value=latest,enable={{is_default_branch}}
6362
6463
- name: Build and push Docker image
6564
id: build

.github/workflows/build-release-image.yml

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,8 @@ jobs:
8585
# Update pom.xml version (without 'v' prefix)
8686
./mvnw versions:set -DnewVersion=$POM_VERSION -DgenerateBackupPoms=false
8787
88-
# Update Helm values.yaml with full release tag (with 'v')
89-
sed -i "s/tag: \".*\"/tag: \"$RELEASE_TAG\"/" deploy/sast-ai-chart/values.yaml
88+
# Update Helm prod values.yaml with full release tag (with 'v')
89+
sed -i "s/tag: \".*\"/tag: \"$RELEASE_TAG\"/" deploy/sast-ai-chart/values-prod.yaml
9090
9191
# Update Helm Chart.yaml versions (without 'v' prefix) - be specific to avoid updating dependency versions
9292
sed -i "s/^version: .*/version: $POM_VERSION/" deploy/sast-ai-chart/Chart.yaml
@@ -95,16 +95,16 @@ jobs:
9595
# Verify the changes
9696
echo "Updated pom.xml version:"
9797
./mvnw help:evaluate -Dexpression=project.version -q -DforceStdout
98-
echo "Updated values.yaml:"
99-
grep -A 5 -B 5 "tag:" deploy/sast-ai-chart/values.yaml
98+
echo "Updated prod values.yaml:"
99+
grep -A 5 -B 5 "tag:" deploy/sast-ai-chart/values-prod.yaml
100100
echo "Updated Chart.yaml:"
101101
grep -E "(version|appVersion):" deploy/sast-ai-chart/Chart.yaml
102102
103103
- name: Commit version updates
104104
run: |
105105
git config --local user.email "[email protected]"
106106
git config --local user.name "GitHub Action"
107-
git add pom.xml deploy/sast-ai-chart/values.yaml deploy/sast-ai-chart/Chart.yaml
107+
git add pom.xml deploy/sast-ai-chart/values-prod.yaml deploy/sast-ai-chart/Chart.yaml
108108
if git diff --staged --quiet; then
109109
echo "No changes to commit"
110110
else
@@ -113,8 +113,8 @@ jobs:
113113
git checkout $DEFAULT_BRANCH
114114
git pull origin $DEFAULT_BRANCH
115115
# Re-add and commit the changes
116-
git add pom.xml deploy/sast-ai-chart/values.yaml deploy/sast-ai-chart/Chart.yaml
117-
git commit -m "Update versions to ${{ github.event.release.tag_name }}"
116+
git add pom.xml deploy/sast-ai-chart/values-prod.yaml deploy/sast-ai-chart/Chart.yaml
117+
git commit -m "Update production versions to ${{ github.event.release.tag_name }}"
118118
git push origin $DEFAULT_BRANCH
119119
fi
120120
@@ -134,23 +134,34 @@ jobs:
134134
135135
## 📦 Container Images
136136
137-
This release includes the following container images published to Quay.io:
137+
This release includes the following container image published to Quay.io:
138138
139139
- \`${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.event.release.tag_name }}\`
140-
- \`${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest\`
141140
142141
### 🐳 Usage
143142
144143
\`\`\`bash
145-
# Pull specific version
144+
# Pull specific version for production
146145
podman pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:${{ github.event.release.tag_name }}
147146
148-
# Pull latest
147+
# For development, use the latest tag
149148
podman pull ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}:latest
150149
\`\`\`
151150
152151
### 🔗 Registry
153152
View all versions: [Quay.io Repository](https://quay.io/repository/ecosystem-appeng/sast-ai-orchestrator)
153+
154+
### 🚀 Deployment
155+
156+
**Production Deployment (sast-ai-prod namespace):**
157+
\`\`\`bash
158+
make deploy-prod
159+
\`\`\`
160+
161+
**Development Deployment (sast-ai-dev namespace):**
162+
\`\`\`bash
163+
make deploy-dev
164+
\`\`\`
154165
`;
155166
156167
await github.rest.repos.updateRelease({

README.md

Lines changed: 56 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -385,16 +385,68 @@ MLOps batch endpoints enable automated testing of multiple NVRs (Name-Version-Re
385385

386386
## Deployment
387387

388+
### Environment Strategy
389+
390+
The project supports two deployment environments:
391+
392+
- **Development** (`sast-ai-dev` namespace):
393+
- Uses `latest` container images
394+
- Updated automatically on every main branch push
395+
- Debug logging and relaxed resource limits
396+
397+
- **Production** (`sast-ai-prod` namespace):
398+
- Uses release-tagged container images (e.g., `v1.0.1`)
399+
- Updated only on GitHub releases
400+
- Production-grade resource allocation and logging
401+
402+
### Quick Deployment
403+
404+
```bash
405+
# Development environment
406+
cd deploy
407+
make deploy-dev
408+
409+
# Production environment
410+
cd deploy
411+
make deploy-prod
412+
413+
# Check deployment status
414+
make status
415+
```
416+
417+
### Container Images
418+
419+
- **Development**: `quay.io/ecosystem-appeng/sast-ai-orchestrator:latest`
420+
- **Production**: `quay.io/ecosystem-appeng/sast-ai-orchestrator:v1.0.x`
421+
388422
### Docker Deployment
389423
```bash
390-
# JVM Mode (Fast startup)
391-
docker build -f src/main/docker/Dockerfile.jvm -t sast-ai-orchestrator:jvm .
424+
# Development (latest)
425+
docker run -p 8080:8080 quay.io/ecosystem-appeng/sast-ai-orchestrator:latest
426+
427+
# Production (specific version)
428+
docker run -p 8080:8080 quay.io/ecosystem-appeng/sast-ai-orchestrator:v1.0.1
392429
```
393430

394431
### Kubernetes Deployment
395432
- **Helm Chart**: See `deploy/sast-ai-chart/` for Helm deployment
396-
- **ArgoCD**: See `deploy/argocd/` for GitOps deployment
397-
- **Documentation**: Refer to `deploy/README.md` for detailed instructions
433+
- **ArgoCD**: See `deploy/argocd/` for GitOps deployment
434+
- **Documentation**: Use `make help` in the `deploy/` directory for available commands
435+
436+
### Environment-Specific Access
437+
438+
After deployment, access the applications via OpenShift routes:
439+
440+
```bash
441+
# Get the route URL for production
442+
kubectl get route sast-ai-orchestrator-prod -n sast-ai-prod
443+
444+
# Get the route URL for development
445+
kubectl get route sast-ai-orchestrator-dev -n sast-ai-dev
446+
447+
# Access the API directly via route
448+
curl https://<route-hostname>/api/v1/health
449+
```
398450

399451
## Configuration
400452

deploy/Makefile

Lines changed: 90 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,89 +1,119 @@
11
# Detect OpenShift vs Kubernetes
22
KUBECTL_CMD := $(shell command -v oc 2>/dev/null || echo kubectl)
33

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
59
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))
711

812
RELEASE_NAME ?= sast-ai-orchestrator
913
CHART_PATH ?= ./sast-ai-chart
1014
HELM_TIMEOUT ?= 300s
1115

1216
.DEFAULT_GOAL := help
1317

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"
1931
@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
2036
@helm repo add bitnami https://charts.bitnami.com/bitnami >/dev/null 2>&1 || true
2137
@helm repo update >/dev/null 2>&1
2238
@cd $(CHART_PATH) && helm dependency update
2339
@helm install $(RELEASE_NAME) $(CHART_PATH) \
2440
-f $(CHART_PATH)/values.yaml \
41+
-f $(CHART_PATH)/$(VALUES_FILE) \
2542
-n $(NAMESPACE) \
2643
--create-namespace \
2744
--timeout=$(HELM_TIMEOUT) \
2845
--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..."
3249
@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); \
3552
else \
36-
echo "ArgoCD not available in cluster, skipping ArgoCD Application creation."; \
53+
echo "⚠️ ArgoCD not available in cluster, skipping ArgoCD Application creation."; \
3754
fi
38-
@$(MAKE) show-access
55+
@$(MAKE) show-access NAMESPACE=$(NAMESPACE)
3956

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
4369
@helm repo add bitnami https://charts.bitnami.com/bitnami >/dev/null 2>&1 || true
4470
@helm repo update >/dev/null 2>&1
4571
@cd $(CHART_PATH) && helm dependency update
4672
@helm upgrade $(RELEASE_NAME) $(CHART_PATH) \
4773
-f $(CHART_PATH)/values.yaml \
74+
-f $(CHART_PATH)/$(VALUES_FILE) \
4875
-n $(NAMESPACE) \
4976
--timeout=$(HELM_TIMEOUT) \
5077
--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)
5380

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
5685

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
7493
@if helm list -n $(NAMESPACE) | grep -q "^$(RELEASE_NAME)"; then \
7594
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)"; \
77103
else \
78104
echo "Release '$(RELEASE_NAME)' not found in namespace '$(NAMESPACE)'"; \
79105
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"
87117

88118
.PHONY: wait-pods
89119
wait-pods: ## Wait for pods to be ready
@@ -150,10 +180,19 @@ argocd: ## Deploy ArgoCD Application to current namespace
150180

151181
.PHONY: help
152182
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"
154193
@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"
159197
@echo ""
198+
@awk 'BEGIN {FS = ":.*?## "} /^[a-zA-Z_-]+:.*?## / {printf " %-12s %s\n", $$1, $$2}' $(MAKEFILE_LIST)

deploy/argocd/application.yaml renamed to deploy/argocd/application-dev.yaml

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
apiVersion: argoproj.io/v1alpha1
22
kind: Application
33
metadata:
4-
name: sast-ai-orchestrator-syncer
5-
namespace: $NAMESPACE
4+
name: sast-ai-orchestrator-dev
5+
namespace: argocd
66
labels:
7-
app.kubernetes.io/name: sast-ai-orchestrator-syncer
7+
app.kubernetes.io/name: sast-ai-orchestrator-dev
88
app.kubernetes.io/part-of: sast-ai
9+
environment: development
910
finalizers:
1011
- resources-finalizer.argocd.argoproj.io/background
1112
spec:
@@ -15,15 +16,16 @@ spec:
1516
targetRevision: HEAD
1617
path: deploy/sast-ai-chart
1718
helm:
18-
releaseName: sast-ai-orchestrator
19+
releaseName: sast-ai-orchestrator-dev
1920
valueFiles:
2021
- values.yaml
22+
- values-dev.yaml
2123
parameters:
2224
- name: app.env.SAST_AI_WORKFLOW_NAMESPACE
23-
value: $NAMESPACE
25+
value: sast-ai-dev
2426
destination:
2527
server: https://kubernetes.default.svc
26-
namespace: $NAMESPACE
28+
namespace: sast-ai-dev
2729
syncPolicy:
2830
automated:
2931
prune: true
@@ -39,4 +41,4 @@ spec:
3941
duration: 5s
4042
factor: 2
4143
maxDuration: 3m
42-
revisionHistoryLimit: 10
44+
revisionHistoryLimit: 10

0 commit comments

Comments
 (0)