|
1 | | -.PHONY: help setup build-all build-frontend build-backend build-operator build-runner build-state-sync build-public-api build-cli deploy clean check-architecture |
| 1 | +.PHONY: help setup build-all build-frontend build-backend build-operator build-runner build-state-sync build-public-api build-control-plane build-cli deploy clean check-architecture deploy-openshift |
2 | 2 | .PHONY: local-up local-down local-clean local-status local-rebuild local-reload-backend local-reload-frontend local-reload-operator local-reload-api-server local-sync-version |
3 | 3 | .PHONY: local-dev-token |
4 | 4 | .PHONY: local-logs local-logs-backend local-logs-frontend local-logs-operator local-shell local-shell-frontend |
@@ -65,6 +65,7 @@ RUNNER_IMAGE ?= vteam_claude_runner:$(IMAGE_TAG) |
65 | 65 | STATE_SYNC_IMAGE ?= vteam_state_sync:$(IMAGE_TAG) |
66 | 66 | PUBLIC_API_IMAGE ?= vteam_public_api:$(IMAGE_TAG) |
67 | 67 | API_SERVER_IMAGE ?= vteam_api_server:$(IMAGE_TAG) |
| 68 | +CONTROL_PLANE_IMAGE ?= ambient_control_plane:$(IMAGE_TAG) |
68 | 69 |
|
69 | 70 | # Podman prefixes image names with localhost/ — kind load needs to use the same |
70 | 71 | # name so containerd can match the image reference used in the deployment spec |
@@ -100,6 +101,7 @@ KIND_HOST ?= |
100 | 101 | # Vertex AI Configuration (for LOCAL_VERTEX=true) |
101 | 102 | # These inherit from environment if set, or can be overridden on command line |
102 | 103 | LOCAL_IMAGES ?= false |
| 104 | +LOCAL_RUNNER ?= false |
103 | 105 | LOCAL_VERTEX ?= false |
104 | 106 | ANTHROPIC_VERTEX_PROJECT_ID ?= $(shell echo $$ANTHROPIC_VERTEX_PROJECT_ID) |
105 | 107 | CLOUD_ML_REGION ?= $(shell echo $$CLOUD_ML_REGION) |
@@ -160,7 +162,7 @@ help: ## Display this help message |
160 | 162 |
|
161 | 163 | ##@ Building |
162 | 164 |
|
163 | | -build-all: build-frontend build-backend build-operator build-runner build-state-sync build-public-api build-api-server ## Build all container images |
| 165 | +build-all: build-frontend build-backend build-operator build-runner build-state-sync build-public-api build-api-server build-control-plane ## Build all container images |
164 | 166 |
|
165 | 167 | build-frontend: ## Build frontend image |
166 | 168 | @echo "$(COLOR_BLUE)▶$(COLOR_RESET) Building frontend with $(CONTAINER_ENGINE)..." |
@@ -204,6 +206,14 @@ build-api-server: ## Build ambient API server image |
204 | 206 | -t $(API_SERVER_IMAGE) . |
205 | 207 | @echo "$(COLOR_GREEN)✓$(COLOR_RESET) API server built: $(API_SERVER_IMAGE)" |
206 | 208 |
|
| 209 | +build-control-plane: ## Build ambient-control-plane image |
| 210 | + @echo "$(COLOR_BLUE)▶$(COLOR_RESET) Building ambient-control-plane with $(CONTAINER_ENGINE)..." |
| 211 | + @$(CONTAINER_ENGINE) build $(PLATFORM_FLAG) $(BUILD_FLAGS) \ |
| 212 | + -t $(CONTROL_PLANE_IMAGE) \ |
| 213 | + -f components/ambient-control-plane/Dockerfile \ |
| 214 | + components/ |
| 215 | + @echo "$(COLOR_GREEN)✓$(COLOR_RESET) Control plane built: $(CONTROL_PLANE_IMAGE)" |
| 216 | + |
207 | 217 | build-cli: ## Build acpctl CLI binary |
208 | 218 | @echo "$(COLOR_BLUE)▶$(COLOR_RESET) Building acpctl CLI..." |
209 | 219 | @cd components/ambient-cli && make build |
@@ -248,13 +258,56 @@ registry-login: ## Login to container registry |
248 | 258 |
|
249 | 259 | push-all: registry-login ## Push all images to registry |
250 | 260 | @echo "$(COLOR_BLUE)▶$(COLOR_RESET) Pushing images to $(REGISTRY)..." |
251 | | - @for image in $(FRONTEND_IMAGE) $(BACKEND_IMAGE) $(OPERATOR_IMAGE) $(RUNNER_IMAGE) $(STATE_SYNC_IMAGE) $(PUBLIC_API_IMAGE) $(API_SERVER_IMAGE); do \ |
| 261 | + @for image in $(FRONTEND_IMAGE) $(BACKEND_IMAGE) $(OPERATOR_IMAGE) $(RUNNER_IMAGE) $(STATE_SYNC_IMAGE) $(PUBLIC_API_IMAGE) $(API_SERVER_IMAGE) $(CONTROL_PLANE_IMAGE); do \ |
252 | 262 | echo " Tagging and pushing $$image..."; \ |
253 | 263 | $(CONTAINER_ENGINE) tag $$image $(REGISTRY)/$$image && \ |
254 | 264 | $(CONTAINER_ENGINE) push $(REGISTRY)/$$image; \ |
255 | 265 | done |
256 | 266 | @echo "$(COLOR_GREEN)✓$(COLOR_RESET) All images pushed" |
257 | 267 |
|
| 268 | +deploy-openshift: ## Deploy to OpenShift cluster. Use LOCAL_RUNNER=true to build+push runner from source to internal registry. |
| 269 | + @echo "$(COLOR_BOLD)Deploying to OpenShift cluster$(COLOR_RESET)" |
| 270 | + @oc whoami >/dev/null 2>&1 || (echo "$(COLOR_RED)✗$(COLOR_RESET) Not logged in to OpenShift. Run: oc login" && exit 1) |
| 271 | + @command -v ocm >/dev/null 2>&1 || (echo "$(COLOR_RED)✗$(COLOR_RESET) ocm CLI not found. Install from https://console.redhat.com/openshift/downloads and run: ocm login" && exit 1) |
| 272 | + @ocm token >/dev/null 2>&1 || (echo "$(COLOR_RED)✗$(COLOR_RESET) ocm token unavailable. Run: ocm login" && exit 1) |
| 273 | + @REGISTRY_HOST=$$(oc get route default-route -n openshift-image-registry --template='{{ .spec.host }}' 2>/dev/null) && \ |
| 274 | + INTERNAL_REG="image-registry.openshift-image-registry.svc:5000/ambient-code" && \ |
| 275 | + INTERNAL_RUNNER="$$INTERNAL_REG/vteam_claude_runner:latest" && \ |
| 276 | + echo "$(COLOR_BLUE)▶$(COLOR_RESET) Registry: $$REGISTRY_HOST" && \ |
| 277 | + oc whoami -t | $(CONTAINER_ENGINE) login --tls-verify=false -u kubeadmin --password-stdin "$$REGISTRY_HOST" && \ |
| 278 | + echo "$(COLOR_BLUE)▶$(COLOR_RESET) Building and pushing control plane..." && \ |
| 279 | + $(MAKE) --no-print-directory build-control-plane && \ |
| 280 | + $(CONTAINER_ENGINE) tag $(CONTROL_PLANE_IMAGE) $$REGISTRY_HOST/ambient-code/$(CONTROL_PLANE_IMAGE) && \ |
| 281 | + $(CONTAINER_ENGINE) push --tls-verify=false $$REGISTRY_HOST/ambient-code/$(CONTROL_PLANE_IMAGE) && \ |
| 282 | + echo "$(COLOR_GREEN)✓$(COLOR_RESET) Pushed $(CONTROL_PLANE_IMAGE)" && \ |
| 283 | + if [ "$(LOCAL_RUNNER)" = "true" ]; then \ |
| 284 | + echo "$(COLOR_BLUE)▶$(COLOR_RESET) LOCAL_RUNNER=true: building and pushing runner from source..." && \ |
| 285 | + $(MAKE) --no-print-directory build-runner && \ |
| 286 | + $(CONTAINER_ENGINE) tag $(RUNNER_IMAGE) $$REGISTRY_HOST/ambient-code/$(RUNNER_IMAGE) && \ |
| 287 | + $(CONTAINER_ENGINE) push --tls-verify=false $$REGISTRY_HOST/ambient-code/$(RUNNER_IMAGE) && \ |
| 288 | + echo "$(COLOR_GREEN)✓$(COLOR_RESET) Pushed $(RUNNER_IMAGE)"; \ |
| 289 | + else \ |
| 290 | + echo "$(COLOR_BLUE)▶$(COLOR_RESET) Using quay.io runner image (pass LOCAL_RUNNER=true to build from source)"; \ |
| 291 | + INTERNAL_RUNNER="quay.io/ambient_code/vteam_claude_runner:latest"; \ |
| 292 | + fi && \ |
| 293 | + echo "$(COLOR_BLUE)▶$(COLOR_RESET) Applying production manifests..." && \ |
| 294 | + kubectl kustomize components/manifests/overlays/production/ | kubectl apply --validate=false -f - && \ |
| 295 | + echo "$(COLOR_BLUE)▶$(COLOR_RESET) Patching runner image to: $$INTERNAL_RUNNER" && \ |
| 296 | + kubectl set env deployment/ambient-control-plane -n ambient-code RUNNER_IMAGE="$$INTERNAL_RUNNER" && \ |
| 297 | + REGISTRY_JSON=$$(oc get configmap ambient-agent-registry -n ambient-code -o jsonpath='{.data.agent-registry\.json}') && \ |
| 298 | + UPDATED_JSON=$$(echo "$$REGISTRY_JSON" | sed "s|quay\.io/ambient_code/vteam_claude_runner:[^\"]*|$$INTERNAL_RUNNER|g") && \ |
| 299 | + kubectl patch configmap ambient-agent-registry -n ambient-code --type=merge \ |
| 300 | + -p "{\"data\":{\"agent-registry.json\":$$(echo "$$UPDATED_JSON" | python3 -c 'import sys,json; print(json.dumps(sys.stdin.read()))')}}" && \ |
| 301 | + echo "$(COLOR_GREEN)✓$(COLOR_RESET) Agent registry updated" && \ |
| 302 | + echo "$(COLOR_BLUE)▶$(COLOR_RESET) Provisioning control plane RH SSO token..." && \ |
| 303 | + oc delete secret ambient-control-plane-token -n ambient-code 2>/dev/null || true && \ |
| 304 | + oc create secret generic ambient-control-plane-token -n ambient-code \ |
| 305 | + --from-literal=token="$$(ocm token)" && \ |
| 306 | + echo "$(COLOR_BLUE)▶$(COLOR_RESET) Restarting control-plane deployment..." && \ |
| 307 | + oc rollout restart deployment/ambient-control-plane -n ambient-code && \ |
| 308 | + oc rollout status deployment/ambient-control-plane -n ambient-code --timeout=120s && \ |
| 309 | + echo "$(COLOR_GREEN)✓$(COLOR_RESET) OpenShift deployment complete" |
| 310 | + |
258 | 311 | ##@ MinIO S3 Storage |
259 | 312 |
|
260 | 313 | setup-minio: ## Set up MinIO and create initial bucket |
@@ -948,7 +1001,7 @@ check-architecture: ## Validate build architecture matches host |
948 | 1001 |
|
949 | 1002 | _kind-load-images: ## Internal: Load images into kind cluster |
950 | 1003 | @echo "$(COLOR_BLUE)▶$(COLOR_RESET) Loading images into kind ($(KIND_CLUSTER_NAME))..." |
951 | | - @for img in $(BACKEND_IMAGE) $(FRONTEND_IMAGE) $(OPERATOR_IMAGE) $(RUNNER_IMAGE) $(STATE_SYNC_IMAGE) $(PUBLIC_API_IMAGE) $(API_SERVER_IMAGE); do \ |
| 1004 | + @for img in $(BACKEND_IMAGE) $(FRONTEND_IMAGE) $(OPERATOR_IMAGE) $(RUNNER_IMAGE) $(STATE_SYNC_IMAGE) $(PUBLIC_API_IMAGE) $(API_SERVER_IMAGE) $(CONTROL_PLANE_IMAGE); do \ |
952 | 1005 | echo " Loading $(KIND_IMAGE_PREFIX)$$img..."; \ |
953 | 1006 | if [ -n "$(KIND_HOST)" ] || [ "$(CONTAINER_ENGINE)" = "podman" ]; then \ |
954 | 1007 | $(CONTAINER_ENGINE) save $(KIND_IMAGE_PREFIX)$$img | \ |
|
0 commit comments