mirror of
https://github.com/cassandra/home-information.git
synced 2026-04-17 13:08:36 -04:00
* Add development setup helper script (Issue #7) - Create comprehensive setup script deploy/dev-setup.sh - Automates git configuration, environment setup, virtual environment creation - Handles package installation and database initialization - Interactive prompts for user input with validation - Idempotent design allows safe repeated execution - Update docs/dev/Setup.md to reference new automated setup option - Maintain existing manual setup instructions as alternative * Update CLAUDE.md with GitHub issue template guidance - Add section on creating GitHub issues - Document available issue templates - Include examples of using gh CLI with templates - Note that blank issues are disabled
374 lines
10 KiB
Bash
Executable File
374 lines
10 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Home Information Development Setup Script
|
|
#
|
|
# This script automates the development environment setup for new developers.
|
|
# It handles git configuration, environment setup, virtual environment creation,
|
|
# package installation, and database initialization.
|
|
#
|
|
# Usage: ./deploy/dev-setup.sh
|
|
#
|
|
# The script is idempotent and can be run multiple times safely.
|
|
|
|
set -e # Exit on error
|
|
|
|
# Color output functions (matching env-generate.py style)
|
|
print_debug() {
|
|
echo "[DEBUG] $1"
|
|
}
|
|
|
|
print_notice() {
|
|
echo ""
|
|
echo "[NOTICE] $1"
|
|
echo ""
|
|
}
|
|
|
|
print_warning() {
|
|
echo ""
|
|
echo -e "\033[96m[WARNING]\033[0m $1"
|
|
echo ""
|
|
}
|
|
|
|
print_error() {
|
|
echo ""
|
|
echo -e "\033[91m[ERROR]\033[0m $1"
|
|
echo ""
|
|
}
|
|
|
|
print_success() {
|
|
echo -e "\033[32m[SUCCESS]\033[0m $1"
|
|
}
|
|
|
|
print_important() {
|
|
local message="$1"
|
|
local width=80
|
|
local border=$(printf '%*s' "$width" | tr ' ' ' ')
|
|
|
|
echo ""
|
|
echo -e "\033[7m${border}\033[0m"
|
|
echo "$message" | while IFS= read -r line; do
|
|
printf "\033[7m%-${width}s\033[0m\n" "$line"
|
|
done
|
|
echo -e "\033[7m${border}\033[0m"
|
|
echo ""
|
|
}
|
|
|
|
# Function to prompt for yes/no
|
|
prompt_yes_no() {
|
|
local message="$1"
|
|
local default="$2"
|
|
local prompt
|
|
|
|
if [[ "$default" == "y" ]]; then
|
|
prompt="[Y/n]"
|
|
elif [[ "$default" == "n" ]]; then
|
|
prompt="[y/N]"
|
|
else
|
|
prompt="[y/n]"
|
|
fi
|
|
|
|
while true; do
|
|
read -p "$message $prompt: " answer
|
|
answer=$(echo "$answer" | tr '[:upper:]' '[:lower:]')
|
|
|
|
if [[ -z "$answer" && -n "$default" ]]; then
|
|
answer="$default"
|
|
fi
|
|
|
|
if [[ "$answer" == "y" || "$answer" == "yes" ]]; then
|
|
return 0
|
|
elif [[ "$answer" == "n" || "$answer" == "no" ]]; then
|
|
return 1
|
|
else
|
|
print_warning "Please answer 'y' or 'n'"
|
|
fi
|
|
done
|
|
}
|
|
|
|
# Function to prompt for string input
|
|
prompt_string() {
|
|
local message="$1"
|
|
local default="$2"
|
|
local prompt=""
|
|
|
|
if [[ -n "$default" ]]; then
|
|
prompt=" [$default]"
|
|
fi
|
|
|
|
read -p "$message$prompt: " value
|
|
|
|
if [[ -z "$value" && -n "$default" ]]; then
|
|
value="$default"
|
|
fi
|
|
|
|
echo "$value"
|
|
}
|
|
|
|
# Check if command exists
|
|
command_exists() {
|
|
command -v "$1" >/dev/null 2>&1
|
|
}
|
|
|
|
# Main setup script starts here
|
|
print_important "Home Information Development Setup
|
|
|
|
This script will help you set up your development environment.
|
|
It will guide you through:
|
|
- Git configuration
|
|
- Environment variable setup
|
|
- Python virtual environment creation
|
|
- Package installation
|
|
- Database initialization
|
|
|
|
The script is safe to run multiple times."
|
|
|
|
# Step 1: Pre-flight checks
|
|
print_notice "Step 1: Pre-flight Checks"
|
|
|
|
# Check if we're in the project root
|
|
if [[ ! -f "HI_VERSION" || ! -d "deploy" || ! -d "docs" ]]; then
|
|
print_error "This script must be run from the project root directory."
|
|
print_notice "Please cd to the home-information directory and try again."
|
|
exit 1
|
|
fi
|
|
print_success "Running from correct directory"
|
|
|
|
# Check Python 3.11
|
|
if command_exists python3.11; then
|
|
print_success "Python 3.11 found"
|
|
PYTHON_CMD="python3.11"
|
|
elif command_exists python3; then
|
|
PYTHON_VERSION=$(python3 --version 2>&1 | awk '{print $2}')
|
|
if [[ "$PYTHON_VERSION" == 3.11* ]]; then
|
|
print_success "Python 3.11 found"
|
|
PYTHON_CMD="python3"
|
|
else
|
|
print_warning "Python 3.11 not found (found $PYTHON_VERSION instead)"
|
|
print_notice "Python 3.11 is recommended. You may experience issues with other versions."
|
|
if ! prompt_yes_no "Continue anyway?" "n"; then
|
|
exit 1
|
|
fi
|
|
PYTHON_CMD="python3"
|
|
fi
|
|
else
|
|
print_error "Python 3 not found. Please install Python 3.11 and try again."
|
|
exit 1
|
|
fi
|
|
|
|
# Check git
|
|
if ! command_exists git; then
|
|
print_error "Git is not installed. Please install git and try again."
|
|
exit 1
|
|
fi
|
|
print_success "Git found"
|
|
|
|
# Check Redis (warning only)
|
|
if ! command_exists redis-server && ! command_exists redis-cli; then
|
|
print_warning "Redis not found. You'll need Redis to run the application."
|
|
print_notice "You can install Redis later and continue with the setup now."
|
|
if ! prompt_yes_no "Continue without Redis?" "y"; then
|
|
print_notice "Please install Redis and run this script again."
|
|
exit 1
|
|
fi
|
|
else
|
|
print_success "Redis found"
|
|
fi
|
|
|
|
# Check make
|
|
if ! command_exists make; then
|
|
print_error "Make is not installed. Please install make and try again."
|
|
exit 1
|
|
fi
|
|
print_success "Make found"
|
|
|
|
# Step 2: Git Configuration
|
|
print_notice "Step 2: Git Configuration"
|
|
|
|
# Check if git user is configured
|
|
GIT_USER_NAME=$(git config --global user.name || echo "")
|
|
GIT_USER_EMAIL=$(git config --global user.email || echo "")
|
|
|
|
if [[ -z "$GIT_USER_NAME" ]]; then
|
|
print_notice "Git user name not configured"
|
|
GIT_USER_NAME=$(prompt_string "Enter your full name")
|
|
git config --global user.name "$GIT_USER_NAME"
|
|
print_success "Git user name configured"
|
|
else
|
|
print_success "Git user name already configured: $GIT_USER_NAME"
|
|
fi
|
|
|
|
if [[ -z "$GIT_USER_EMAIL" ]]; then
|
|
print_notice "Git user email not configured"
|
|
GIT_USER_EMAIL=$(prompt_string "Enter your email address")
|
|
git config --global user.email "$GIT_USER_EMAIL"
|
|
print_success "Git user email configured"
|
|
else
|
|
print_success "Git user email already configured: $GIT_USER_EMAIL"
|
|
fi
|
|
|
|
# Check remote configuration
|
|
CURRENT_ORIGIN=$(git remote get-url origin 2>/dev/null || echo "")
|
|
CURRENT_UPSTREAM=$(git remote get-url upstream 2>/dev/null || echo "")
|
|
|
|
if [[ -z "$CURRENT_ORIGIN" ]]; then
|
|
print_warning "No 'origin' remote configured"
|
|
print_notice "This should point to your fork of the repository"
|
|
GITHUB_USERNAME=$(prompt_string "Enter your GitHub username")
|
|
|
|
if prompt_yes_no "Do you have SSH keys set up with GitHub?" "n"; then
|
|
git remote add origin "git@github.com:${GITHUB_USERNAME}/home-information.git"
|
|
else
|
|
git remote add origin "https://github.com/${GITHUB_USERNAME}/home-information.git"
|
|
fi
|
|
print_success "Origin remote configured"
|
|
else
|
|
print_success "Origin remote already configured"
|
|
fi
|
|
|
|
if [[ -z "$CURRENT_UPSTREAM" ]]; then
|
|
print_notice "Adding upstream remote"
|
|
git remote add upstream https://github.com/cassandra/home-information.git
|
|
print_success "Upstream remote configured"
|
|
else
|
|
print_success "Upstream remote already configured"
|
|
fi
|
|
|
|
# Verify remotes
|
|
print_notice "Git remotes configured:"
|
|
git remote -v
|
|
|
|
# Step 3: Environment Setup
|
|
print_notice "Step 3: Environment Setup"
|
|
|
|
# Check if environment file exists
|
|
ENV_FILE=".private/env/development.sh"
|
|
if [[ ! -f "$ENV_FILE" ]]; then
|
|
print_notice "Environment file not found. Creating it now..."
|
|
make env-build-dev
|
|
print_success "Environment file created"
|
|
else
|
|
print_success "Environment file already exists"
|
|
if prompt_yes_no "Do you want to regenerate the environment file?" "n"; then
|
|
make env-build-dev
|
|
print_success "Environment file regenerated"
|
|
fi
|
|
fi
|
|
|
|
# Step 4: Python Virtual Environment
|
|
print_notice "Step 4: Python Virtual Environment"
|
|
|
|
if [[ ! -d "venv" ]]; then
|
|
print_notice "Creating Python virtual environment..."
|
|
$PYTHON_CMD -m venv venv
|
|
print_success "Virtual environment created"
|
|
else
|
|
print_success "Virtual environment already exists"
|
|
fi
|
|
|
|
# Activate virtual environment
|
|
print_notice "Activating virtual environment..."
|
|
source venv/bin/activate
|
|
print_success "Virtual environment activated"
|
|
|
|
# Source environment variables
|
|
print_notice "Loading environment variables..."
|
|
source "$ENV_FILE"
|
|
print_success "Environment variables loaded"
|
|
|
|
# Step 5: Install Python Packages
|
|
print_notice "Step 5: Installing Python Packages"
|
|
|
|
print_notice "Installing development requirements..."
|
|
pip install --quiet --upgrade pip
|
|
pip install --quiet -r src/hi/requirements/development.txt
|
|
print_success "Python packages installed"
|
|
|
|
# Step 6: Database Initialization
|
|
print_notice "Step 6: Database Initialization"
|
|
|
|
cd src
|
|
|
|
# Run Django check
|
|
print_notice "Running Django system check..."
|
|
if ./manage.py check; then
|
|
print_success "Django system check passed"
|
|
else
|
|
print_error "Django system check failed"
|
|
exit 1
|
|
fi
|
|
|
|
# Run migrations
|
|
print_notice "Running database migrations..."
|
|
./manage.py migrate
|
|
print_success "Database migrations completed"
|
|
|
|
# Create superuser
|
|
if ./manage.py shell -c "from django.contrib.auth import get_user_model; User = get_user_model(); exit(0 if User.objects.filter(is_superuser=True).exists() else 1)" 2>/dev/null; then
|
|
print_success "Superuser already exists"
|
|
else
|
|
print_notice "Creating superuser..."
|
|
./manage.py hi_createsuperuser
|
|
print_success "Superuser created"
|
|
fi
|
|
|
|
# Create groups
|
|
print_notice "Creating user groups..."
|
|
./manage.py hi_creategroups
|
|
print_success "User groups created"
|
|
|
|
# Step 7: Run Tests
|
|
print_notice "Step 7: Validation"
|
|
|
|
if prompt_yes_no "Run unit tests to validate installation?" "y"; then
|
|
print_notice "Running unit tests..."
|
|
if ./manage.py test; then
|
|
print_success "All tests passed!"
|
|
else
|
|
print_warning "Some tests failed. This might be expected if you haven't set up all services yet."
|
|
fi
|
|
else
|
|
print_notice "Skipping unit tests"
|
|
fi
|
|
|
|
cd ..
|
|
|
|
# Final Summary
|
|
print_important "Setup Complete!
|
|
|
|
Your development environment is now configured.
|
|
|
|
Django Admin Credentials:
|
|
- Check $ENV_FILE for credentials
|
|
- URL: http://127.0.0.1:8411/admin/
|
|
|
|
Next Steps:
|
|
1. Start Redis server (if installed):
|
|
redis-server
|
|
|
|
2. In a new terminal, activate the environment:
|
|
. ./init-env-dev.sh
|
|
|
|
3. Start the development server:
|
|
cd src
|
|
./manage.py runserver
|
|
|
|
4. Visit http://127.0.0.1:8411
|
|
|
|
For daily development, just run:
|
|
. ./init-env-dev.sh
|
|
|
|
Happy coding!"
|
|
|
|
# Extract and display admin credentials if available
|
|
if [[ -f "$ENV_FILE" ]]; then
|
|
ADMIN_EMAIL=$(grep "DJANGO_SUPERUSER_EMAIL" "$ENV_FILE" | cut -d'"' -f2)
|
|
ADMIN_PASSWORD=$(grep "DJANGO_SUPERUSER_PASSWORD" "$ENV_FILE" | cut -d'"' -f2)
|
|
|
|
if [[ -n "$ADMIN_EMAIL" && -n "$ADMIN_PASSWORD" ]]; then
|
|
print_important "Admin Credentials:
|
|
Email: $ADMIN_EMAIL
|
|
Password: $ADMIN_PASSWORD
|
|
|
|
Please save these credentials securely!"
|
|
fi
|
|
fi |