CI: fix ci
This commit is contained in:
1 parent
c5962ec7e8
commit
9f945884da
1 file changed
+170
-68
+170
-68
@@ -1,123 +1,225 @@
|
|||||||
name: Build and Test Flask App
|
name: Build, Test and Push Flask App
|
||||||
|
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ main, master ]
|
branches: [ main, master ]
|
||||||
pull_request:
|
|
||||||
branches: [ main, master ]
|
env:
|
||||||
|
PYTHON_VERSION: '3.11'
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
build:
|
test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4
|
- uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Set up Python via apt
|
# Устанавливаем Python и необходимые пакеты
|
||||||
|
- name: Install Python and dependencies
|
||||||
run: |
|
run: |
|
||||||
apt update
|
apt-get update
|
||||||
apt install -y python3 python3-pip python3-venv python3-dev python3-full
|
apt-get install -y python3 python3-pip python3-venv python3-dev
|
||||||
|
|
||||||
- name: Create and activate virtual environment
|
# Проверяем установку
|
||||||
|
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: |
|
run: |
|
||||||
|
# Удаляем старую venv если есть
|
||||||
|
rm -rf venv
|
||||||
|
|
||||||
|
# Создаем новую venv
|
||||||
python3 -m venv venv
|
python3 -m venv venv
|
||||||
|
|
||||||
. venv/bin/activate
|
# Проверяем что venv создалась
|
||||||
pip install --upgrade pip
|
if [ ! -f venv/bin/activate ]; then
|
||||||
|
echo "❌ Не удалось создать виртуальное окружение"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "✅ Виртуальное окружение создано"
|
||||||
|
|
||||||
|
# Устанавливаем переменные окружения
|
||||||
echo "VIRTUAL_ENV=$PWD/venv" >> $GITHUB_ENV
|
echo "VIRTUAL_ENV=$PWD/venv" >> $GITHUB_ENV
|
||||||
echo "$PWD/venv/bin" >> $GITHUB_PATH
|
echo "$PWD/venv/bin" >> $GITHUB_PATH
|
||||||
|
|
||||||
|
# Активируем для текущего шага
|
||||||
|
. venv/bin/activate
|
||||||
|
|
||||||
|
# Обновляем pip
|
||||||
|
pip install --upgrade pip
|
||||||
|
|
||||||
|
echo "✅ Настройка виртуального окружения завершена"
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
|
# Активируем виртуальное окружение
|
||||||
|
. venv/bin/activate
|
||||||
|
|
||||||
|
# Устанавливаем зависимости из файла
|
||||||
if [ -f dependencies.txt ]; then
|
if [ -f dependencies.txt ]; then
|
||||||
pip install --no-cache-dir -r dependencies.txt
|
pip install --no-cache-dir -r dependencies.txt
|
||||||
|
elif [ -f requirements.txt ]; then
|
||||||
|
pip install --no-cache-dir -r requirements.txt
|
||||||
else
|
else
|
||||||
echo "dependencies.txt not found, installing Flask only"
|
# Минимальный набор
|
||||||
pip install flask
|
pip install flask gunicorn
|
||||||
fi
|
fi
|
||||||
pip list
|
|
||||||
|
|
||||||
- name: Debug build - check imports
|
# Устанавливаем тестовые зависимости
|
||||||
run: |
|
pip install pytest requests gunicorn
|
||||||
export FLASK_APP=app.py
|
|
||||||
export FLASK_ENV=development
|
|
||||||
flask run --host 0.0.0.0 --debug &
|
|
||||||
|
|
||||||
- name: Wait for Flask app to start
|
echo "✅ Зависимости установлены"
|
||||||
|
|
||||||
|
- name: Verify application
|
||||||
run: |
|
run: |
|
||||||
echo "Waiting for Flask app to start..."
|
# Активируем виртуальное окружение
|
||||||
for i in {1..10}; do
|
. venv/bin/activate
|
||||||
if curl -f http://localhost:80/health 2>/dev/null; then
|
|
||||||
echo "✅ Flask app is running"
|
# Проверяем что 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
|
exit 0
|
||||||
fi
|
fi
|
||||||
echo "Attempt $i: Flask app not ready yet..."
|
echo "Попытка $i: Flask еще не готов..."
|
||||||
sleep 2
|
sleep 5
|
||||||
done
|
done
|
||||||
echo "❌ Flask app failed to start"
|
|
||||||
|
# Если не запустился, показываем логи
|
||||||
|
echo "❌ Не удалось запустить Flask приложение"
|
||||||
|
echo "=== Логи Flask ==="
|
||||||
|
cat flask.log
|
||||||
exit 1
|
exit 1
|
||||||
|
|
||||||
- name: Install test dependencies
|
- name: Run tests
|
||||||
run: |
|
run: |
|
||||||
|
# Активируем виртуальное окружение
|
||||||
. venv/bin/activate
|
. venv/bin/activate
|
||||||
pip install requests pytest pytest-cov
|
|
||||||
|
|
||||||
- name: Run API tests with coverage
|
# Запускаем тесты если они есть
|
||||||
run: |
|
if [ -f test_api.py ]; then
|
||||||
. venv/bin/activate
|
python3 test_api.py
|
||||||
echo "Running API tests..."
|
echo "✅ API тесты завершены"
|
||||||
python test_api.py
|
else
|
||||||
echo "✅ API tests completed"
|
echo "⚠️ test_api.py не найден"
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Run additional pytest tests (if exist)
|
# Запускаем pytest тесты
|
||||||
run: |
|
|
||||||
. venv/bin/activate
|
|
||||||
if [ -d tests ] && [ "$(ls -A tests)" ]; then
|
if [ -d tests ] && [ "$(ls -A tests)" ]; then
|
||||||
pytest tests/ -v --tb=short
|
pytest tests/ -v --tb=short
|
||||||
else
|
else
|
||||||
echo "No pytest tests found, skipping"
|
echo "⚠️ pytest тесты не найдены"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Install release dependencies
|
- name: Validate Gunicorn
|
||||||
run: |
|
run: |
|
||||||
|
# Активируем виртуальное окружение
|
||||||
. venv/bin/activate
|
. venv/bin/activate
|
||||||
pip install gunicorn
|
|
||||||
|
|
||||||
- name: Release build (simulated)
|
if [ -f app.py ]; then
|
||||||
run: |
|
|
||||||
. venv/bin/activate
|
|
||||||
gunicorn --check-config app:app
|
gunicorn --check-config app:app
|
||||||
echo "✅ Gunicorn configuration is valid"
|
echo "✅ Конфигурация Gunicorn корректна"
|
||||||
|
else
|
||||||
- name: Build Docker image
|
echo "⚠️ app.py не найден, пропускаем проверку gunicorn"
|
||||||
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
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
- name: Test Docker image
|
- name: Stop Flask application
|
||||||
|
if: always() && env.APP_PID != ''
|
||||||
run: |
|
run: |
|
||||||
echo "Testing Docker image..."
|
echo "Останавливаем Flask приложение (PID: $APP_PID)"
|
||||||
docker run -d -p 5001:5000 --name flask-test-container flask-app:latest
|
kill $APP_PID 2>/dev/null || true
|
||||||
sleep 5
|
pkill -f "python3 app.py" 2>/dev/null || true
|
||||||
curl -f http://localhost:5001/health || (docker logs flask-test-container && exit 1)
|
echo "✅ Flask приложение остановлено"
|
||||||
docker stop flask-test-container
|
|
||||||
docker rm flask-test-container
|
|
||||||
echo "✅ Docker image test passed"
|
|
||||||
|
|
||||||
- name: Stop Flask app
|
- name: Clean up Python cache
|
||||||
if: always()
|
if: always()
|
||||||
run: |
|
run: |
|
||||||
pkill -f "flask run" || pkill -f "python app.py" || true
|
find . -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true
|
||||||
|
find . -type f -name "*.pyc" -delete 2>/dev/null || true
|
||||||
|
echo "✅ Кэш Python очищен"
|
||||||
|
|
||||||
- name: Cleanup Docker
|
docker-build-and-push:
|
||||||
if: always()
|
needs: test # ✅ Теперь это работает, так как test в том же workflow
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout code
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
|
- name: Install Docker CLI
|
||||||
run: |
|
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
|
||||||
Reference in new issue
Block a user