146 lines
3.5 KiB
Bash
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!"
|