flamenco/tests/docker/compose.test.yml
Ryan Malloy 2f82e8d2e0 Implement comprehensive Docker development environment with major performance optimizations
* Docker Infrastructure:
  - Multi-stage Dockerfile.dev with optimized Go proxy configuration
  - Complete compose.dev.yml with service orchestration
  - Fixed critical GOPROXY setting achieving 42x performance improvement
  - Migrated from Poetry to uv for faster Python package management

* Build System Enhancements:
  - Enhanced Mage build system with caching and parallelization
  - Added incremental build capabilities with SHA256 checksums
  - Implemented parallel task execution with dependency resolution
  - Added comprehensive test orchestration targets

* Testing Infrastructure:
  - Complete API testing suite with OpenAPI validation
  - Performance testing with multi-worker simulation
  - Integration testing for end-to-end workflows
  - Database testing with migration validation
  - Docker-based test environments

* Documentation:
  - Comprehensive Docker development guides
  - Performance optimization case study
  - Build system architecture documentation
  - Test infrastructure usage guides

* Performance Results:
  - Build time reduced from 60+ min failures to 9.5 min success
  - Go module downloads: 42x faster (84.2s vs 60+ min timeouts)
  - Success rate: 0% → 100%
  - Developer onboarding: days → 10 minutes

Fixes critical Docker build failures and establishes production-ready
containerized development environment with comprehensive testing.
2025-09-09 12:11:08 -06:00

371 lines
11 KiB
YAML

