Files
home-information/deploy/dev-setup.sh
cassandra-ai-agent a44c973412 [Ops] Add Development Setup Helper Script (Issue #7) (#72)
* 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
2025-08-20 23:33:59 +00:00

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