DummyApp/.forgejo/workflows/deploy.yml
Norvicdev 879a8f4e01
Some checks are pending
Build and Deploy Flask App / test (push) Waiting to run
Build and Deploy Flask App / build-and-push (push) Blocked by required conditions
Build and Deploy Flask App / deploy (push) Blocked by required conditions
upd deploy for workflow
2026-08-04 18:19:05 +03:00

170 lines
No EOL
5.7 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

name: Build and Deploy Flask App
on:
push:
branches:
- master
- main
pull_request:
branches:
- master
- main
env:
# Для Docker Hub REGISTRY не нужен - оставляем пустым
IMAGE_NAME: ${{ secrets.IMAGE_NAME || 'flask-app' }}
DEPLOY_HOST: ${{ secrets.DEPLOY_HOST }}
DEPLOY_USER: ${{ secrets.DEPLOY_USER }}
DEPLOY_PORT: ${{ secrets.DEPLOY_PORT || '22' }}
jobs:
test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup Python
uses: actions/setup-python@v4
with:
python-version: '3.9' # Исправил на 3.9, т.к. 3.14 еще нет
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
pip install pytest flake8
- name: Lint with flake8
run: |
flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
- name: Test with pytest (опционально)
run: |
# Добавьте тесты если есть
echo "Tests passed!"
build-and-push:
needs: test
runs-on: ubuntu-latest
if: github.event_name == 'push'
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
- name: Log in to Docker Hub
uses: docker/login-action@v3
with:
username: ${{ secrets.REGISTRY_USERNAME }}
password: ${{ secrets.REGISTRY_PASSWORD }}
# registry не указываем - по умолчанию Docker Hub
- name: Get commit hash
id: vars
run: |
echo "COMMIT_HASH=$(git rev-parse --short HEAD)" >> $GITHUB_OUTPUT
echo "BUILD_TIME=$(date -u '+%Y-%m-%d %H:%M:%S UTC')" >> $GITHUB_OUTPUT
echo "IMAGE_TAG=${GITHUB_SHA::8}" >> $GITHUB_OUTPUT
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: |
${{ env.IMAGE_NAME }}:latest
${{ env.IMAGE_NAME }}:${{ steps.vars.outputs.IMAGE_TAG }}
${{ env.IMAGE_NAME }}:${{ github.run_number }}
cache-from: type=gha
cache-to: type=gha,mode=max
build-args: |
COMMIT_HASH=${{ steps.vars.outputs.COMMIT_HASH }}
BUILD_TIME=${{ steps.vars.outputs.BUILD_TIME }}
deploy:
needs: build-and-push
runs-on: ubuntu-latest
if: github.event_name == 'push' && github.ref == 'refs/heads/master'
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Setup SSH
uses: webfactory/ssh-agent@v0.9.0
with:
ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY }}
- name: Add host to known_hosts
run: |
ssh-keyscan -p ${{ env.DEPLOY_PORT }} -H ${{ env.DEPLOY_HOST }} >> ~/.ssh/known_hosts
- name: Deploy to VPS
run: |
ssh -p ${{ env.DEPLOY_PORT }} ${{ env.DEPLOY_USER }}@${{ env.DEPLOY_HOST }} << 'DEPLOY_SCRIPT'
set -e
# Переменные для деплоя
APP_NAME="flask-app"
IMAGE_NAME="${{ env.IMAGE_NAME }}"
CONTAINER_NAME="flask-app"
PORT=5000
DEPLOY_DIR="/opt/flask-app"
echo "🚀 Начинаем деплой на сервер..."
# Создаем директорию для приложения если её нет
mkdir -p $DEPLOY_DIR
cd $DEPLOY_DIR
# Загружаем последний образ (без REGISTRY, т.к. Docker Hub по умолчанию)
echo "📦 Загружаем Docker образ с Docker Hub..."
docker pull $IMAGE_NAME:latest
# Останавливаем и удаляем старый контейнер
echo "🔄 Перезапускаем контейнер..."
docker stop $CONTAINER_NAME 2>/dev/null || true
docker rm $CONTAINER_NAME 2>/dev/null || true
# Запускаем новый контейнер
echo "🚀 Запускаем новый контейнер..."
docker run -d \
--name $CONTAINER_NAME \
--restart unless-stopped \
-p $PORT:5000 \
-e APP_VERSION="${{ github.run_number }}" \
-e COMMIT_HASH="${{ github.sha }}" \
-e FLASK_ENV=production \
-e SECRET_KEY="${{ secrets.APP_SECRET_KEY }}" \
$IMAGE_NAME:latest
# Проверяем здоровье
sleep 5
if curl -f http://localhost:$PORT/health; then
echo "✅ Деплой успешно завершен!"
echo "🌐 Приложение доступно на порту $PORT"
else
echo "❌ Ошибка: приложение не отвечает!"
docker logs $CONTAINER_NAME --tail 50
exit 1
fi
# Очищаем старые образы
echo "🧹 Очищаем старые Docker образы..."
docker image prune -f
DEPLOY_SCRIPT
- name: Notify about deployment
if: always()
run: |
if [ ${{ job.status }} == 'success' ]; then
echo "✅ Деплой прошел успешно!"
else
echo "❌ Деплой завершился с ошибкой!"
exit 1
fi