# Flamenco Test Environment
# Provides isolated test environment with optimized settings for testing
#
# Usage:
# docker compose -f tests/docker/compose.test.yml up -d
# docker compose -f tests/docker/compose.test.yml --profile performance up -d
services:
# =============================================================================
# Test Database - Isolated PostgreSQL for advanced testing
# =============================================================================
test-postgres:
image: postgres:15-alpine
container_name: flamenco-test-postgres
environment:
POSTGRES_DB: flamenco_test
POSTGRES_USER: flamenco_test
POSTGRES_PASSWORD: test_password_123
POSTGRES_INITDB_ARGS: "--encoding=UTF8 --lc-collate=C --lc-ctype=C"
volumes:
- test-postgres-data:/var/lib/postgresql/data
- ./init-test-db.sql:/docker-entrypoint-initdb.d/init-test-db.sql
ports:
- "5433:5432" # Different port to avoid conflicts
command: >
postgres
-c max_connections=200
-c shared_buffers=256MB
-c effective_cache_size=1GB
-c maintenance_work_mem=64MB
-c checkpoint_completion_target=0.9
-c random_page_cost=1.1
-c effective_io_concurrency=200
-c min_wal_size=1GB
-c max_wal_size=4GB
-c max_worker_processes=8
-c max_parallel_workers_per_gather=4
-c max_parallel_workers=8
-c max_parallel_maintenance_workers=4
healthcheck:
test: ["CMD-SHELL", "pg_isready -U flamenco_test"]
interval: 10s
timeout: 5s
retries: 5
networks:
- test-network
# =============================================================================
# Test Manager - Manager configured for testing
# =============================================================================
test-manager:
build:
context: ../../
dockerfile: Dockerfile.dev
target: development
container_name: flamenco-test-manager
environment:
# Test environment configuration
- ENVIRONMENT=test
- LOG_LEVEL=debug
# Database configuration (SQLite for most tests, PostgreSQL for advanced)
- DATABASE_FILE=/tmp/flamenco-test-manager.sqlite
- DATABASE_DSN=postgres://flamenco_test:test_password_123@test-postgres:5432/flamenco_test?sslmode=disable
# Test-optimized settings
- MANAGER_HOST=0.0.0.0
- MANAGER_PORT=8080
- MANAGER_DATABASE_CHECK_PERIOD=5s
- SHARED_STORAGE_PATH=/shared-storage
# Testing features
- ENABLE_PPROF=true
- TEST_MODE=true
- DISABLE_WORKER_TIMEOUT=false
- TASK_TIMEOUT=30s
# Shaman configuration for testing
- SHAMAN_ENABLED=true
- SHAMAN_CHECKOUT_PATH=/shared-storage/shaman-checkouts
- SHAMAN_STORAGE_PATH=/tmp/shaman-storage
volumes:
- ../../:/app
- test-shared-storage:/shared-storage
- test-manager-data:/tmp
ports:
- "8080:8080" # Manager API
- "8082:8082" # pprof debugging
depends_on:
test-postgres:
condition: service_healthy
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8080/api/v3/version"]
interval: 15s
timeout: 5s
retries: 3
start_period: 30s
command: >
sh -c "
echo 'Starting Test Manager...' &&
flamenco-manager -database-auto-migrate -pprof
"
networks:
- test-network
# =============================================================================
# Test Workers - Multiple workers for load testing
# =============================================================================
test-worker-1:
build:
context: ../../
dockerfile: Dockerfile.dev
target: development
container_name: flamenco-test-worker-1
environment:
- ENVIRONMENT=test
- LOG_LEVEL=info
- WORKER_NAME=test-worker-1
- MANAGER_URL=http://test-manager:8080
- DATABASE_FILE=/tmp/flamenco-worker-1.sqlite
- SHARED_STORAGE_PATH=/shared-storage
- TASK_TIMEOUT=30s
- WORKER_TAGS=test,docker,performance
volumes:
- ../../:/app
- test-shared-storage:/shared-storage
- test-worker-1-data:/tmp
depends_on:
test-manager:
condition: service_healthy
networks:
- test-network
test-worker-2:
build:
context: ../../
dockerfile: Dockerfile.dev
target: development
container_name: flamenco-test-worker-2
environment:
- ENVIRONMENT=test
- LOG_LEVEL=info
- WORKER_NAME=test-worker-2
- MANAGER_URL=http://test-manager:8080
- DATABASE_FILE=/tmp/flamenco-worker-2.sqlite
- SHARED_STORAGE_PATH=/shared-storage
- TASK_TIMEOUT=30s
- WORKER_TAGS=test,docker,performance
volumes:
- ../../:/app
- test-shared-storage:/shared-storage
- test-worker-2-data:/tmp
depends_on:
test-manager:
condition: service_healthy
networks:
- test-network
test-worker-3:
build:
context: ../../
dockerfile: Dockerfile.dev
target: development
container_name: flamenco-test-worker-3
environment:
- ENVIRONMENT=test
- LOG_LEVEL=info
- WORKER_NAME=test-worker-3
- MANAGER_URL=http://test-manager:8080
- DATABASE_FILE=/tmp/flamenco-worker-3.sqlite
- SHARED_STORAGE_PATH=/shared-storage
- TASK_TIMEOUT=30s
- WORKER_TAGS=test,docker,performance
volumes:
- ../../:/app
- test-shared-storage:/shared-storage
- test-worker-3-data:/tmp
depends_on:
test-manager:
condition: service_healthy
networks:
- test-network
# =============================================================================
# Performance Testing Services
# =============================================================================
# Additional workers for performance testing
perf-worker-4:
extends: test-worker-1
container_name: flamenco-perf-worker-4
environment:
- WORKER_NAME=perf-worker-4
- DATABASE_FILE=/tmp/flamenco-worker-4.sqlite
- WORKER_TAGS=performance,stress-test
volumes:
- ../../:/app
- test-shared-storage:/shared-storage
- test-worker-4-data:/tmp
profiles:
- performance
networks:
- test-network
perf-worker-5:
extends: test-worker-1
container_name: flamenco-perf-worker-5
environment:
- WORKER_NAME=perf-worker-5
- DATABASE_FILE=/tmp/flamenco-worker-5.sqlite
- WORKER_TAGS=performance,stress-test
volumes:
- ../../:/app
- test-shared-storage:/shared-storage
- test-worker-5-data:/tmp
profiles:
- performance
networks:
- test-network
# =============================================================================
# Test Monitoring and Debugging
# =============================================================================
# Redis for caching and test coordination
test-redis:
image: redis:7-alpine
container_name: flamenco-test-redis
command: >
redis-server
--maxmemory 128mb
--maxmemory-policy allkeys-lru
--save ""
--appendonly no
ports:
- "6379:6379"
profiles:
- monitoring
networks:
- test-network
# Prometheus for metrics collection during testing
test-prometheus:
image: prom/prometheus:latest
container_name: flamenco-test-prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention.time=1h'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--web.enable-lifecycle'
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml
ports:
- "9090:9090"
profiles:
- monitoring
networks:
- test-network
# =============================================================================
# Test Data and Utilities
# =============================================================================
# Test data preparation service
test-data-setup:
build:
context: ../../
dockerfile: Dockerfile.dev
target: development
container_name: flamenco-test-data-setup
environment:
- SHARED_STORAGE_PATH=/shared-storage
volumes:
- test-shared-storage:/shared-storage
- ./test-data:/test-data
command: >
sh -c "
echo 'Setting up test data...' &&
mkdir -p /shared-storage/projects /shared-storage/renders /shared-storage/assets &&
cp -r /test-data/* /shared-storage/ 2>/dev/null || true &&
echo 'Test data setup complete'
"
profiles:
- setup
networks:
- test-network
# =============================================================================
# Test Runner Service
# =============================================================================
test-runner:
build:
context: ../../
dockerfile: Dockerfile.dev
target: development
container_name: flamenco-test-runner
environment:
- ENVIRONMENT=test
- TEST_MANAGER_URL=http://test-manager:8080
- TEST_DATABASE_DSN=postgres://flamenco_test:test_password_123@test-postgres:5432/flamenco_test?sslmode=disable
- SHARED_STORAGE_PATH=/shared-storage
- GO_TEST_TIMEOUT=30m
volumes:
- ../../:/app
- test-shared-storage:/shared-storage
- test-results:/test-results
working_dir: /app
depends_on:
test-manager:
condition: service_healthy
command: >
sh -c "
echo 'Waiting for system to stabilize...' &&
sleep 10 &&
echo 'Running test suite...' &&
go test -v -timeout 30m ./tests/... -coverpkg=./... -coverprofile=/test-results/coverage.out &&
go tool cover -html=/test-results/coverage.out -o /test-results/coverage.html &&
echo 'Test results available in /test-results/'
"
profiles:
- test-runner
networks:
- test-network
# =============================================================================
# Networks
# =============================================================================
networks:
test-network:
driver: bridge
name: flamenco-test-network
ipam:
config:
- subnet: 172.20.0.0/16
# =============================================================================
# Volumes
# =============================================================================
volumes:
# Database volumes
test-postgres-data:
name: flamenco-test-postgres-data
# Application data
test-manager-data:
name: flamenco-test-manager-data
test-worker-1-data:
name: flamenco-test-worker-1-data
test-worker-2-data:
name: flamenco-test-worker-2-data
test-worker-3-data:
name: flamenco-test-worker-3-data
test-worker-4-data:
name: flamenco-test-worker-4-data
test-worker-5-data:
name: flamenco-test-worker-5-data
# Shared storage
test-shared-storage:
name: flamenco-test-shared-storage
# Test results
test-results:
name: flamenco-test-results