meldestelle/scripts/docker-versions-update.sh
2025-09-15 11:08:55 +02:00

322 lines
10 KiB
Bash
Executable File

#!/bin/bash
# ===================================================================
# Docker Versions Update Utility
# Updates central docker/versions.toml and syncs to environment files
# ===================================================================
set -e
# Script directory and project root
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
PROJECT_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
DOCKER_DIR="$PROJECT_ROOT/docker"
VERSIONS_TOML="$DOCKER_DIR/versions.toml"
BUILD_ARGS_DIR="$DOCKER_DIR/build-args"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Function to print colored output
print_info() {
echo -e "${BLUE}[INFO]${NC} $1"
}
print_success() {
echo -e "${GREEN}[SUCCESS]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Function to extract version from TOML file
get_version() {
local key=$1
grep "^$key = " "$VERSIONS_TOML" | sed 's/.*= "\(.*\)"/\1/' || echo ""
}
# Function to update version in TOML file
update_version() {
local key=$1
local new_value=$2
if grep -q "^$key = " "$VERSIONS_TOML"; then
# Update existing key
sed -i.bak "s/^$key = .*/$key = \"$new_value\"/" "$VERSIONS_TOML"
print_success "Updated $key to $new_value"
else
print_error "Key $key not found in $VERSIONS_TOML"
return 1
fi
}
# Function to sync TOML to environment files
sync_to_env_files() {
print_info "Syncing versions.toml to environment files..."
# Get current versions from TOML
# shellcheck disable=SC2155
local gradle_version=$(get_version "gradle")
# shellcheck disable=SC2155
local java_version=$(get_version "java")
# shellcheck disable=SC2155
local node_version=$(get_version "node")
# shellcheck disable=SC2155
local nginx_version=$(get_version "nginx")
# shellcheck disable=SC2155
local app_version=$(get_version "app-version")
# shellcheck disable=SC2155
local spring_default=$(get_version "spring-profiles-default")
# shellcheck disable=SC2155
local spring_docker=$(get_version "spring-profiles-docker")
# shellcheck disable=SC2155
local alpine_version=$(get_version "alpine")
local prometheus_version=$(get_version "prometheus")
local grafana_version=$(get_version "grafana")
local keycloak_version=$(get_version "keycloak")
# Update global.env
cat > "$BUILD_ARGS_DIR/global.env" << EOF
# ===================================================================
# Global Docker Build Arguments - Used by all categories
# Source: docker/versions.toml
# Last updated: $(date -u +'%Y-%m-%d %H:%M:%S UTC')
# ===================================================================
# --- Build Tools ---
GRADLE_VERSION=$gradle_version
JAVA_VERSION=$java_version
# --- Build Metadata ---
BUILD_DATE=\$(date -u +'%Y-%m-%dT%H:%M:%SZ')
VERSION=$app_version
# --- Common Base Images ---
ALPINE_VERSION=$alpine_version
ECLIPSE_TEMURIN_JDK_VERSION=$java_version-jdk-alpine
ECLIPSE_TEMURIN_JRE_VERSION=$java_version-jre-alpine
# --- Monitoring & Infrastructure Services ---
DOCKER_PROMETHEUS_VERSION=$prometheus_version
DOCKER_GRAFANA_VERSION=$grafana_version
DOCKER_KEYCLOAK_VERSION=$keycloak_version
EOF
print_success "Updated global.env"
# Update clients.env
cat > "$BUILD_ARGS_DIR/clients.env" << EOF
# ===================================================================
# Clients Docker Build Arguments - dockerfiles/clients/*
# Source: docker/versions.toml [categories.clients]
# Last updated: $(date -u +'%Y-%m-%d %H:%M:%S UTC')
# ===================================================================
# --- Include Global Arguments ---
# Source global.env for GRADLE_VERSION, JAVA_VERSION, BUILD_DATE, VERSION
# --- Client-Specific Build Tools ---
NODE_VERSION=$node_version
NGINX_VERSION=$nginx_version
# --- Client Build Configuration ---
CLIENT_PATH=client
CLIENT_MODULE=client
CLIENT_NAME=meldestelle-client
# --- Web Application Specific ---
WEB_APP_PORT=4000
WEB_APP_BUILD_TARGET=wasmJsBrowserDistribution
# --- Desktop Application Specific ---
DESKTOP_APP_VNC_PORT=5901
DESKTOP_APP_NOVNC_PORT=6080
DESKTOP_APP_BUILD_TARGET=composeDesktop
# --- Client Environment ---
NODE_ENV=production
APP_TITLE=Meldestelle
APP_VERSION=$app_version
# --- Development Configuration ---
WEBPACK_DEV_SERVER_HOST=0.0.0.0
WEBPACK_DEV_SERVER_PORT=4000
EOF
print_success "Updated clients.env"
# Update services.env
cat > "$BUILD_ARGS_DIR/services.env" << EOF
# ===================================================================
# Services Docker Build Arguments - dockerfiles/services/*
# Source: docker/versions.toml [categories.services]
# Last updated: $(date -u +'%Y-%m-%d %H:%M:%S UTC')
# ===================================================================
# --- Include Global Arguments ---
# Source global.env for GRADLE_VERSION, JAVA_VERSION, BUILD_DATE, VERSION
# --- Spring Boot Services Configuration ---
SPRING_PROFILES_ACTIVE=$spring_docker
# --- Service-Specific Arguments ---
SERVICE_PATH=.
SERVICE_NAME=spring-boot-service
SERVICE_PORT=8080
# --- Service Port Mapping (matches gradle.properties) ---
PING_SERVICE_PORT=8082
MEMBERS_SERVICE_PORT=8083
HORSES_SERVICE_PORT=8084
EVENTS_SERVICE_PORT=8085
MASTERDATA_SERVICE_PORT=8086
# --- Services List (for automation scripts) ---
# ping-service, members-service, horses-service, events-service, masterdata-service
EOF
print_success "Updated services.env"
# Update infrastructure.env
cat > "$BUILD_ARGS_DIR/infrastructure.env" << EOF
# ===================================================================
# Infrastructure Docker Build Arguments - dockerfiles/infrastructure/*
# Source: docker/versions.toml [categories.infrastructure]
# Last updated: $(date -u +'%Y-%m-%d %H:%M:%S UTC')
# ===================================================================
# --- Include Global Arguments ---
# Source global.env for GRADLE_VERSION, JAVA_VERSION, BUILD_DATE, VERSION
# --- Infrastructure Services Configuration ---
SPRING_PROFILES_ACTIVE=$spring_default
# --- Infrastructure Service Ports (matches gradle.properties) ---
GATEWAY_PORT=8081
AUTH_SERVER_PORT=8087
MONITORING_SERVER_PORT=8088
# --- API Gateway Specific ---
GATEWAY_SERVICE_PATH=infrastructure/gateway
GATEWAY_SERVICE_NAME=api-gateway
# --- Auth Server Specific ---
AUTH_SERVER_PATH=infrastructure/auth/auth-server
AUTH_SERVER_SERVICE_NAME=auth-server
# --- Monitoring Server Specific ---
MONITORING_SERVER_PATH=infrastructure/monitoring/monitoring-server
MONITORING_SERVER_SERVICE_NAME=monitoring-server
# --- Infrastructure Dependencies ---
CONSUL_ENABLED=true
CONSUL_HOST=consul
CONSUL_PORT=8500
# --- Database Configuration for Infrastructure Services ---
DB_HOST=postgres
DB_PORT=5432
DB_NAME=meldestelle
EOF
print_success "Updated infrastructure.env"
print_success "All environment files synced successfully!"
}
# Function to show current versions
show_current_versions() {
print_info "Current Docker versions:"
echo " Gradle: $(get_version "gradle")"
echo " Java: $(get_version "java")"
echo " Node.js: $(get_version "node")"
echo " Nginx: $(get_version "nginx")"
echo " Alpine: $(get_version "alpine")"
echo " Prometheus: $(get_version "prometheus")"
echo " Grafana: $(get_version "grafana")"
echo " Keycloak: $(get_version "keycloak")"
echo " App Version: $(get_version "app-version")"
echo " Spring Profile (Default): $(get_version "spring-profiles-default")"
echo " Spring Profile (Docker): $(get_version "spring-profiles-docker")"
}
# Function to show help
show_help() {
echo "Docker Versions Update Utility"
echo ""
echo "Usage: $0 [COMMAND] [OPTIONS]"
echo ""
echo "Commands:"
echo " show Show current versions"
echo " sync Sync versions.toml to environment files"
echo " update <key> <version> Update specific version"
echo ""
echo "Available keys for update:"
echo " gradle Gradle version"
echo " java Java version"
echo " node Node.js version"
echo " nginx Nginx version"
echo " alpine Alpine Linux version"
echo " prometheus Prometheus version"
echo " grafana Grafana version"
echo " keycloak Keycloak version"
echo " app-version Application version"
echo " spring-profiles-default Default Spring profile"
echo " spring-profiles-docker Docker Spring profile"
echo ""
echo "Examples:"
echo " $0 show # Show current versions"
echo " $0 update gradle 9.1.0 # Update Gradle to 9.1.0"
echo " $0 update java 22 # Update Java to version 22"
echo " $0 sync # Sync versions to environment files"
echo ""
echo "After updating versions, run 'sync' to update environment files"
echo "or use scripts/docker-build.sh to build with new versions."
}
# Main execution
main() {
# Check if versions.toml exists
if [[ ! -f "$VERSIONS_TOML" ]]; then
print_error "Versions file not found: $VERSIONS_TOML"
exit 1
fi
case $1 in
"show")
show_current_versions
;;
"sync")
sync_to_env_files
;;
"update")
if [[ $# -lt 3 ]]; then
print_error "Usage: $0 update <key> <version>"
exit 1
fi
update_version "$2" "$3"
sync_to_env_files
;;
"-h"|"--help"|"help")
show_help
;;
"")
print_error "No command specified"
show_help
exit 1
;;
*)
print_error "Unknown command: $1"
show_help
exit 1
;;
esac
}
# Run main function with all arguments
main "$@"