name: 'Deploy on push' on: [push] jobs: deploy: runs-on: ubuntu-latest steps: - name: Cloning repo uses: actions/checkout@v4 with: fetch-depth: 0 - name: Install uv run: | # Try multiple installation methods for uv if curl -LsSf https://astral.sh/uv/install.sh | sh; then echo "uv installed successfully via install script" elif curl -LsSf https://github.com/astral-sh/uv/releases/latest/download/uv-installer.sh | sh; then echo "uv installed successfully via GitHub installer" else echo "uv installation failed, using pip fallback" pip install uv fi echo "$HOME/.cargo/bin" >> $GITHUB_PATH - name: Prepare Environment run: | uv --version python3 --version - name: Install Dependencies run: | uv sync --frozen uv sync --group dev - name: Run linting and type checking run: | echo "🔍 Запускаем проверки качества кода..." # Ruff linting echo "📝 Проверяем код с помощью Ruff..." if uv run ruff check .; then echo "✅ Ruff проверка прошла успешно" else echo "❌ Ruff нашел проблемы в коде" exit 1 fi # Ruff formatting check echo "🎨 Проверяем форматирование с помощью Ruff..." if uv run ruff format --check .; then echo "✅ Форматирование корректно" else echo "❌ Код не отформатирован согласно стандартам" exit 1 fi # MyPy type checking echo "🏷️ Проверяем типы с помощью MyPy..." if uv run mypy . --ignore-missing-imports; then echo "✅ MyPy проверка прошла успешно" else echo "❌ MyPy нашел проблемы с типами" exit 1 fi - name: Install Node.js Dependencies run: | npm ci - name: Build Frontend run: | npm run build - name: Setup Playwright (use pre-installed browsers) env: PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1 run: | # Используем предустановленные браузеры в системе npx playwright --version - name: Run Tests env: PLAYWRIGHT_HEADLESS: "true" run: | # Запускаем тесты, но позволяем им фейлиться # continue-on-error: true не работает в Gitea Actions, поэтому используем || true uv run pytest tests/ -v || echo "⚠️ Тесты завершились с ошибками, но продолжаем деплой" continue-on-error: true - name: Restore Git Repository if: always() run: | echo "🔧 Восстанавливаем git репозиторий для деплоя..." # Проверяем состояние git git status || echo "⚠️ Git репозиторий поврежден, восстанавливаем..." # Если git поврежден, переинициализируем if [ ! -d ".git" ] || [ ! -f ".git/HEAD" ]; then echo "🔄 Переинициализируем git репозиторий..." git init git remote add origin https://github.com/${{ github.repository }}.git git fetch origin git checkout ${{ github.ref_name }} fi # Проверяем финальное состояние git status echo "✅ Git репозиторий готов для деплоя" - name: Get Repo Name id: repo_name run: echo "::set-output name=repo::$(echo ${GITHUB_REPOSITORY##*/})" - name: Get Branch Name id: branch_name run: echo "::set-output name=branch::$(echo ${GITHUB_REF##*/})" - name: Verify Git Before Deploy Main if: github.ref == 'refs/heads/main' run: | echo "🔍 Проверяем git перед деплоем на main..." git status git log --oneline -5 echo "✅ Git репозиторий готов" - name: Setup SSH for Main Deploy if: github.ref == 'refs/heads/main' run: | echo "🔑 Настраиваем SSH для деплоя на v2.discours.io..." # Создаем SSH директорию mkdir -p ~/.ssh chmod 700 ~/.ssh # Добавляем приватный ключ echo "${{ secrets.V2_PRIVATE_KEY }}" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa # Добавляем v2.discours.io в known_hosts ssh-keyscan -H v2.discours.io >> ~/.ssh/known_hosts # Запускаем ssh-agent eval $(ssh-agent -s) ssh-add ~/.ssh/id_rsa echo "✅ SSH настроен для v2.discours.io" - name: Push to dokku for main branch if: github.ref == 'refs/heads/main' run: | echo "🚀 Деплоим на v2.discours.io..." # Добавляем dokku remote git remote add dokku ssh://dokku@v2.discours.io:22/discoursio-api || git remote set-url dokku ssh://dokku@v2.discours.io:22/discoursio-api # Проверяем remote git remote -v # Деплоим текущую ветку git push dokku main:main -f echo "✅ Деплой на main завершен" - name: Verify Git Before Deploy if: github.ref == 'refs/heads/dev' run: | echo "🔍 Проверяем git перед деплоем на dev..." git status git log --oneline -5 echo "✅ Git репозиторий готов" - name: Setup SSH for Dev Deploy if: github.ref == 'refs/heads/dev' run: | echo "🔑 Настраиваем SSH для деплоя на staging..." # Создаем SSH директорию mkdir -p ~/.ssh chmod 700 ~/.ssh # Добавляем приватный ключ echo "${{ secrets.STAGING_PRIVATE_KEY }}" > ~/.ssh/id_rsa chmod 600 ~/.ssh/id_rsa # Добавляем staging.discours.io в known_hosts ssh-keyscan -H staging.discours.io >> ~/.ssh/known_hosts # Запускаем ssh-agent eval $(ssh-agent -s) ssh-add ~/.ssh/id_rsa echo "✅ SSH настроен для staging.discours.io" - name: Push to dokku for dev branch if: github.ref == 'refs/heads/dev' run: | echo "🚀 Деплоим на staging.discours.io..." # Добавляем dokku remote git remote add dokku ssh://dokku@staging.discours.io:22/core || git remote set-url dokku ssh://dokku@staging.discours.io:22/core # Проверяем remote git remote -v # Деплоим текущую ветку git push dokku dev:main -f echo "✅ Деплой на dev завершен"