
Some checks failed
CI/CD Pipeline / Test Suite (push) Has been cancelled
CI/CD Pipeline / Security Audit (push) Has been cancelled
CI/CD Pipeline / Build Docker Image (push) Has been cancelled
CI/CD Pipeline / Deploy to Staging (push) Has been cancelled
CI/CD Pipeline / Deploy to Production (push) Has been cancelled
CI/CD Pipeline / Performance Benchmarks (push) Has been cancelled
CI/CD Pipeline / Cleanup (push) Has been cancelled
332 lines
9.1 KiB
Bash
Executable File
332 lines
9.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Configuration Builder Script
|
|
# Combines base configurations and feature configurations into a complete config.toml
|
|
# Usage: ./build-config.sh [environment] [output_file]
|
|
# Example: ./build-config.sh dev config.toml
|
|
|
|
set -e
|
|
|
|
# Default values
|
|
ENVIRONMENT="${1:-dev}"
|
|
OUTPUT_FILE="${2:-config.toml}"
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
CONFIG_DIR="$(dirname "$SCRIPT_DIR")"
|
|
PROJECT_ROOT="$(dirname "$CONFIG_DIR")"
|
|
|
|
# Colors for output
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Logging functions
|
|
log_info() {
|
|
echo -e "${BLUE}[INFO]${NC} $1"
|
|
}
|
|
|
|
log_success() {
|
|
echo -e "${GREEN}[SUCCESS]${NC} $1"
|
|
}
|
|
|
|
log_warning() {
|
|
echo -e "${YELLOW}[WARNING]${NC} $1"
|
|
}
|
|
|
|
log_error() {
|
|
echo -e "${RED}[ERROR]${NC} $1"
|
|
}
|
|
|
|
# Check if environment is valid
|
|
check_environment() {
|
|
local env="$1"
|
|
case "$env" in
|
|
dev|prod|example)
|
|
return 0
|
|
;;
|
|
*)
|
|
log_error "Invalid environment: $env"
|
|
log_error "Valid environments: dev, prod, example"
|
|
exit 1
|
|
;;
|
|
esac
|
|
}
|
|
|
|
# Check if required tools are installed
|
|
check_dependencies() {
|
|
local missing_tools=()
|
|
|
|
if ! command -v toml &> /dev/null; then
|
|
missing_tools+=("toml")
|
|
fi
|
|
|
|
if [ ${#missing_tools[@]} -ne 0 ]; then
|
|
log_warning "Missing optional tools: ${missing_tools[*]}"
|
|
log_warning "For better TOML validation, install: cargo install toml-cli"
|
|
fi
|
|
}
|
|
|
|
# Create temporary directory for processing
|
|
create_temp_dir() {
|
|
TEMP_DIR=$(mktemp -d)
|
|
trap "rm -rf $TEMP_DIR" EXIT
|
|
log_info "Created temporary directory: $TEMP_DIR"
|
|
}
|
|
|
|
# Copy base configuration
|
|
copy_base_config() {
|
|
local env="$1"
|
|
local base_file="$CONFIG_DIR/base/${env}.toml"
|
|
|
|
if [ -f "$base_file" ]; then
|
|
log_info "Copying base configuration: $base_file"
|
|
cp "$base_file" "$TEMP_DIR/base.toml"
|
|
else
|
|
log_error "Base configuration not found: $base_file"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
# Find and copy feature configurations
|
|
copy_feature_configs() {
|
|
local env="$1"
|
|
local features_dir="$CONFIG_DIR/features"
|
|
|
|
if [ ! -d "$features_dir" ]; then
|
|
log_error "Features directory not found: $features_dir"
|
|
exit 1
|
|
fi
|
|
|
|
log_info "Copying feature configurations for environment: $env"
|
|
|
|
# Create features directory in temp
|
|
mkdir -p "$TEMP_DIR/features"
|
|
|
|
# Find all feature directories
|
|
for feature_dir in "$features_dir"/*; do
|
|
if [ -d "$feature_dir" ]; then
|
|
local feature_name=$(basename "$feature_dir")
|
|
local feature_file="$feature_dir/${env}.toml"
|
|
|
|
if [ -f "$feature_file" ]; then
|
|
log_info " Found feature: $feature_name"
|
|
cp "$feature_file" "$TEMP_DIR/features/${feature_name}.toml"
|
|
else
|
|
log_warning " Feature configuration not found: $feature_file"
|
|
fi
|
|
fi
|
|
done
|
|
}
|
|
|
|
# Merge configurations using a simple approach
|
|
merge_configs() {
|
|
local output="$1"
|
|
|
|
log_info "Merging configurations..."
|
|
|
|
# Start with base configuration
|
|
cat "$TEMP_DIR/base.toml" > "$output"
|
|
|
|
# Add a separator comment
|
|
echo "" >> "$output"
|
|
echo "# =================================" >> "$output"
|
|
echo "# Feature Configurations" >> "$output"
|
|
echo "# =================================" >> "$output"
|
|
echo "" >> "$output"
|
|
|
|
# Append each feature configuration
|
|
for feature_file in "$TEMP_DIR/features"/*.toml; do
|
|
if [ -f "$feature_file" ]; then
|
|
local feature_name=$(basename "$feature_file" .toml)
|
|
echo "" >> "$output"
|
|
echo "# ${feature_name} Feature Configuration" >> "$output"
|
|
echo "# =================================" >> "$output"
|
|
cat "$feature_file" >> "$output"
|
|
echo "" >> "$output"
|
|
fi
|
|
done
|
|
|
|
# Add build information
|
|
echo "" >> "$output"
|
|
echo "# Build Information" >> "$output"
|
|
echo "# =================================" >> "$output"
|
|
echo "[build_info]" >> "$output"
|
|
echo "environment = \"$ENVIRONMENT\"" >> "$output"
|
|
echo "build_time = \"$(date -u +%Y-%m-%dT%H:%M:%SZ)\"" >> "$output"
|
|
echo "build_script = \"$(basename "$0")\"" >> "$output"
|
|
echo "config_version = \"1.0.0\"" >> "$output"
|
|
}
|
|
|
|
# Validate the generated configuration
|
|
validate_config() {
|
|
local config_file="$1"
|
|
|
|
log_info "Validating configuration..."
|
|
|
|
# Basic validation - check if file exists and is not empty
|
|
if [ ! -f "$config_file" ]; then
|
|
log_error "Configuration file not found: $config_file"
|
|
return 1
|
|
fi
|
|
|
|
if [ ! -s "$config_file" ]; then
|
|
log_error "Configuration file is empty: $config_file"
|
|
return 1
|
|
fi
|
|
|
|
# Advanced validation with toml tool if available
|
|
if command -v toml &> /dev/null; then
|
|
if toml get "$config_file" > /dev/null 2>&1; then
|
|
log_success "TOML syntax validation passed"
|
|
else
|
|
log_error "TOML syntax validation failed"
|
|
return 1
|
|
fi
|
|
else
|
|
log_warning "TOML validation tool not available, skipping syntax check"
|
|
fi
|
|
|
|
# Check for required sections
|
|
local required_sections=("server" "database" "app")
|
|
for section in "${required_sections[@]}"; do
|
|
if grep -q "^\[${section}\]" "$config_file"; then
|
|
log_info " Required section found: [$section]"
|
|
else
|
|
log_warning " Required section missing: [$section]"
|
|
fi
|
|
done
|
|
|
|
return 0
|
|
}
|
|
|
|
# Generate summary of the build
|
|
generate_summary() {
|
|
local config_file="$1"
|
|
|
|
log_info "Configuration build summary:"
|
|
log_info " Environment: $ENVIRONMENT"
|
|
log_info " Output file: $config_file"
|
|
log_info " File size: $(du -h "$config_file" | cut -f1)"
|
|
log_info " Line count: $(wc -l < "$config_file")"
|
|
|
|
# Count features
|
|
local feature_count=$(grep -c "# .* Feature Configuration" "$config_file" 2>/dev/null || echo "0")
|
|
log_info " Features included: $feature_count"
|
|
|
|
# List features
|
|
if [ "$feature_count" -gt 0 ]; then
|
|
log_info " Feature list:"
|
|
grep "# .* Feature Configuration" "$config_file" | sed 's/# \(.*\) Feature Configuration/ - \1/' || true
|
|
fi
|
|
}
|
|
|
|
# Backup existing configuration
|
|
backup_existing_config() {
|
|
local config_file="$1"
|
|
|
|
if [ -f "$config_file" ]; then
|
|
local backup_file="${config_file}.backup.$(date +%Y%m%d_%H%M%S)"
|
|
log_info "Backing up existing configuration to: $backup_file"
|
|
cp "$config_file" "$backup_file"
|
|
fi
|
|
}
|
|
|
|
# Show help
|
|
show_help() {
|
|
cat << EOF
|
|
Configuration Builder Script
|
|
|
|
USAGE:
|
|
$0 [ENVIRONMENT] [OUTPUT_FILE]
|
|
|
|
ARGUMENTS:
|
|
ENVIRONMENT Target environment (dev, prod, example). Default: dev
|
|
OUTPUT_FILE Output configuration file. Default: config.toml
|
|
|
|
EXAMPLES:
|
|
$0 # Build dev config to config.toml
|
|
$0 prod # Build prod config to config.toml
|
|
$0 dev config.dev.toml # Build dev config to config.dev.toml
|
|
$0 prod config.prod.toml # Build prod config to config.prod.toml
|
|
|
|
DESCRIPTION:
|
|
This script combines base configurations and feature-specific configurations
|
|
into a complete TOML configuration file for the specified environment.
|
|
|
|
The script looks for:
|
|
- Base configuration: config/base/[environment].toml
|
|
- Feature configurations: config/features/[feature]/[environment].toml
|
|
|
|
ENVIRONMENT VARIABLES:
|
|
CONFIG_DEBUG=1 Enable debug output
|
|
CONFIG_NO_BACKUP=1 Skip backup of existing configuration
|
|
CONFIG_VALIDATE_ONLY=1 Only validate, don't build
|
|
|
|
EOF
|
|
}
|
|
|
|
# Main function
|
|
main() {
|
|
# Parse arguments
|
|
if [ "$1" = "-h" ] || [ "$1" = "--help" ]; then
|
|
show_help
|
|
exit 0
|
|
fi
|
|
|
|
# Enable debug if requested
|
|
if [ "${CONFIG_DEBUG:-0}" = "1" ]; then
|
|
set -x
|
|
fi
|
|
|
|
log_info "Starting configuration build process..."
|
|
log_info "Environment: $ENVIRONMENT"
|
|
log_info "Output file: $OUTPUT_FILE"
|
|
|
|
# Check environment
|
|
check_environment "$ENVIRONMENT"
|
|
|
|
# Check dependencies
|
|
check_dependencies
|
|
|
|
# Create temporary directory
|
|
create_temp_dir
|
|
|
|
# Copy base configuration
|
|
copy_base_config "$ENVIRONMENT"
|
|
|
|
# Copy feature configurations
|
|
copy_feature_configs "$ENVIRONMENT"
|
|
|
|
# Backup existing configuration if not disabled
|
|
if [ "${CONFIG_NO_BACKUP:-0}" != "1" ]; then
|
|
backup_existing_config "$OUTPUT_FILE"
|
|
fi
|
|
|
|
# If validation only, validate temp config and exit
|
|
if [ "${CONFIG_VALIDATE_ONLY:-0}" = "1" ]; then
|
|
merge_configs "$TEMP_DIR/validation.toml"
|
|
validate_config "$TEMP_DIR/validation.toml"
|
|
log_success "Configuration validation completed"
|
|
exit 0
|
|
fi
|
|
|
|
# Merge configurations
|
|
merge_configs "$OUTPUT_FILE"
|
|
|
|
# Validate the generated configuration
|
|
if ! validate_config "$OUTPUT_FILE"; then
|
|
log_error "Configuration validation failed"
|
|
exit 1
|
|
fi
|
|
|
|
# Generate summary
|
|
generate_summary "$OUTPUT_FILE"
|
|
|
|
log_success "Configuration build completed successfully!"
|
|
log_info "Configuration file: $OUTPUT_FILE"
|
|
}
|
|
|
|
# Run main function
|
|
main "$@"
|