Files
git.stella-ops.org/devops/scripts/validate-compose.sh

146 lines
3.5 KiB
Bash

#!/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!"