#!/bin/bash # validate-compose.sh - Validate all Docker Compose profiles # Sprint: SPRINT_20251226_006_CICD # # Usage: # ./devops/scripts/validate-compose.sh # Validate all profiles # ./devops/scripts/validate-compose.sh dev stage # Validate specific profiles set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" REPO_ROOT="$(cd "$SCRIPT_DIR/../.." && pwd)" COMPOSE_DIR="$REPO_ROOT/devops/compose" # Default profiles to validate DEFAULT_PROFILES=( dev stage prod airgap mirror crypto-fips crypto-gost monitoring ) echo "=== Docker Compose Profile Validation ===" echo "Compose directory: $COMPOSE_DIR" # Check if docker compose is available if ! command -v docker &>/dev/null; then echo "Error: Docker is not installed" exit 1 fi # Check compose directory exists if [[ ! -d "$COMPOSE_DIR" ]]; then echo "Error: Compose directory not found: $COMPOSE_DIR" exit 1 fi # Determine profiles to validate if [[ $# -gt 0 ]]; then PROFILES=("$@") else PROFILES=("${DEFAULT_PROFILES[@]}") fi FAILED=0 PASSED=0 SKIPPED=0 # Validate base compose file first BASE_COMPOSE="$COMPOSE_DIR/docker-compose.yml" if [[ -f "$BASE_COMPOSE" ]]; then echo "" echo "=== Validating base: docker-compose.yml ===" if docker compose -f "$BASE_COMPOSE" config --quiet 2>/dev/null; then echo " [PASS] docker-compose.yml" ((PASSED++)) else echo " [FAIL] docker-compose.yml" docker compose -f "$BASE_COMPOSE" config 2>&1 | head -20 ((FAILED++)) fi else echo "" echo "Warning: Base compose file not found: $BASE_COMPOSE" fi # Validate each profile for profile in "${PROFILES[@]}"; do # Check for both .yml and .yaml extensions PROFILE_FILE="$COMPOSE_DIR/docker-compose.${profile}.yaml" if [[ ! -f "$PROFILE_FILE" ]]; then PROFILE_FILE="$COMPOSE_DIR/docker-compose.${profile}.yml" fi echo "" echo "=== Validating profile: $profile ===" if [[ ! -f "$PROFILE_FILE" ]]; then echo " [SKIP] Profile file not found: docker-compose.${profile}.yml" ((SKIPPED++)) continue fi # Validate profile alone if docker compose -f "$PROFILE_FILE" config --quiet 2>/dev/null; then echo " [PASS] docker-compose.${profile}.yml (standalone)" else echo " [FAIL] docker-compose.${profile}.yml (standalone)" docker compose -f "$PROFILE_FILE" config 2>&1 | head -10 ((FAILED++)) continue fi # Validate profile with base if [[ -f "$BASE_COMPOSE" ]]; then if docker compose -f "$BASE_COMPOSE" -f "$PROFILE_FILE" config --quiet 2>/dev/null; then echo " [PASS] docker-compose.yml + docker-compose.${profile}.yml (merged)" ((PASSED++)) else echo " [FAIL] Merged validation failed" docker compose -f "$BASE_COMPOSE" -f "$PROFILE_FILE" config 2>&1 | head -10 ((FAILED++)) fi fi done # Validate Helm chart if present HELM_DIR="$REPO_ROOT/devops/helm/stellaops" if [[ -d "$HELM_DIR" ]]; then echo "" echo "=== Validating Helm chart ===" if command -v helm &>/dev/null; then if helm lint "$HELM_DIR" --quiet 2>/dev/null; then echo " [PASS] Helm chart: stellaops" ((PASSED++)) else echo " [FAIL] Helm chart: stellaops" helm lint "$HELM_DIR" 2>&1 | head -20 ((FAILED++)) fi else echo " [SKIP] Helm not installed" ((SKIPPED++)) fi fi # Summary echo "" echo "=== Validation Summary ===" echo " Passed: $PASSED" echo " Failed: $FAILED" echo " Skipped: $SKIPPED" if [[ $FAILED -gt 0 ]]; then echo "" echo "ERROR: $FAILED validation(s) failed" exit 1 fi echo "" echo "All validations passed!"