From 9f945884da61d0fdb499871b79b74eadc79af0ce Mon Sep 17 00:00:00 2001 From: Kirill Date: Sun, 22 Mar 2026 17:14:08 +0300 Subject: [PATCH] CI: fix ci --- .forgejo/workflows/demo.yaml | 256 ++++++++++++++++++++++++----------- 1 file changed, 179 insertions(+), 77 deletions(-) diff --git a/.forgejo/workflows/demo.yaml b/.forgejo/workflows/demo.yaml index ece67d3..e7e0bf8 100644 --- a/.forgejo/workflows/demo.yaml +++ b/.forgejo/workflows/demo.yaml @@ -1,123 +1,225 @@ -name: Build and Test Flask App +name: Build, Test and Push Flask App on: push: branches: [ main, master ] - pull_request: - branches: [ main, master ] + +env: + PYTHON_VERSION: '3.11' jobs: - build: + test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - name: Set up Python via apt + # Устанавливаем Python и необходимые пакеты + - name: Install Python and dependencies run: | - apt update - apt install -y python3 python3-pip python3-venv python3-dev python3-full - - - name: Create and activate virtual environment + apt-get update + apt-get install -y python3 python3-pip python3-venv python3-dev + + # Проверяем установку + python3 --version + pip3 --version + + # Убеждаемся что venv доступен + python3 -m venv --help || (echo "venv not available"; exit 1) + + # Кэширование pip пакетов + - name: Cache pip packages + uses: actions/cache@v4 + with: + path: ~/.cache/pip + key: ${{ runner.os }}-pip-${{ hashFiles('dependencies.txt', 'requirements.txt') }} + restore-keys: | + ${{ runner.os }}-pip- + + # Создаем виртуальное окружение + - name: Create virtual environment run: | + # Удаляем старую venv если есть + rm -rf venv + + # Создаем новую venv python3 -m venv venv - - . venv/bin/activate - pip install --upgrade pip - + + # Проверяем что venv создалась + if [ ! -f venv/bin/activate ]; then + echo "❌ Не удалось создать виртуальное окружение" + exit 1 + fi + + echo "✅ Виртуальное окружение создано" + + # Устанавливаем переменные окружения echo "VIRTUAL_ENV=$PWD/venv" >> $GITHUB_ENV echo "$PWD/venv/bin" >> $GITHUB_PATH + + # Активируем для текущего шага + . venv/bin/activate + + # Обновляем pip + pip install --upgrade pip + + echo "✅ Настройка виртуального окружения завершена" - name: Install dependencies run: | + # Активируем виртуальное окружение + . venv/bin/activate + + # Устанавливаем зависимости из файла if [ -f dependencies.txt ]; then pip install --no-cache-dir -r dependencies.txt + elif [ -f requirements.txt ]; then + pip install --no-cache-dir -r requirements.txt else - echo "dependencies.txt not found, installing Flask only" - pip install flask + # Минимальный набор + pip install flask gunicorn fi - pip list - - - name: Debug build - check imports - run: | - export FLASK_APP=app.py - export FLASK_ENV=development - flask run --host 0.0.0.0 --debug & + + # Устанавливаем тестовые зависимости + pip install pytest requests gunicorn + + echo "✅ Зависимости установлены" - - name: Wait for Flask app to start + - name: Verify application run: | - echo "Waiting for Flask app to start..." - for i in {1..10}; do - if curl -f http://localhost:80/health 2>/dev/null; then - echo "✅ Flask app is running" + # Активируем виртуальное окружение + . venv/bin/activate + + # Проверяем что Flask установлен + python3 -c "import flask; print(f'Flask version: {flask.__version__}')" + + # Проверяем импорт приложения + if [ -f app.py ]; then + python3 -c "import app; print('✅ Приложение импортируется успешно')" || \ + (echo "❌ Не удалось импортировать приложение"; exit 1) + else + echo "⚠️ app.py не найден, пропускаем проверку импорта" + fi + + - name: Start Flask application + run: | + # Активируем виртуальное окружение + . venv/bin/activate + + # Запускаем Flask в фоне + flask run --host 0.0.0.0 --debug > flask.log 2>&1 & + APP_PID=$! + echo "APP_PID=$APP_PID" >> $GITHUB_ENV + echo "Flask запущен с PID: $APP_PID" + + # Проверяем порт + echo "Ожидаем запуск Flask на порту 5000..." + for i in {1..15}; do + if curl -sf http://localhost:5000/health 2>/dev/null; then + echo "✅ Flask приложение запущено" exit 0 fi - echo "Attempt $i: Flask app not ready yet..." - sleep 2 + echo "Попытка $i: Flask еще не готов..." + sleep 5 done - echo "❌ Flask app failed to start" + + # Если не запустился, показываем логи + echo "❌ Не удалось запустить Flask приложение" + echo "=== Логи Flask ===" + cat flask.log exit 1 - - name: Install test dependencies - run: | - . venv/bin/activate - pip install requests pytest pytest-cov - - - name: Run API tests with coverage - run: | - . venv/bin/activate - echo "Running API tests..." - python test_api.py - echo "✅ API tests completed" - - - name: Run additional pytest tests (if exist) + - name: Run tests run: | + # Активируем виртуальное окружение . venv/bin/activate + + # Запускаем тесты если они есть + if [ -f test_api.py ]; then + python3 test_api.py + echo "✅ API тесты завершены" + else + echo "⚠️ test_api.py не найден" + fi + + # Запускаем pytest тесты if [ -d tests ] && [ "$(ls -A tests)" ]; then pytest tests/ -v --tb=short else - echo "No pytest tests found, skipping" + echo "⚠️ pytest тесты не найдены" fi - - name: Install release dependencies + - name: Validate Gunicorn run: | + # Активируем виртуальное окружение . venv/bin/activate - pip install gunicorn - - - name: Release build (simulated) - run: | - . venv/bin/activate - gunicorn --check-config app:app - echo "✅ Gunicorn configuration is valid" - - - name: Build Docker image - run: | - if [ -f Dockerfile ]; then - echo "🐳 Building Docker image..." - docker build -t PVH:${{ github.sha }} -t PVH:latest . - docker images | grep PVH - echo "✅ Docker image built successfully" - - # Проверяем, что образ создался - docker run --rm PVH:latest python -c "import sys; print('Python version:', sys.version)" || true + + if [ -f app.py ]; then + gunicorn --check-config app:app + echo "✅ Конфигурация Gunicorn корректна" + else + echo "⚠️ app.py не найден, пропускаем проверку gunicorn" fi - - name: Test Docker image + - name: Stop Flask application + if: always() && env.APP_PID != '' run: | - echo "Testing Docker image..." - docker run -d -p 5001:5000 --name flask-test-container flask-app:latest - sleep 5 - curl -f http://localhost:5001/health || (docker logs flask-test-container && exit 1) - docker stop flask-test-container - docker rm flask-test-container - echo "✅ Docker image test passed" + echo "Останавливаем Flask приложение (PID: $APP_PID)" + kill $APP_PID 2>/dev/null || true + pkill -f "python3 app.py" 2>/dev/null || true + echo "✅ Flask приложение остановлено" - - name: Stop Flask app + - name: Clean up Python cache if: always() run: | - pkill -f "flask run" || pkill -f "python app.py" || true - - - name: Cleanup Docker - if: always() + find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true + find . -type f -name "*.pyc" -delete 2>/dev/null || true + echo "✅ Кэш Python очищен" + + docker-build-and-push: + needs: test # ✅ Теперь это работает, так как test в том же workflow + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install Docker CLI run: | - docker system prune -f || true + apt-get update + apt-get install -y docker.io + docker --version + + - name: Configure Docker CLI for insecure registry + run: | + mkdir -p ~/.docker + echo '{"insecure-registries" : ["git.rustprogersteam.ru"]}' > ~/.docker/config.json + cat ~/.docker/config.json + + - name: 'Docker Tags' + id: tags + uses: https://github.com/cssnr/docker-tags-action@v2 + with: + images: 'git.rustprogersteam.ru/pvhproject/pvhbackend/' + + - name: Login to Docker Registry + uses: docker/login-action@v3 + with: + registry: git.rustprogersteam.ru + username: ${{ vars.DOCKER_USERNAME }} + password: ${{ secrets.DOCKER_PASSWORD }} + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Build and push Docker image + uses: docker/build-push-action@v5 + with: + context: . + push: true + tags: | + git.rustprogersteam.ru/pvhproject/pvhbackend/pvh:latest + git.rustprogersteam.ru/pvhproject/pvhbackend/pvh:${{ github.sha }} + labels: ${{ steps.tags.outputs.labels }} + cache-from: type=gha + cache-to: type=gha,mode=max