Fix pre-commit script to properly handle multiple files and resolve ESLint warnings
This commit is contained in:
@@ -10,31 +10,31 @@ echo "🚀 Starting deploymif docker compose -f docker/docker-compose.yaml -p rx
|
||||
else
|
||||
print_error "Docker Compose services failed to start"
|
||||
docker compose -f docker/docker-compose.yaml -p rxminder-validation logsalidation..."
|
||||
|
||||
|
||||
# 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_status() {
|
||||
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"
|
||||
}
|
||||
|
||||
|
||||
# Cleanup function
|
||||
cleanup() {
|
||||
print_status "Cleaning up test containers..."
|
||||
@@ -42,48 +42,48 @@ else
|
||||
docker rm rxminder-validation-test 2>/dev/null || true
|
||||
docker compose -f docker/docker-compose.yaml -p rxminder-validation down 2>/dev/null || true
|
||||
}
|
||||
|
||||
|
||||
# Set trap for cleanup
|
||||
trap cleanup EXIT
|
||||
|
||||
|
||||
print_status "1. Validating environment files..."
|
||||
|
||||
|
||||
# Check if required environment files exist
|
||||
if [[ ! -f .env ]]; then
|
||||
print_error ".env file not found. Run 'cp .env.example .env' and configure it."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
if [[ ! -f .env.example ]]; then
|
||||
print_error ".env.example file not found."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
print_success "Environment files exist"
|
||||
|
||||
|
||||
# Validate environment consistency
|
||||
print_status "2. Checking environment variable consistency..."
|
||||
./validate-env.sh
|
||||
|
||||
|
||||
print_status "3. Setting up Docker Buildx..."
|
||||
|
||||
|
||||
# Ensure buildx is available
|
||||
if ! docker buildx version >/dev/null 2>&1; then
|
||||
print_error "Docker Buildx is not available. Please update Docker to a version that supports Buildx."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Create a new builder instance if it doesn't exist
|
||||
if ! docker buildx ls | grep -q "rxminder-builder"; then
|
||||
print_status "Creating new buildx builder instance..."
|
||||
docker buildx create --name rxminder-builder --driver docker-container --bootstrap
|
||||
fi
|
||||
|
||||
|
||||
# Use the builder
|
||||
docker buildx use rxminder-builder
|
||||
|
||||
|
||||
print_status "4. Building multi-platform Docker image with buildx..."
|
||||
|
||||
|
||||
# Build the image with buildx for multiple platforms
|
||||
docker buildx build --no-cache \
|
||||
--platform linux/amd64,linux/arm64 \
|
||||
@@ -102,29 +102,29 @@ else
|
||||
-t rxminder-validation \
|
||||
--load \
|
||||
.
|
||||
|
||||
|
||||
print_success "Docker image built successfully"
|
||||
|
||||
|
||||
print_status "5. Testing container startup and health..."
|
||||
|
||||
|
||||
# Run container in background
|
||||
docker run --rm -d \
|
||||
-p 8083:80 \
|
||||
--name rxminder-validation-test \
|
||||
rxminder-validation
|
||||
|
||||
|
||||
# Wait for container to start
|
||||
sleep 5
|
||||
|
||||
|
||||
# Check if container is running
|
||||
if ! docker ps | grep -q rxminder-validation-test; then
|
||||
print_error "Container failed to start"
|
||||
docker logs rxminder-validation-test
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
print_success "Container started successfully"
|
||||
|
||||
|
||||
# Test health endpoint
|
||||
print_status "5. Testing health endpoint..."
|
||||
for i in {1..10}; do
|
||||
@@ -139,7 +139,7 @@ else
|
||||
sleep 2
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
# Test main application
|
||||
print_status "6. Testing main application..."
|
||||
HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" http://localhost:8083)
|
||||
@@ -149,20 +149,20 @@ else
|
||||
print_error "Main application not responding properly (HTTP $HTTP_CODE)"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Test docker-compose build
|
||||
print_status "7. Testing Docker Compose build..."
|
||||
docker compose -f docker/docker-compose.yaml build frontend --no-cache
|
||||
|
||||
|
||||
print_success "Docker Compose build successful"
|
||||
|
||||
|
||||
# Test docker-compose with validation project name
|
||||
print_status "8. Testing Docker Compose deployment..."
|
||||
docker compose -f docker/docker-compose.yaml -p rxminder-validation up -d --build
|
||||
|
||||
|
||||
# Wait for services to start
|
||||
sleep 10
|
||||
|
||||
|
||||
# Check service health
|
||||
if docker compose -f docker/docker-compose.yaml -p meds-validation ps | grep -q "Up"; then
|
||||
print_success "Docker Compose services started successfully"
|
||||
@@ -171,20 +171,20 @@ else
|
||||
docker compose -f docker/docker-compose.yaml -p meds-validation logs
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Test health of compose deployment
|
||||
if curl -s -f http://localhost:8080/health > /dev/null; then
|
||||
print_success "Docker Compose health endpoint responding"
|
||||
else
|
||||
print_warning "Docker Compose health endpoint not responding (may need CouchDB)"
|
||||
fi
|
||||
|
||||
|
||||
print_status "9. Checking image size..."
|
||||
IMAGE_SIZE=$(docker image inspect rxminder-validation --format='{{.Size}}' | numfmt --to=iec)
|
||||
print_success "Image size: $IMAGE_SIZE"
|
||||
|
||||
|
||||
print_status "10. Validating security configuration..."
|
||||
|
||||
|
||||
# Check if image runs as non-root
|
||||
USER_INFO=$(docker run --rm rxminder-validation whoami)
|
||||
if [[ "$USER_INFO" != "root" ]]; then
|
||||
@@ -192,7 +192,7 @@ else
|
||||
else
|
||||
print_warning "Container runs as root user (security consideration)"
|
||||
fi
|
||||
|
||||
|
||||
# Check nginx configuration
|
||||
if docker run --rm rxminder-validation nginx -t 2>/dev/null; then
|
||||
print_success "Nginx configuration is valid"
|
||||
@@ -200,9 +200,9 @@ else
|
||||
print_error "Nginx configuration has issues"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
print_status "11. Final validation complete!"
|
||||
|
||||
|
||||
echo
|
||||
echo "🎉 Deployment validation successful!"
|
||||
echo
|
||||
@@ -223,12 +223,12 @@ else
|
||||
echo "3. Set up monitoring and backups"
|
||||
echo "4. Configure SSL/TLS certificates"
|
||||
echo
|
||||
|
||||
|
||||
# Load Gitea-specific environment variables
|
||||
REGISTRY=${GITEA_SERVER_URL#https://}
|
||||
IMAGE_NAME=${GITEA_REPOSITORY}
|
||||
IMAGE_TAG=${GITEA_SHA:0:8}
|
||||
|
||||
|
||||
print_status "Registry: $REGISTRY"
|
||||
print_status "Image: $IMAGE_NAME:$IMAGE_TAG"
|
||||
fi
|
||||
@@ -236,7 +236,7 @@ fi
|
||||
# Check if .env file exists
|
||||
if [ ! -f ".env" ]; then
|
||||
print_warning ".env file not found, using defaults"
|
||||
|
||||
|
||||
# Create minimal .env for Gitea deployment
|
||||
cat > .env << EOF
|
||||
COUCHDB_USER=admin
|
||||
@@ -247,7 +247,7 @@ VITE_COUCHDB_PASSWORD=change-this-secure-password
|
||||
APP_BASE_URL=http://localhost:8080
|
||||
NODE_ENV=production
|
||||
EOF
|
||||
|
||||
|
||||
print_warning "Created default .env file - please update with your credentials"
|
||||
fi
|
||||
|
||||
@@ -269,31 +269,31 @@ print_success "Environment variables validated"
|
||||
# Function to deploy via Docker Compose
|
||||
deploy_compose() {
|
||||
print_status "Deploying with Docker Compose..."
|
||||
|
||||
|
||||
# Export image variables for compose
|
||||
export IMAGE_TAG
|
||||
export REGISTRY
|
||||
export IMAGE_NAME
|
||||
|
||||
|
||||
# Use the built image from registry if available
|
||||
if [ "$GITEA_ACTIONS" = "true" ]; then
|
||||
# Override the image in docker-compose
|
||||
export FRONTEND_IMAGE="$REGISTRY/$IMAGE_NAME:$IMAGE_TAG"
|
||||
print_status "Using Gitea Actions built image: $FRONTEND_IMAGE"
|
||||
fi
|
||||
|
||||
|
||||
# Pull the latest images
|
||||
print_status "Pulling latest images..."
|
||||
docker-compose -f docker/docker-compose.yaml pull || print_warning "Failed to pull some images"
|
||||
|
||||
|
||||
# Start services
|
||||
print_status "Starting services..."
|
||||
docker-compose -f docker/docker-compose.yaml up -d
|
||||
|
||||
|
||||
# Wait for services
|
||||
print_status "Waiting for services to be ready..."
|
||||
sleep 10
|
||||
|
||||
|
||||
# Health check
|
||||
print_status "Checking service health..."
|
||||
if curl -f http://localhost:8080/health > /dev/null 2>&1; then
|
||||
@@ -302,7 +302,7 @@ deploy_compose() {
|
||||
print_warning "Frontend health check failed, checking logs..."
|
||||
docker-compose -f docker/docker-compose.yaml logs frontend
|
||||
fi
|
||||
|
||||
|
||||
if curl -f http://localhost:5984/_up > /dev/null 2>&1; then
|
||||
print_success "CouchDB service is healthy"
|
||||
else
|
||||
@@ -313,26 +313,26 @@ deploy_compose() {
|
||||
# Function to deploy via Kubernetes
|
||||
deploy_k8s() {
|
||||
print_status "Deploying to Kubernetes..."
|
||||
|
||||
|
||||
if ! command -v kubectl &> /dev/null; then
|
||||
print_error "kubectl is not installed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Update image in k8s manifests
|
||||
if [ "$GITEA_ACTIONS" = "true" ]; then
|
||||
print_status "Updating Kubernetes manifests with new image..."
|
||||
sed -i "s|image:.*rxminder.*|image: $REGISTRY/$IMAGE_NAME:$IMAGE_TAG|g" k8s/frontend-deployment.yaml
|
||||
fi
|
||||
|
||||
|
||||
# Apply manifests
|
||||
print_status "Applying Kubernetes manifests..."
|
||||
kubectl apply -f k8s/
|
||||
|
||||
|
||||
# Wait for rollout
|
||||
print_status "Waiting for deployment rollout..."
|
||||
kubectl rollout status deployment/frontend-deployment
|
||||
|
||||
|
||||
print_success "Kubernetes deployment completed"
|
||||
}
|
||||
|
||||
|
||||
@@ -46,12 +46,12 @@ echo "🚀 Deploying RxMinder from Gitea to $ENVIRONMENT environment..."
|
||||
# Check if running in Gitea Actions
|
||||
if [ "$GITEA_ACTIONS" = "true" ]; then
|
||||
print_status "Running in Gitea Actions environment"
|
||||
|
||||
|
||||
# Load Gitea-specific environment variables
|
||||
REGISTRY=${GITEA_SERVER_URL#https://}
|
||||
IMAGE_NAME=${GITEA_REPOSITORY}
|
||||
IMAGE_TAG=${GITEA_SHA:0:8}
|
||||
|
||||
|
||||
print_status "Registry: $REGISTRY"
|
||||
print_status "Image: $IMAGE_NAME:$IMAGE_TAG"
|
||||
fi
|
||||
@@ -59,7 +59,7 @@ fi
|
||||
# Check if .env file exists
|
||||
if [ ! -f ".env" ]; then
|
||||
print_warning ".env file not found, using defaults"
|
||||
|
||||
|
||||
# Create minimal .env for Gitea deployment
|
||||
cat > .env << EOF
|
||||
COUCHDB_USER=admin
|
||||
@@ -70,7 +70,7 @@ VITE_COUCHDB_PASSWORD=change-this-secure-password
|
||||
APP_BASE_URL=http://localhost:8080
|
||||
NODE_ENV=production
|
||||
EOF
|
||||
|
||||
|
||||
print_warning "Created default .env file - please update with your credentials"
|
||||
fi
|
||||
|
||||
@@ -92,31 +92,31 @@ print_success "Environment variables validated"
|
||||
# Function to deploy via Docker Compose
|
||||
deploy_compose() {
|
||||
print_status "Deploying with Docker Compose..."
|
||||
|
||||
|
||||
# Export image variables for compose
|
||||
export IMAGE_TAG
|
||||
export REGISTRY
|
||||
export IMAGE_NAME
|
||||
|
||||
|
||||
# Use the built image from registry if available
|
||||
if [ "$GITEA_ACTIONS" = "true" ]; then
|
||||
# Override the image in docker-compose
|
||||
export FRONTEND_IMAGE="$REGISTRY/$IMAGE_NAME:$IMAGE_TAG"
|
||||
print_status "Using Gitea Actions built image: $FRONTEND_IMAGE"
|
||||
fi
|
||||
|
||||
|
||||
# Pull the latest images
|
||||
print_status "Pulling latest images..."
|
||||
docker-compose -f docker/docker-compose.yaml pull || print_warning "Failed to pull some images"
|
||||
|
||||
|
||||
# Start services
|
||||
print_status "Starting services..."
|
||||
docker-compose -f docker/docker-compose.yaml up -d
|
||||
|
||||
|
||||
# Wait for services
|
||||
print_status "Waiting for services to be ready..."
|
||||
sleep 10
|
||||
|
||||
|
||||
# Health check
|
||||
print_status "Checking service health..."
|
||||
if curl -f http://localhost:8080/health > /dev/null 2>&1; then
|
||||
@@ -125,7 +125,7 @@ deploy_compose() {
|
||||
print_warning "Frontend health check failed, checking logs..."
|
||||
docker-compose -f docker/docker-compose.yaml logs frontend
|
||||
fi
|
||||
|
||||
|
||||
if curl -f http://localhost:5984/_up > /dev/null 2>&1; then
|
||||
print_success "CouchDB service is healthy"
|
||||
else
|
||||
@@ -136,26 +136,26 @@ deploy_compose() {
|
||||
# Function to deploy via Kubernetes
|
||||
deploy_k8s() {
|
||||
print_status "Deploying to Kubernetes..."
|
||||
|
||||
|
||||
if ! command -v kubectl &> /dev/null; then
|
||||
print_error "kubectl is not installed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Update image in k8s manifests
|
||||
if [ "$GITEA_ACTIONS" = "true" ]; then
|
||||
print_status "Updating Kubernetes manifests with new image..."
|
||||
sed -i "s|image:.*rxminder.*|image: $REGISTRY/$IMAGE_NAME:$IMAGE_TAG|g" k8s/frontend-deployment.yaml
|
||||
fi
|
||||
|
||||
|
||||
# Apply manifests
|
||||
print_status "Applying Kubernetes manifests..."
|
||||
kubectl apply -f k8s/
|
||||
|
||||
|
||||
# Wait for rollout
|
||||
print_status "Waiting for deployment rollout..."
|
||||
kubectl rollout status deployment/frontend-deployment
|
||||
|
||||
|
||||
print_success "Kubernetes deployment completed"
|
||||
}
|
||||
|
||||
@@ -206,26 +206,26 @@ print_success "All tasks completed! 🚀"
|
||||
print_error "Docker is not installed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Check Docker Buildx
|
||||
if ! docker buildx version >/dev/null 2>&1; then
|
||||
print_error "Docker Buildx is not available"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Check if in Gitea Actions environment
|
||||
if [ "$GITEA_ACTIONS" = "true" ]; then
|
||||
print_status "Running in Gitea Actions environment"
|
||||
GITEA_REGISTRY=${GITEA_SERVER_URL#https://}
|
||||
GITEA_REPOSITORY=${GITEA_REPOSITORY}
|
||||
fi
|
||||
|
||||
|
||||
print_success "All requirements met"
|
||||
}
|
||||
|
||||
setup_buildx() {
|
||||
print_status "Setting up Docker Buildx for Gitea..."
|
||||
|
||||
|
||||
# Create builder if it doesn't exist
|
||||
if ! docker buildx ls | grep -q "gitea-builder"; then
|
||||
print_status "Creating Gitea buildx builder..."
|
||||
@@ -243,13 +243,13 @@ setup_buildx() {
|
||||
|
||||
login_registry() {
|
||||
print_status "Logging into Gitea registry..."
|
||||
|
||||
|
||||
if [ -z "$GITEA_TOKEN" ]; then
|
||||
print_error "GITEA_TOKEN environment variable is required"
|
||||
print_status "Set it with: export GITEA_TOKEN=your_token"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Login to Gitea registry
|
||||
echo "$GITEA_TOKEN" | docker login "$GITEA_REGISTRY" -u "$GITEA_ACTOR" --password-stdin
|
||||
print_success "Logged into Gitea registry"
|
||||
@@ -257,152 +257,152 @@ login_registry() {
|
||||
|
||||
build_local() {
|
||||
print_status "Building for local development..."
|
||||
|
||||
|
||||
cd "$PROJECT_DIR"
|
||||
|
||||
|
||||
# Load environment variables
|
||||
if [ -f ".env" ]; then
|
||||
export $(cat .env | grep -v '^#' | xargs)
|
||||
fi
|
||||
|
||||
|
||||
# Build with Gitea bake file
|
||||
docker buildx bake \
|
||||
-f .gitea/gitea-bake.hcl \
|
||||
--set="*.platform=linux/amd64" \
|
||||
--load \
|
||||
dev
|
||||
|
||||
|
||||
print_success "Local build completed"
|
||||
}
|
||||
|
||||
build_multiplatform() {
|
||||
local tag=${1:-$DEFAULT_TAG}
|
||||
print_status "Building multi-platform image with tag: $tag..."
|
||||
|
||||
|
||||
cd "$PROJECT_DIR"
|
||||
|
||||
|
||||
# Load environment variables
|
||||
if [ -f ".env" ]; then
|
||||
export $(cat .env | grep -v '^#' | xargs)
|
||||
fi
|
||||
|
||||
|
||||
# Export variables for bake
|
||||
export TAG="$tag"
|
||||
export GITEA_SHA=${GITEA_SHA:-$(git rev-parse --short HEAD 2>/dev/null || echo "dev")}
|
||||
|
||||
|
||||
# Build with Gitea bake file
|
||||
docker buildx bake \
|
||||
-f .gitea/gitea-bake.hcl \
|
||||
app-ci
|
||||
|
||||
|
||||
print_success "Multi-platform build completed"
|
||||
}
|
||||
|
||||
build_staging() {
|
||||
print_status "Building staging image..."
|
||||
|
||||
|
||||
cd "$PROJECT_DIR"
|
||||
|
||||
|
||||
# Load environment variables
|
||||
if [ -f ".env.staging" ]; then
|
||||
export $(cat .env.staging | grep -v '^#' | xargs)
|
||||
elif [ -f ".env" ]; then
|
||||
export $(cat .env | grep -v '^#' | xargs)
|
||||
fi
|
||||
|
||||
|
||||
# Export variables for bake
|
||||
export TAG="staging-$(date +%Y%m%d-%H%M%S)"
|
||||
export GITEA_SHA=${GITEA_SHA:-$(git rev-parse --short HEAD 2>/dev/null || echo "staging")}
|
||||
|
||||
|
||||
# Build staging target
|
||||
docker buildx bake \
|
||||
-f .gitea/gitea-bake.hcl \
|
||||
staging
|
||||
|
||||
|
||||
print_success "Staging build completed"
|
||||
}
|
||||
|
||||
build_production() {
|
||||
local tag=${1:-$DEFAULT_TAG}
|
||||
print_status "Building production image with tag: $tag..."
|
||||
|
||||
|
||||
cd "$PROJECT_DIR"
|
||||
|
||||
|
||||
# Load production environment variables
|
||||
if [ -f ".env.production" ]; then
|
||||
export $(cat .env.production | grep -v '^#' | xargs)
|
||||
elif [ -f ".env" ]; then
|
||||
export $(cat .env | grep -v '^#' | xargs)
|
||||
fi
|
||||
|
||||
|
||||
# Export variables for bake
|
||||
export TAG="$tag"
|
||||
export GITEA_SHA=${GITEA_SHA:-$(git rev-parse --short HEAD 2>/dev/null || echo "prod")}
|
||||
|
||||
|
||||
# Build production target with full attestations
|
||||
docker buildx bake \
|
||||
-f .gitea/gitea-bake.hcl \
|
||||
prod
|
||||
|
||||
|
||||
print_success "Production build completed"
|
||||
}
|
||||
|
||||
test_local() {
|
||||
print_status "Running tests locally..."
|
||||
|
||||
|
||||
cd "$PROJECT_DIR"
|
||||
|
||||
|
||||
# Install dependencies if needed
|
||||
if [ ! -d "node_modules" ]; then
|
||||
print_status "Installing dependencies..."
|
||||
bun install --frozen-lockfile
|
||||
fi
|
||||
|
||||
|
||||
# Run linting
|
||||
print_status "Running linter..."
|
||||
bun run lint
|
||||
|
||||
|
||||
# Run type checking
|
||||
print_status "Running type checker..."
|
||||
bun run type-check
|
||||
|
||||
|
||||
# Run tests
|
||||
print_status "Running tests..."
|
||||
bun run test
|
||||
|
||||
|
||||
print_success "All tests passed"
|
||||
}
|
||||
|
||||
deploy() {
|
||||
local environment=${1:-production}
|
||||
local tag=${2:-latest}
|
||||
|
||||
|
||||
print_status "Deploying to $environment with tag $tag..."
|
||||
|
||||
|
||||
# Use the gitea-deploy script
|
||||
"$SCRIPT_DIR/gitea-deploy.sh" "$environment" "$tag"
|
||||
}
|
||||
|
||||
cleanup() {
|
||||
print_status "Cleaning up Gitea builder and images..."
|
||||
|
||||
|
||||
# Remove builder
|
||||
if docker buildx ls | grep -q "gitea-builder"; then
|
||||
docker buildx rm gitea-builder
|
||||
print_success "Gitea builder removed"
|
||||
fi
|
||||
|
||||
|
||||
# Clean up old images (keep last 3 tags)
|
||||
print_status "Cleaning up old images..."
|
||||
docker image prune -f --filter "until=72h" || print_warning "Image cleanup failed"
|
||||
|
||||
|
||||
print_success "Cleanup completed"
|
||||
}
|
||||
|
||||
show_status() {
|
||||
print_status "Gitea CI/CD Status"
|
||||
echo
|
||||
|
||||
|
||||
# Check environment
|
||||
if [ "$GITEA_ACTIONS" = "true" ]; then
|
||||
echo "🏃 Running in Gitea Actions"
|
||||
@@ -415,13 +415,13 @@ show_status() {
|
||||
echo "📦 Registry: $GITEA_REGISTRY"
|
||||
echo "📋 Repository: $GITEA_REPOSITORY"
|
||||
fi
|
||||
|
||||
|
||||
echo
|
||||
|
||||
|
||||
# Check Docker and buildx
|
||||
echo "🐳 Docker version: $(docker --version)"
|
||||
echo "🔧 Buildx version: $(docker buildx version)"
|
||||
|
||||
|
||||
# Check builders
|
||||
echo
|
||||
echo "🏗️ Available builders:"
|
||||
|
||||
@@ -52,9 +52,9 @@ load_env() {
|
||||
substitute_template() {
|
||||
local template_file="$1"
|
||||
local output_file="$2"
|
||||
|
||||
|
||||
print_status "Processing template: $template_file"
|
||||
|
||||
|
||||
# Use envsubst to substitute environment variables
|
||||
if command -v envsubst >/dev/null 2>&1; then
|
||||
envsubst < "$template_file" > "$output_file"
|
||||
@@ -62,14 +62,14 @@ substitute_template() {
|
||||
print_error "envsubst not found. Please install gettext package."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
print_success "Generated: $output_file"
|
||||
}
|
||||
|
||||
# Function to apply Kubernetes resources
|
||||
apply_k8s_resource() {
|
||||
local resource_file="$1"
|
||||
|
||||
|
||||
if [[ -f "$resource_file" ]]; then
|
||||
print_status "Applying Kubernetes resource: $resource_file"
|
||||
if kubectl apply -f "$resource_file"; then
|
||||
@@ -94,15 +94,15 @@ validate_env() {
|
||||
"STORAGE_CLASS"
|
||||
"STORAGE_SIZE"
|
||||
)
|
||||
|
||||
|
||||
local missing_vars=()
|
||||
|
||||
|
||||
for var in "${required_vars[@]}"; do
|
||||
if [[ -z "${!var:-}" ]]; then
|
||||
missing_vars+=("$var")
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
if [[ ${#missing_vars[@]} -gt 0 ]]; then
|
||||
print_error "Missing required environment variables:"
|
||||
for var in "${missing_vars[@]}"; do
|
||||
@@ -111,7 +111,7 @@ validate_env() {
|
||||
print_warning "Please update your .env file with these variables."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
print_success "All required environment variables are set"
|
||||
}
|
||||
|
||||
@@ -119,22 +119,22 @@ validate_env() {
|
||||
process_templates() {
|
||||
local temp_dir="/tmp/rxminder-k8s-$$"
|
||||
mkdir -p "$temp_dir"
|
||||
|
||||
|
||||
print_status "Processing Kubernetes templates..."
|
||||
|
||||
|
||||
# Find all template files
|
||||
local template_files=(
|
||||
"$K8S_DIR/couchdb-secret.yaml.template"
|
||||
"$K8S_DIR/ingress.yaml.template"
|
||||
)
|
||||
|
||||
|
||||
# Add any additional template files
|
||||
for template_file in "$K8S_DIR"/*.template; do
|
||||
if [[ -f "$template_file" ]]; then
|
||||
template_files+=("$template_file")
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
# Process each template
|
||||
for template_file in "${template_files[@]}"; do
|
||||
if [[ -f "$template_file" ]]; then
|
||||
@@ -144,16 +144,16 @@ process_templates() {
|
||||
substitute_template "$template_file" "$output_file"
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
echo "$temp_dir"
|
||||
}
|
||||
|
||||
# Function to deploy resources in correct order
|
||||
deploy_resources() {
|
||||
local resource_dir="$1"
|
||||
|
||||
|
||||
print_status "Deploying Kubernetes resources..."
|
||||
|
||||
|
||||
# Deploy in specific order for dependencies
|
||||
local deployment_order=(
|
||||
"couchdb-secret.yaml"
|
||||
@@ -167,7 +167,7 @@ deploy_resources() {
|
||||
"$K8S_DIR/network-policy.yaml"
|
||||
"$K8S_DIR/hpa.yaml"
|
||||
)
|
||||
|
||||
|
||||
for resource in "${deployment_order[@]}"; do
|
||||
if [[ "$resource" == *.yaml ]]; then
|
||||
# Check if it's a template-generated file
|
||||
@@ -184,11 +184,11 @@ deploy_resources() {
|
||||
# Function to run database seeding job
|
||||
run_db_seed() {
|
||||
print_status "Running database seed job..."
|
||||
|
||||
|
||||
# Apply the db-seed-job (which uses environment variables from secret)
|
||||
if kubectl apply -f "$K8S_DIR/db-seed-job.yaml"; then
|
||||
print_success "Database seed job submitted"
|
||||
|
||||
|
||||
# Wait for job completion
|
||||
print_status "Waiting for database seed job to complete..."
|
||||
if kubectl wait --for=condition=complete --timeout=300s job/db-seed-job; then
|
||||
@@ -207,19 +207,19 @@ run_db_seed() {
|
||||
show_status() {
|
||||
print_status "Deployment Status:"
|
||||
echo
|
||||
|
||||
|
||||
print_status "Pods:"
|
||||
kubectl get pods -l app="${APP_NAME:-rxminder}"
|
||||
echo
|
||||
|
||||
|
||||
print_status "Services:"
|
||||
kubectl get services -l app="${APP_NAME:-rxminder}"
|
||||
echo
|
||||
|
||||
|
||||
print_status "Ingress:"
|
||||
kubectl get ingress
|
||||
echo
|
||||
|
||||
|
||||
if [[ -n "${INGRESS_HOST:-}" ]]; then
|
||||
print_success "Application should be available at: http://${INGRESS_HOST}"
|
||||
fi
|
||||
@@ -235,12 +235,12 @@ cleanup() {
|
||||
# Main deployment function
|
||||
main() {
|
||||
local command="${1:-deploy}"
|
||||
|
||||
|
||||
case "$command" in
|
||||
"deploy"|"apply")
|
||||
print_status "🚀 Starting RxMinder Kubernetes deployment..."
|
||||
echo
|
||||
|
||||
|
||||
# Set default values for required variables
|
||||
export APP_NAME="${APP_NAME:-rxminder}"
|
||||
export DOCKER_IMAGE="${DOCKER_IMAGE:-gitea-http.taildb3494.ts.net/will/meds:latest}"
|
||||
@@ -249,39 +249,39 @@ main() {
|
||||
export INGRESS_HOST="${INGRESS_HOST:-rxminder.local}"
|
||||
export STORAGE_CLASS="${STORAGE_CLASS:-longhorn}"
|
||||
export STORAGE_SIZE="${STORAGE_SIZE:-5Gi}"
|
||||
|
||||
|
||||
load_env
|
||||
validate_env
|
||||
|
||||
|
||||
# Process templates
|
||||
temp_dir=$(process_templates)
|
||||
trap cleanup EXIT
|
||||
|
||||
|
||||
# Deploy resources
|
||||
deploy_resources "$temp_dir"
|
||||
|
||||
|
||||
# Run database seeding
|
||||
run_db_seed
|
||||
|
||||
|
||||
# Show status
|
||||
echo
|
||||
show_status
|
||||
|
||||
|
||||
print_success "🎉 RxMinder deployment completed!"
|
||||
;;
|
||||
|
||||
|
||||
"status")
|
||||
load_env
|
||||
show_status
|
||||
;;
|
||||
|
||||
|
||||
"delete"|"cleanup")
|
||||
print_status "🗑️ Cleaning up RxMinder deployment..."
|
||||
kubectl delete all,pvc,secret,configmap,ingress -l app="${APP_NAME:-rxminder}" || true
|
||||
kubectl delete job db-seed-job || true
|
||||
print_success "Cleanup completed"
|
||||
;;
|
||||
|
||||
|
||||
"help"|"-h"|"--help")
|
||||
echo "RxMinder Kubernetes Deployment Script"
|
||||
echo
|
||||
@@ -302,7 +302,7 @@ main() {
|
||||
echo " STORAGE_CLASS Storage class for PVCs (default: longhorn)"
|
||||
echo " STORAGE_SIZE Storage size for database (default: 5Gi)"
|
||||
;;
|
||||
|
||||
|
||||
*)
|
||||
print_error "Unknown command: $command"
|
||||
echo "Use '$0 help' for usage information"
|
||||
|
||||
@@ -69,7 +69,9 @@ run_check "prettier" "bun run pre-commit"
|
||||
# 2. ESLint on staged JS/TS files only
|
||||
STAGED_JS_TS_FILES=$(echo "$STAGED_FILES" | grep -E '\.(js|jsx|ts|tsx)$' || true)
|
||||
if [ -n "$STAGED_JS_TS_FILES" ]; then
|
||||
run_check "eslint" "bunx eslint --fix --max-warnings 0 $STAGED_JS_TS_FILES"
|
||||
# Convert newlines to spaces for proper argument passing
|
||||
ESLINT_FILES=$(echo "$STAGED_JS_TS_FILES" | tr '\n' ' ')
|
||||
run_check "eslint" "bunx eslint --fix --max-warnings 0 $ESLINT_FILES"
|
||||
else
|
||||
echo "0" > "$TEMP_DIR/eslint.exit"
|
||||
echo "No JS/TS files to lint" > "$TEMP_DIR/eslint.out"
|
||||
@@ -87,7 +89,9 @@ fi
|
||||
# 4. Markdown linting on staged markdown files
|
||||
STAGED_MD_FILES=$(echo "$STAGED_FILES" | grep -E '\.md$' || true)
|
||||
if [ -n "$STAGED_MD_FILES" ]; then
|
||||
run_check "markdown" "bunx markdownlint-cli2 --fix $STAGED_MD_FILES || echo 'Markdown linting failed but continuing...'"
|
||||
# Convert newlines to spaces for proper argument passing
|
||||
MARKDOWN_FILES=$(echo "$STAGED_MD_FILES" | tr '\n' ' ')
|
||||
run_check "markdown" "bunx markdownlint-cli2 --fix $MARKDOWN_FILES || echo 'Markdown linting failed but continuing...'"
|
||||
else
|
||||
echo "0" > "$TEMP_DIR/markdown.exit"
|
||||
echo "No markdown files to lint" > "$TEMP_DIR/markdown.out"
|
||||
@@ -95,7 +99,9 @@ fi
|
||||
|
||||
# 5. Secret scanning on staged files (optional check)
|
||||
if command -v secretlint > /dev/null; then
|
||||
run_check "secrets" "bunx secretlint $STAGED_FILES || echo 'Secret scanning failed but continuing...'"
|
||||
# Convert newlines to spaces for proper argument passing
|
||||
SECRET_FILES=$(echo "$STAGED_FILES" | tr '\n' ' ')
|
||||
run_check "secrets" "bunx secretlint $SECRET_FILES || echo 'Secret scanning failed but continuing...'"
|
||||
else
|
||||
echo "0" > "$TEMP_DIR/secrets.exit"
|
||||
echo "secretlint not available, skipping secret scanning" > "$TEMP_DIR/secrets.out"
|
||||
|
||||
@@ -11,14 +11,14 @@ const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = dirname(__filename);
|
||||
const projectDir = resolve(__dirname, '..');
|
||||
|
||||
console.log('🌱 Starting production database seeding...');
|
||||
console.warn('🌱 Starting production database seeding...');
|
||||
|
||||
// Load environment variables from .env file if it exists
|
||||
try {
|
||||
const envFile = resolve(projectDir, '.env');
|
||||
const envContent = readFileSync(envFile, 'utf8');
|
||||
|
||||
console.log('📄 Loading environment variables from .env file...');
|
||||
console.warn('📄 Loading environment variables from .env file...');
|
||||
|
||||
envContent.split('\n').forEach(line => {
|
||||
const trimmed = line.trim();
|
||||
@@ -30,8 +30,8 @@ try {
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
console.log(
|
||||
} catch (_error) {
|
||||
console.warn(
|
||||
'ℹ️ No .env file found, using environment variables or defaults'
|
||||
);
|
||||
}
|
||||
@@ -53,10 +53,10 @@ process.env.VITE_COUCHDB_URL = COUCHDB_URL;
|
||||
process.env.VITE_COUCHDB_USER = COUCHDB_USER;
|
||||
process.env.VITE_COUCHDB_PASSWORD = COUCHDB_PASSWORD;
|
||||
|
||||
console.log('🔗 CouchDB Configuration:');
|
||||
console.log(` URL: ${COUCHDB_URL}`);
|
||||
console.log(` User: ${COUCHDB_USER}`);
|
||||
console.log(` Password: ${'*'.repeat(COUCHDB_PASSWORD.length)}`);
|
||||
console.warn('🔗 CouchDB Configuration:');
|
||||
console.warn(` URL: ${COUCHDB_URL}`);
|
||||
console.warn(` User: ${COUCHDB_USER}`);
|
||||
console.warn(` Password: ${'*'.repeat(COUCHDB_PASSWORD.length)}`);
|
||||
|
||||
// Validate required environment variables
|
||||
if (!COUCHDB_URL || !COUCHDB_USER || !COUCHDB_PASSWORD) {
|
||||
@@ -75,18 +75,18 @@ async function seedDatabase() {
|
||||
const { DatabaseSeeder } = await import('../services/database.seeder.ts');
|
||||
|
||||
// Wait a bit for databases to be initialized
|
||||
console.log('⏳ Waiting for databases to initialize...');
|
||||
console.warn('⏳ Waiting for databases to initialize...');
|
||||
await new Promise(resolve => setTimeout(resolve, 2000));
|
||||
|
||||
const seeder = new DatabaseSeeder();
|
||||
|
||||
console.log('📊 Seeding admin user...');
|
||||
console.warn('📊 Seeding admin user...');
|
||||
await seeder.seedDefaultAdmin();
|
||||
|
||||
console.log('🎉 Production database seeding completed successfully!');
|
||||
console.log('🔐 You can now login with:');
|
||||
console.log(' Email: admin@localhost');
|
||||
console.log(' Password: change-this-secure-password');
|
||||
console.warn('🎉 Production database seeding completed successfully!');
|
||||
console.warn('🔐 You can now login with:');
|
||||
console.warn(' Email: admin@localhost');
|
||||
console.warn(' Password: change-this-secure-password');
|
||||
|
||||
process.exit(0);
|
||||
} catch (error) {
|
||||
|
||||
@@ -52,21 +52,21 @@ load_env() {
|
||||
# Function to substitute environment variables in template files
|
||||
substitute_templates() {
|
||||
print_info "Processing template files..."
|
||||
|
||||
|
||||
# Create temporary directory
|
||||
mkdir -p "$TEMP_DIR"
|
||||
|
||||
|
||||
# Process each template file
|
||||
for template_file in "$K8S_DIR"/*.template; do
|
||||
if [[ -f "$template_file" ]]; then
|
||||
local filename=$(basename "$template_file" .template)
|
||||
local output_file="$TEMP_DIR/$filename"
|
||||
|
||||
|
||||
print_info "Processing template: $filename"
|
||||
|
||||
|
||||
# Substitute environment variables
|
||||
envsubst < "$template_file" > "$output_file"
|
||||
|
||||
|
||||
print_success "Generated: $output_file"
|
||||
fi
|
||||
done
|
||||
@@ -76,13 +76,13 @@ substitute_templates() {
|
||||
validate_env() {
|
||||
local required_vars=("INGRESS_HOST")
|
||||
local missing_vars=()
|
||||
|
||||
|
||||
for var in "${required_vars[@]}"; do
|
||||
if [[ -z "${!var:-}" ]]; then
|
||||
missing_vars+=("$var")
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
if [[ ${#missing_vars[@]} -gt 0 ]]; then
|
||||
print_error "Missing required environment variables:"
|
||||
for var in "${missing_vars[@]}"; do
|
||||
@@ -108,15 +108,15 @@ ensure_namespace() {
|
||||
# Function to apply Kubernetes manifests
|
||||
apply_manifests() {
|
||||
local manifest_dir="$1"
|
||||
|
||||
|
||||
print_info "Applying Kubernetes manifests from $manifest_dir"
|
||||
|
||||
|
||||
# Apply static files that don't have template counterparts
|
||||
for manifest_file in "$K8S_DIR"/*.yaml; do
|
||||
if [[ -f "$manifest_file" && ! "$manifest_file" =~ \.template$ ]]; then
|
||||
local basename_file=$(basename "$manifest_file")
|
||||
local template_file="$K8S_DIR/${basename_file}.template"
|
||||
|
||||
|
||||
# Only apply if there's no corresponding template file
|
||||
if [[ ! -f "$template_file" ]]; then
|
||||
print_info "Applying static file: $basename_file"
|
||||
@@ -124,7 +124,7 @@ apply_manifests() {
|
||||
fi
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
# Apply processed template files
|
||||
if [[ -d "$TEMP_DIR" ]]; then
|
||||
for manifest_file in "$TEMP_DIR"/*.yaml; do
|
||||
@@ -148,19 +148,19 @@ cleanup() {
|
||||
show_status() {
|
||||
print_info "Deployment Status:"
|
||||
echo ""
|
||||
|
||||
|
||||
print_info "Pods:"
|
||||
kubectl get pods -l app=rxminder -n "$NAMESPACE"
|
||||
echo ""
|
||||
|
||||
|
||||
print_info "Services:"
|
||||
kubectl get services -l app=rxminder -n "$NAMESPACE"
|
||||
echo ""
|
||||
|
||||
|
||||
print_info "Ingress:"
|
||||
kubectl get ingress -l app=rxminder -n "$NAMESPACE"
|
||||
echo ""
|
||||
|
||||
|
||||
if [[ -n "${INGRESS_HOST:-}" ]]; then
|
||||
print_success "Application should be available at: http://$INGRESS_HOST"
|
||||
fi
|
||||
@@ -190,7 +190,7 @@ main() {
|
||||
local dry_run=false
|
||||
local status_only=false
|
||||
local cleanup_only=false
|
||||
|
||||
|
||||
# Parse command line arguments
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
@@ -221,54 +221,54 @@ main() {
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
|
||||
# Handle cleanup only
|
||||
if [[ "$cleanup_only" == true ]]; then
|
||||
cleanup
|
||||
exit 0
|
||||
fi
|
||||
|
||||
|
||||
# Handle status only
|
||||
if [[ "$status_only" == true ]]; then
|
||||
show_status
|
||||
exit 0
|
||||
fi
|
||||
|
||||
|
||||
# Check if kubectl is available
|
||||
if ! command -v kubectl &> /dev/null; then
|
||||
print_error "kubectl is not installed or not in PATH"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
# Check if we can connect to Kubernetes cluster
|
||||
if ! kubectl cluster-info &> /dev/null; then
|
||||
print_error "Cannot connect to Kubernetes cluster"
|
||||
print_info "Make sure your kubectl is configured correctly"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
|
||||
print_info "🚀 Deploying Medication Reminder App to Kubernetes"
|
||||
echo ""
|
||||
|
||||
|
||||
# Load environment variables
|
||||
load_env "$env_file"
|
||||
|
||||
|
||||
# Set default namespace if not provided in environment
|
||||
NAMESPACE="${NAMESPACE:-rxminder}"
|
||||
|
||||
|
||||
# Validate required environment variables
|
||||
validate_env
|
||||
|
||||
|
||||
# Ensure namespace exists
|
||||
ensure_namespace
|
||||
|
||||
|
||||
# Process templates
|
||||
substitute_templates
|
||||
|
||||
|
||||
if [[ "$dry_run" == true ]]; then
|
||||
print_info "Dry run mode - showing generated manifests:"
|
||||
echo ""
|
||||
|
||||
|
||||
for manifest_file in "$TEMP_DIR"/*.yaml; do
|
||||
if [[ -f "$manifest_file" ]]; then
|
||||
echo "=== $(basename "$manifest_file") ==="
|
||||
@@ -279,14 +279,14 @@ main() {
|
||||
else
|
||||
# Apply manifests
|
||||
apply_manifests "$K8S_DIR"
|
||||
|
||||
|
||||
print_success "Deployment completed!"
|
||||
echo ""
|
||||
|
||||
|
||||
# Show status
|
||||
show_status
|
||||
fi
|
||||
|
||||
|
||||
# Cleanup
|
||||
cleanup
|
||||
}
|
||||
|
||||
@@ -55,17 +55,17 @@ OPTIONAL_VARS=(
|
||||
validate_file() {
|
||||
local file="$1"
|
||||
local file_type="$2"
|
||||
|
||||
|
||||
print_section "Validating $file ($file_type)"
|
||||
|
||||
|
||||
if [[ ! -f "$file" ]]; then
|
||||
print_error "File not found: $file"
|
||||
return 1
|
||||
fi
|
||||
|
||||
|
||||
local missing_vars=()
|
||||
local found_vars=()
|
||||
|
||||
|
||||
# Check core variables
|
||||
for var in "${CORE_VARS[@]}"; do
|
||||
if grep -q "^${var}=" "$file" || grep -q "^#.*${var}=" "$file"; then
|
||||
@@ -74,7 +74,7 @@ validate_file() {
|
||||
missing_vars+=("$var")
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
# Check K8s variables for relevant files
|
||||
if [[ "$file_type" != "template" ]]; then
|
||||
for var in "${K8S_VARS[@]}"; do
|
||||
@@ -85,22 +85,22 @@ validate_file() {
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
# Report results
|
||||
print_success "Found ${#found_vars[@]} variables"
|
||||
|
||||
|
||||
if [[ ${#missing_vars[@]} -gt 0 ]]; then
|
||||
print_warning "Missing variables:"
|
||||
for var in "${missing_vars[@]}"; do
|
||||
echo " - $var"
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
# Check for old VITE_MAILGUN variables
|
||||
if grep -q "VITE_MAILGUN" "$file"; then
|
||||
print_error "Found deprecated VITE_MAILGUN variables (should be MAILGUN_*)"
|
||||
fi
|
||||
|
||||
|
||||
# Check variable format
|
||||
local malformed_vars=()
|
||||
while IFS= read -r line; do
|
||||
@@ -111,25 +111,25 @@ validate_file() {
|
||||
fi
|
||||
fi
|
||||
done < "$file"
|
||||
|
||||
|
||||
if [[ ${#malformed_vars[@]} -gt 0 ]]; then
|
||||
print_warning "Malformed variable names:"
|
||||
for var in "${malformed_vars[@]}"; do
|
||||
echo " - $var"
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
echo ""
|
||||
}
|
||||
|
||||
validate_consistency() {
|
||||
print_section "Cross-file Consistency Check"
|
||||
|
||||
|
||||
# Extract variable names from each file
|
||||
local example_vars=()
|
||||
local env_vars=()
|
||||
local prod_vars=()
|
||||
|
||||
|
||||
if [[ -f ".env.example" ]]; then
|
||||
while IFS= read -r line; do
|
||||
if [[ "$line" =~ ^[A-Z_]+=.* ]]; then
|
||||
@@ -137,7 +137,7 @@ validate_consistency() {
|
||||
fi
|
||||
done < ".env.example"
|
||||
fi
|
||||
|
||||
|
||||
if [[ -f ".env" ]]; then
|
||||
while IFS= read -r line; do
|
||||
if [[ "$line" =~ ^[A-Z_]+=.* ]]; then
|
||||
@@ -145,7 +145,7 @@ validate_consistency() {
|
||||
fi
|
||||
done < ".env"
|
||||
fi
|
||||
|
||||
|
||||
if [[ -f ".env.production" ]]; then
|
||||
while IFS= read -r line; do
|
||||
if [[ "$line" =~ ^[A-Z_]+=.* ]]; then
|
||||
@@ -153,11 +153,11 @@ validate_consistency() {
|
||||
fi
|
||||
done < ".env.production"
|
||||
fi
|
||||
|
||||
|
||||
# Check if .env and .env.production have all variables from .env.example
|
||||
local missing_in_env=()
|
||||
local missing_in_prod=()
|
||||
|
||||
|
||||
for var in "${example_vars[@]}"; do
|
||||
if [[ ! " ${env_vars[@]} " =~ " ${var} " ]]; then
|
||||
missing_in_env+=("$var")
|
||||
@@ -166,7 +166,7 @@ validate_consistency() {
|
||||
missing_in_prod+=("$var")
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
if [[ ${#missing_in_env[@]} -eq 0 ]]; then
|
||||
print_success ".env has all variables from .env.example"
|
||||
else
|
||||
@@ -175,7 +175,7 @@ validate_consistency() {
|
||||
echo " - $var"
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
if [[ ${#missing_in_prod[@]} -eq 0 ]]; then
|
||||
print_success ".env.production has all variables from .env.example"
|
||||
else
|
||||
@@ -184,20 +184,20 @@ validate_consistency() {
|
||||
echo " - $var"
|
||||
done
|
||||
fi
|
||||
|
||||
|
||||
echo ""
|
||||
}
|
||||
|
||||
validate_k8s_template() {
|
||||
print_section "Kubernetes Template Validation"
|
||||
|
||||
|
||||
local template_file="k8s/ingress.yaml.template"
|
||||
|
||||
|
||||
if [[ ! -f "$template_file" ]]; then
|
||||
print_error "Template file not found: $template_file"
|
||||
return 1
|
||||
fi
|
||||
|
||||
|
||||
# Check for template variables
|
||||
local template_vars=()
|
||||
while IFS= read -r line; do
|
||||
@@ -208,16 +208,16 @@ validate_k8s_template() {
|
||||
fi
|
||||
fi
|
||||
done < "$template_file"
|
||||
|
||||
|
||||
print_success "Found ${#template_vars[@]} template variables:"
|
||||
for var in "${template_vars[@]}"; do
|
||||
echo " - \${$var}"
|
||||
done
|
||||
|
||||
|
||||
# Check if template variables are defined in env files
|
||||
for var in "${template_vars[@]}"; do
|
||||
local found_in_files=()
|
||||
|
||||
|
||||
if grep -q "^${var}=" ".env.example" 2>/dev/null; then
|
||||
found_in_files+=(".env.example")
|
||||
fi
|
||||
@@ -227,39 +227,39 @@ validate_k8s_template() {
|
||||
if grep -q "^${var}=" ".env.production" 2>/dev/null; then
|
||||
found_in_files+=(".env.production")
|
||||
fi
|
||||
|
||||
|
||||
if [[ ${#found_in_files[@]} -gt 0 ]]; then
|
||||
print_success "$var defined in: ${found_in_files[*]}"
|
||||
else
|
||||
print_error "$var not defined in any environment file"
|
||||
fi
|
||||
done
|
||||
|
||||
|
||||
echo ""
|
||||
}
|
||||
|
||||
main() {
|
||||
print_header
|
||||
|
||||
|
||||
# Validate individual files
|
||||
if [[ -f ".env.example" ]]; then
|
||||
validate_file ".env.example" "template"
|
||||
fi
|
||||
|
||||
|
||||
if [[ -f ".env" ]]; then
|
||||
validate_file ".env" "development"
|
||||
fi
|
||||
|
||||
|
||||
if [[ -f ".env.production" ]]; then
|
||||
validate_file ".env.production" "production"
|
||||
fi
|
||||
|
||||
|
||||
# Cross-file validation
|
||||
validate_consistency
|
||||
|
||||
|
||||
# Kubernetes template validation
|
||||
validate_k8s_template
|
||||
|
||||
|
||||
print_section "Summary"
|
||||
print_success "Environment validation complete!"
|
||||
echo ""
|
||||
|
||||
Reference in New Issue
Block a user