|
2 | 2 | # Supports building Spring Boot JAR and Native applications |
3 | 3 |
|
4 | 4 | # Project variables |
5 | | -PROJECT_NAME := devstack-api-service |
6 | | -VERSION := 0.0.2 |
| 5 | +PROJECT_NAME := opendevstack-api-service |
| 6 | +VERSION := 0.0.3 |
7 | 7 | JAVA_VERSION := 21 |
8 | 8 | MAIN_CLASS := org.opendevstack.apiservice.core.DevstackApiServiceApplication |
9 | 9 |
|
@@ -44,7 +44,8 @@ YELLOW := \033[1;33m |
44 | 44 | BLUE := \033[0;34m |
45 | 45 | NC := \033[0m # No Color |
46 | 46 |
|
47 | | -.PHONY: help clean compile test package jar native docker docker-native run-jar run-native run-docker run-docker-native install verify lint format check-java check-maven check-config |
| 47 | +.PHONY: help clean compile test package jar native docker docker-native run-jar run-native run-docker run-docker-native install verify lint format check-java check-maven check-config \ |
| 48 | + db-check-env db-validate db-status db-migrate db-rollback db-tag db-port-forward db-docker-build-db |
48 | 49 |
|
49 | 50 | # Default target |
50 | 51 | .DEFAULT_GOAL := help |
@@ -270,6 +271,144 @@ all: jar docker |
270 | 271 | ## Quick start for development |
271 | 272 | quick-start: jar run-jar |
272 | 273 |
|
| 274 | +# ============================================================================= |
| 275 | +# Database targets (Liquibase / PostgreSQL) |
| 276 | +# |
| 277 | +# Required environment variables (export them or source persistence/.env): |
| 278 | +# ODS_API_SERVICE_DB_HOST PostgreSQL hostname or IP |
| 279 | +# ODS_API_SERVICE_DB_PORT PostgreSQL port (default: 5432) |
| 280 | +# ODS_API_SERVICE_DB_NAME Database name (ods_api_service) |
| 281 | +# ODS_API_SERVICE_DB_USER Application user (ods_api_service) |
| 282 | +# ODS_API_SERVICE_DB_PASSWORD Application user password |
| 283 | +# |
| 284 | +# Quick start: |
| 285 | +# cp persistence/liquibase.properties.example persistence/.env |
| 286 | +# # edit persistence/.env with real values |
| 287 | +# source persistence/.env && make db-migrate |
| 288 | +# |
| 289 | +# Port-forward variables (can be overridden on the command line): |
| 290 | +# NAMESPACE Kubernetes/OpenShift namespace where PostgreSQL runs (REQUIRED) |
| 291 | +# DB_K8S_SERVICE Name of the PostgreSQL Service in the cluster (default: ods-api-service-postgresql) |
| 292 | +# DB_PF_LOCAL_PORT Local port to bind on the developer machine (default: 5432) |
| 293 | +# DB_PF_REMOTE_PORT PostgreSQL port exposed by the Service in-cluster (default: 5432) |
| 294 | +# |
| 295 | +# Example: |
| 296 | +# make db-port-forward NAMESPACE=ods-dev |
| 297 | +# make db-port-forward NAMESPACE=ods-prod DB_K8S_SERVICE=postgresql DB_PF_LOCAL_PORT=15432 |
| 298 | +# ============================================================================= |
| 299 | + |
| 300 | +# Build the JDBC URL from individual host/port/name parts. |
| 301 | +# ODS_API_SERVICE_DB_PORT defaults to 5432 when not set. |
| 302 | +DB_PORT ?= $(or $(ODS_API_SERVICE_DB_PORT),5432) |
| 303 | +DB_JDBC_URL = jdbc:postgresql://$(ODS_API_SERVICE_DB_HOST):$(DB_PORT)/$(ODS_API_SERVICE_DB_NAME) |
| 304 | + |
| 305 | +# Kubernetes port-forward defaults (all overridable on the command line) |
| 306 | +DB_K8S_SERVICE ?= ods-api-service-postgresql |
| 307 | +DB_PF_LOCAL_PORT ?= 5432 |
| 308 | +DB_PF_REMOTE_PORT ?= 5432 |
| 309 | + |
| 310 | +DB_MAVEN_ARGS = -pl persistence \ |
| 311 | + -Dliquibase.url=$(DB_JDBC_URL) \ |
| 312 | + -Dliquibase.username=$(ODS_API_SERVICE_DB_USER) \ |
| 313 | + -Dliquibase.password=$(ODS_API_SERVICE_DB_PASSWORD) |
| 314 | + |
| 315 | +## [DB] Verify required DB environment variables are set |
| 316 | +db-check-env: |
| 317 | + @missing=; \ |
| 318 | + for var in ODS_API_SERVICE_DB_HOST ODS_API_SERVICE_DB_NAME ODS_API_SERVICE_DB_USER ODS_API_SERVICE_DB_PASSWORD; do \ |
| 319 | + if [ -z "$$(eval echo \$$$$var)" ]; then missing="$$missing $$var"; fi; \ |
| 320 | + done; \ |
| 321 | + if [ -n "$$missing" ]; then \ |
| 322 | + echo "$(RED)Error: the following required environment variables are not set:$(NC)"; \ |
| 323 | + for v in $$missing; do echo " $$v"; done; \ |
| 324 | + echo ""; \ |
| 325 | + echo "$(YELLOW)Hint: copy persistence/liquibase.properties.example to persistence/.env,"; \ |
| 326 | + echo " fill in the values, then run: source persistence/.env$(NC)"; \ |
| 327 | + exit 1; \ |
| 328 | + fi |
| 329 | + @echo "$(GREEN)✓ DB environment variables OK$(NC)" |
| 330 | + |
| 331 | +## [DB] Validate the Liquibase changelog syntax (no DB connection required) |
| 332 | +db-validate: check-maven |
| 333 | + @echo "$(BLUE)Validating Liquibase changelog...$(NC)" |
| 334 | + $(MAVEN_WRAPPER) -pl persistence liquibase:validate |
| 335 | + @echo "$(GREEN)✓ Changelog validation complete$(NC)" |
| 336 | + |
| 337 | +## [DB] Show pending changesets that have not yet been applied |
| 338 | +db-status: db-check-env check-maven |
| 339 | + @echo "$(BLUE)Checking pending Liquibase changesets...$(NC)" |
| 340 | + @echo "$(YELLOW)Target: $(DB_JDBC_URL)$(NC)" |
| 341 | + $(MAVEN_WRAPPER) $(DB_MAVEN_ARGS) liquibase:status |
| 342 | + |
| 343 | +## [DB] Apply all pending changesets to the database |
| 344 | +db-migrate: db-check-env check-maven |
| 345 | + @echo "$(BLUE)Running Liquibase migrations...$(NC)" |
| 346 | + @echo "$(YELLOW)Target: $(DB_JDBC_URL)$(NC)" |
| 347 | + $(MAVEN_WRAPPER) $(DB_MAVEN_ARGS) liquibase:update |
| 348 | + @echo "$(GREEN)✓ Migrations applied$(NC)" |
| 349 | + |
| 350 | +## [DB] Roll back the last applied changeset (usage: make db-rollback) |
| 351 | +db-rollback: db-check-env check-maven |
| 352 | + @echo "$(YELLOW)Rolling back last changeset on: $(DB_JDBC_URL)$(NC)" |
| 353 | + $(MAVEN_WRAPPER) $(DB_MAVEN_ARGS) liquibase:rollback -Dliquibase.rollbackCount=1 |
| 354 | + @echo "$(GREEN)✓ Rollback complete$(NC)" |
| 355 | + |
| 356 | +## [DB] Tag the current database state (usage: make db-tag TAG=v1.0.0) |
| 357 | +db-tag: db-check-env check-maven |
| 358 | + @if [ -z "$(TAG)" ]; then \ |
| 359 | + echo "$(RED)Error: TAG is required. Usage: make db-tag TAG=v1.0.0$(NC)"; \ |
| 360 | + exit 1; \ |
| 361 | + fi |
| 362 | + @echo "$(BLUE)Tagging database state as '$(TAG)'...$(NC)" |
| 363 | + $(MAVEN_WRAPPER) $(DB_MAVEN_ARGS) liquibase:tag -Dliquibase.tag=$(TAG) |
| 364 | + @echo "$(GREEN)✓ Database tagged as '$(TAG)'$(NC)" |
| 365 | + |
| 366 | +## [DB] Port-forward the cluster PostgreSQL Service to localhost (usage: make db-port-forward NAMESPACE=<ns>) |
| 367 | +db-port-forward: |
| 368 | + @if [ -z "$(NAMESPACE)" ]; then \ |
| 369 | + echo "$(RED)Error: NAMESPACE is required.$(NC)"; \ |
| 370 | + echo "$(YELLOW)Usage: make db-port-forward NAMESPACE=<namespace>$(NC)"; \ |
| 371 | + echo "$(YELLOW)Optionally override DB_K8S_SERVICE (default: $(DB_K8S_SERVICE)),$(NC)"; \ |
| 372 | + echo "$(YELLOW) DB_PF_LOCAL_PORT (default: $(DB_PF_LOCAL_PORT)) or DB_PF_REMOTE_PORT (default: $(DB_PF_REMOTE_PORT)).$(NC)"; \ |
| 373 | + exit 1; \ |
| 374 | + fi |
| 375 | + @if ! command -v kubectl >/dev/null 2>&1; then \ |
| 376 | + echo "$(RED)Error: kubectl not found in PATH$(NC)"; \ |
| 377 | + exit 1; \ |
| 378 | + fi |
| 379 | + @echo "$(BLUE)Port-forwarding PostgreSQL service...$(NC)" |
| 380 | + @echo "$(YELLOW) Namespace : $(NAMESPACE)$(NC)" |
| 381 | + @echo "$(YELLOW) Service : $(DB_K8S_SERVICE)$(NC)" |
| 382 | + @echo "$(YELLOW) Mapping : localhost:$(DB_PF_LOCAL_PORT) → $(DB_K8S_SERVICE):$(DB_PF_REMOTE_PORT)$(NC)" |
| 383 | + @echo "" |
| 384 | + @echo "$(YELLOW)Once forwarding is active, connect with:$(NC)" |
| 385 | + @echo " psql -h localhost -p $(DB_PF_LOCAL_PORT) -U \$$ODS_API_SERVICE_DB_USER \$$ODS_API_SERVICE_DB_NAME" |
| 386 | + @echo " # or run migrations against the forwarded port:" |
| 387 | + @echo " ODS_API_SERVICE_DB_HOST=localhost ODS_API_SERVICE_DB_PORT=$(DB_PF_LOCAL_PORT) make db-migrate" |
| 388 | + @echo "" |
| 389 | + @echo "$(YELLOW)Press Ctrl+C to stop the tunnel$(NC)" |
| 390 | + kubectl port-forward \ |
| 391 | + --namespace $(NAMESPACE) \ |
| 392 | + service/$(DB_K8S_SERVICE) \ |
| 393 | + $(DB_PF_LOCAL_PORT):$(DB_PF_REMOTE_PORT) |
| 394 | + |
| 395 | +db-docker-build-db: |
| 396 | + @echo "$(BLUE)Building Docker image for database...$(NC)" |
| 397 | + @docker build --file ../ods-core/ods-api-service/docker/Dockerfile.database --tag $(PROJECT_NAME)-db:18 ../ods-core/ods-api-service/docker/ |
| 398 | + @echo "$(GREEN)✓ Database Docker image built: $(PROJECT_NAME)-db:$(DOCKER_TAG)$(NC)" |
| 399 | + |
| 400 | +db-docker-run-db: db-docker-build-db |
| 401 | + @echo "$(BLUE)Running PostgreSQL database in Docker...$(NC)" |
| 402 | + @echo "$(YELLOW)Access the database at: localhost:5432$(NC)" |
| 403 | + @echo "$(YELLOW)PostgreSQL credentials: user=ods_api_service, db=ods_api_service$(NC)" |
| 404 | + @echo "$(YELLOW)Press Ctrl+C to stop$(NC)" |
| 405 | + docker run -p 5432:5432 \ |
| 406 | + -e POSTGRES_USER=ods_api_service \ |
| 407 | + -e POSTGRES_PASSWORD=ods_api_service \ |
| 408 | + -e POSTGRES_DB=ods_api_service \ |
| 409 | + $(PROJECT_NAME)-db:18 |
| 410 | + |
| 411 | + |
273 | 412 | ## Clean everything including Docker images |
274 | 413 | clean-all: clean |
275 | 414 | @echo "$(BLUE)Cleaning Docker images...$(NC)" |
|
0 commit comments