# Changelog All notable changes to The Scheduler will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [1.1.3] - 2026-01-08 ### Changed - Test release to validate CI/CD auto-deploy workflow ## [1.1.2] - 2026-01-03 ### Fixed - CI: Use curl for release creation (release-action requires Go) ## [1.1.1] - 2026-01-03 ### Changed - CI: Auto-create Gitea release on version tag push (v*) instead of manual release trigger ## [1.1.0] - 2025-12-14 ### Added - **Gitea Release Cleanup Executor** (`gitea_release_cleanup_executor.py`) - Automatically cleans up old releases across all Gitea repositories - Configurable retention count (default: 5 releases per repo) - Repository exclusion list support - Dry-run mode for safe testing - Designed to run before Watchtower to prevent image tag accumulation - **GITEA_TOKEN setting** in config for API token authentication (separate from password) ## [1.0.4] - 2025-12-14 ### Fixed - CI/CD: Correct Watchtower port (8080) ## [1.0.3] - 2025-12-14 ### Added - CI/CD: Trigger Watchtower update after successful Docker build ## [1.0.2] - 2025-12-14 ### Fixed - Removed unused `setup_database.sql` from Dockerfile (database schema managed externally) ## [1.0.1] - 2025-12-14 ### Changed - **Version tracking now uses pyproject.toml** as single source of truth - Added `pyproject.toml` with project metadata and dependencies - `config.py` reads version from pyproject.toml using `tomllib` - FastAPI app title and version dynamically loaded from config - Health endpoint now includes version in response - Dockerfile updated to include pyproject.toml ## [1.0.0] - 2025-12-07 ### Added #### Core Scheduling System - **Hybrid APScheduler + PostgreSQL architecture** for minute-based task scheduling - Single scheduler job runs every minute - Queries database for tasks scheduled for current minute - Executes up to 5 tasks concurrently by priority - Priority queue system (1-100, lower = higher priority) - **Cron-like scheduling** with wildcard support (`-1` = any) - Supports minute, hour, day_of_month, month, day_of_week patterns - Flexible scheduling from every-minute to specific dates - **Task execution tracking** with full audit trail - Database tables: `scheduled_tasks` (definitions) and `task_executions` (history) - Tracks status, duration, output, errors, and retry attempts - Execution metadata stored as JSONB #### REST API - **Full CRUD API** for task management with FastAPI - `POST /tasks` - Create new scheduled task - `GET /tasks` - List all tasks with filtering (service, enabled) - `GET /tasks/{name}` - Get task details - `PUT /tasks/{name}` - Update task configuration - `DELETE /tasks/{name}` - Remove task - `POST /tasks/{name}/trigger` - Manually trigger task execution - **Execution history endpoints** - `GET /executions` - Query execution history - Filter by task_name, status, service - Pagination support (limit parameter) - **System monitoring endpoints** - `GET /health` - Health check - `GET /stats` - System statistics (enabled tasks, running tasks, 24h execution counts) - **API Key authentication** (Bearer token) for all protected endpoints - **OpenAPI documentation** at `/docs` #### Task Executors - **Example Executor** (`example_executor.py`) - Simple test implementation with configurable message and delay - Demonstrates executor pattern - **Documentation Sync Executor** (`doc_sync_executor.py`) - Mirrors documentation from upstream Git repositories to Gitea - Supports full repository mirroring or selective path syncing - Creates date-tagged snapshots (YYYY-MM-DD format) - Generates `.SYNC_INFO.md` with sync metadata - Configurable upstream repo, paths, branch, and Gitea destination - **Config Backup Executor** (`config_backup_executor.py`) - Backs up Docker configurations and data directories - Supports multiple source paths with exclusion patterns - Optional compression (tar.gz) - Retention policy (days-based cleanup) - Creates timestamped backups #### Pre-configured Tasks - **FastAPI Documentation Sync** (monthly on 11th at 04:00) - Syncs entire FastAPI repository to `library/docs-fastapi` - Priority: 60 (maintenance) - **Ollama Documentation Sync** (monthly on 12th at 04:00) - Syncs only `/docs` folder from Ollama repository to `library/docs-ollama` - Priority: 60 (maintenance) - **Docker Config Backup** (daily at 03:05) - Backs up Docker data and configurations - Priority: 20 (user task) - 30-day retention - **Example Test Task** (every minute, can be disabled) - Test task for validation - Priority: 50 (maintenance) #### Testing Infrastructure - **Comprehensive test suite** with 80% code coverage - 85 total tests across multiple test files - Pytest configuration with markers (unit, integration, api, executor) - Coverage reporting with pytest-cov - **Test categories**: - Unit tests: Fast tests with mocked dependencies - API tests: Comprehensive endpoint testing (24 tests) - Executor tests: Task executor validation - Integration tests: Real database operations - **Test database setup** - Dedicated `test_scheduler` database on postgres-shared - Automatic schema creation and cleanup - Database fixtures for clean test state - Test user: `test_scheduler_user` - **Test fixtures** (conftest.py) - Mock database connections - Mock scheduler and executor - Sample task data - Authentication headers - Clean database state management #### Documentation - **Comprehensive README.md** (500+ lines) - Architecture overview with ASCII diagram - Quick start guide - Complete API reference with curl examples - Task scheduling patterns and examples - Executor development guide - Testing guide with coverage metrics - Development and debugging information - Security and performance notes - **Test database setup guide** (test_database_setup.sql) - SQL script for creating test environment - Schema matching production - Test data fixtures #### Configuration - **Pydantic Settings** for environment-based configuration - PostgreSQL connection settings - Redis connection (for future use) - Gitea authentication - API key configuration - Computed properties (database_url, redis_url) - **Docker stack configuration** (stacks/scheduler.yml) - Virtual environment setup on startup - Git configuration for librarian user - Health checks - Network isolation (docker-dataplane) - Resource limits ### Technical Details #### Database Schema ```sql scheduled_tasks: - Task definitions/templates - Scheduling configuration (minute/hour/day patterns) - Priority, enabled status, retry settings - Task configuration as JSONB - Execution tracking fields task_executions: - Individual execution records - Status tracking (pending, running, success, failed, timeout) - Duration and timestamp tracking - Output and error details - Metadata as JSONB ``` #### Performance - Minute-based processing with lightweight scheduler ticks - Connection pooling for database efficiency - Database indexes for optimized task queries - Concurrent execution with configurable limit (default: 5) - Priority-based execution order #### Security - API key authentication required for protected endpoints - Network isolation on docker-dataplane - Environment variable-based secrets - Gitea token authentication for git operations - Database credentials in environment ### Dependencies - FastAPI (web framework) - APScheduler (task scheduling) - psycopg2-binary (PostgreSQL driver) - Pydantic (configuration management) - pytest + pytest-asyncio + pytest-cov (testing) - GitPython (git operations) ### Coverage Metrics ``` Module Coverage ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ config.py 100% ✅ example_executor.py 100% ✅ main.py (API endpoints) 95% ✅ doc_sync_executor.py 78% ✅ executor.py (core logic) 71% ✅ config_backup_executor.py 50% 📈 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ TOTAL 80% 🎯 ``` ## [Unreleased] ### Planned - Redis integration for distributed locking - Webhook notifications for task completion - Task dependencies (run task B after task A succeeds) - Task groups and tags - More executors (database backup, log rotation, etc.) - Web UI for task management - Metrics export (Prometheus) - Advanced scheduling (last business day of month, etc.)