kind: pipeline type: docker name: default trigger: branch: - main - develop event: - push - pull_request # Настройки для Drone CI/CD platform: os: linux arch: amd64 clone: depth: 1 steps: # Шаг 1: Проверка кода - name: code-quality image: python:3.12-slim environment: PYTHONPATH: /drone/src commands: - apt-get update && apt-get install -y git - pip install --upgrade pip - pip install flake8 black isort mypy - echo "🔍 Проверка стиля кода..." - flake8 --max-line-length=120 --ignore=E203,E501,W503 src/ main.py || echo "⚠️ Предупреждения flake8" - echo "🎨 Проверка форматирования..." - black --check --line-length=120 src/ main.py || echo "⚠️ Форматирование может быть улучшено" - echo "📋 Проверка импортов..." - isort --check-only --profile black src/ main.py || echo "⚠️ Импорты могут быть улучшены" when: event: - push - pull_request # Шаг 2: Установка зависимостей - name: install-dependencies image: python:3.12-slim environment: PYTHONPATH: /drone/src commands: - echo "📦 Установка зависимостей..." - pip install --upgrade pip - pip install -r requirements.txt - echo "✅ Зависимости установлены" when: event: - push - pull_request # Шаг 3: Проверка импортов и синтаксиса - name: syntax-check image: python:3.12-slim environment: PYTHONPATH: /drone/src DATABASE_URL: sqlite+aiosqlite:///./test.db commands: - pip install --upgrade pip - pip install -r requirements.txt - echo "🔍 Проверка синтаксиса Python..." - python -m py_compile main.py - python -m py_compile src/core/*.py - python -m py_compile src/handlers/*.py - python -m py_compile src/utils/*.py - python -m py_compile src/display/*.py - echo "🧪 Проверка импортов..." - python -c "from src.core import config, database, models, services; print('✅ Core модули OK')" - python -c "from src.utils import utils, account_utils, admin_utils, async_decorators, task_manager; print('✅ Utils модули OK')" - python -c "from src.display import winner_display; print('✅ Display модули OK')" - echo "✅ Все модули импортируются корректно" when: event: - push - pull_request # Шаг 4: Инициализация тестовой БД - name: database-init image: python:3.12-slim environment: PYTHONPATH: /drone/src DATABASE_URL: sqlite+aiosqlite:///./test.db commands: - pip install --upgrade pip - pip install -r requirements.txt - echo "🗄️ Инициализация тестовой базы данных..." - python -c "from src.core.database import init_db; import asyncio; asyncio.run(init_db())" - echo "✅ Тестовая БД инициализирована" when: event: - push - pull_request # Шаг 5: Запуск тестов - name: run-tests image: python:3.12-slim environment: PYTHONPATH: /drone/src DATABASE_URL: sqlite+aiosqlite:///./test.db BOT_TOKEN: "dummy_token_for_tests" ADMIN_IDS: "123456789" commands: - pip install --upgrade pip - pip install -r requirements.txt - echo "🧪 Запуск тестов..." - python tests/test_basic_features.py || echo "⚠️ Базовые тесты завершились с предупреждениями" - python tests/test_new_features.py || echo "⚠️ Тесты новых функций завершились с предупреждениями" - echo "✅ Тесты выполнены" when: event: - push - pull_request # Шаг 6: Создание артефактов (только для main ветки) - name: build-artifacts image: python:3.12-slim commands: - echo "📦 Создание артефактов сборки..." - mkdir -p dist - tar -czf dist/lottery_bot_${DRONE_BUILD_NUMBER}.tar.gz src/ main.py requirements.txt Makefile README.md alembic.ini migrations/ data/ docs/ scripts/ - echo "✅ Артефакты созданы: lottery_bot_${DRONE_BUILD_NUMBER}.tar.gz" - ls -la dist/ when: branch: - main event: - push # Шаг 7: Уведомления о результатах - name: notify-success image: plugins/webhook settings: urls: - https://discord.com/api/webhooks/YOUR_WEBHOOK_URL # Замените на ваш webhook headers: Content-Type: application/json template: | { "content": "✅ **Build Success** - Lottery Bot\n**Branch:** {{build.branch}}\n**Commit:** {{build.commit}}\n**Build:** #{{build.number}}\n**Author:** {{build.author}}" } when: status: - success branch: - main event: - push - name: notify-failure image: plugins/webhook settings: urls: - https://discord.com/api/webhooks/YOUR_WEBHOOK_URL # Замените на ваш webhook headers: Content-Type: application/json template: | { "content": "❌ **Build Failed** - Lottery Bot\n**Branch:** {{build.branch}}\n**Commit:** {{build.commit}}\n**Build:** #{{build.number}}\n**Author:** {{build.author}}\n**Logs:** {{build.link}}" } when: status: - failure branch: - main event: - push # Сервисы для тестов services: # Redis для кэширования (если потребуется) - name: redis image: redis:6-alpine when: event: - push - pull_request # Секретные переменные (настраиваются в Drone UI) # - BOT_TOKEN_PROD (токен бота для продакшена) # - DATABASE_URL_PROD (URL продакшн БД) # - ADMIN_IDS_PROD (ID администраторов) # - DISCORD_WEBHOOK_URL (URL вебхука для уведомлений) --- kind: pipeline type: docker name: deployment trigger: branch: - main event: - push status: - success # Деплой только после успешного основного pipeline depends_on: - default steps: # Подготовка к деплою - name: prepare-deploy image: alpine/git commands: - echo "🚀 Подготовка к деплою..." - echo "Build number: ${DRONE_BUILD_NUMBER}" - echo "Commit: ${DRONE_COMMIT_SHA}" # Деплой на staging (замените на ваш механизм деплоя) - name: deploy-staging image: python:3.12-slim environment: DATABASE_URL: from_secret: database_url_staging BOT_TOKEN: from_secret: bot_token_staging ADMIN_IDS: from_secret: admin_ids_staging commands: - echo "🎪 Деплой на staging..." - pip install -r requirements.txt - echo "✅ Staging deployment complete" # Здесь добавьте команды для деплоя на ваш staging сервер when: branch: - main # Уведомление о деплое - name: notify-deploy image: plugins/webhook settings: urls: - https://discord.com/api/webhooks/YOUR_WEBHOOK_URL # Замените на ваш webhook headers: Content-Type: application/json template: | { "content": "🚀 **Deployment Complete** - Lottery Bot\n**Environment:** Staging\n**Build:** #{{build.number}}\n**Commit:** {{build.commit}}" } when: status: - success branch: - main