v1.5.4: test infrastructure + bug fixes + CI/CD + deploy gate
- 6 new test files: route discovery, strict permissions, role switch, CRUD operations, 500 error protection - permission_config.py: central permission definitions for all 110+ routes - Bug fixes: is_active checkbox in users_edit, int(id) 500 crash, missing validation in users_create/users_delete - Pre-commit hooks: lint + static routing tests - GitHub Actions CI: full pytest suite on push - Deploy gate: pytest runs before deploy, aborts on failure - All 3 deploy scripts: --skip-tests flag support
This commit is contained in:
@@ -0,0 +1,123 @@
|
||||
#!/bin/bash
|
||||
# ==========================================
|
||||
# Deploy update — быстрый деплой фиксов
|
||||
# Usage: bash other/deploy_update.sh [--skip-tests] [patch|minor|major]
|
||||
# ==========================================
|
||||
set -e
|
||||
|
||||
SKIP_TESTS=false
|
||||
BUMP="patch"
|
||||
for arg in "$@"; do
|
||||
case "$arg" in
|
||||
--skip-tests) SKIP_TESTS=true ;;
|
||||
patch|minor|major) BUMP="$arg" ;;
|
||||
esac
|
||||
done
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
|
||||
REPO_ROOT="$(cd "$SCRIPT_DIR/.." && pwd)"
|
||||
SERVER="angel@81.177.141.34"
|
||||
ARCHIVE="$SCRIPT_DIR/aegisone-update.tar.gz"
|
||||
BOT="/opt/projects/aegisone-py/max_bot"
|
||||
PY="/opt/projects/aegisone-py"
|
||||
|
||||
echo "=========================================="
|
||||
echo " AegisOne — Deploy Update"
|
||||
echo "=========================================="
|
||||
|
||||
# ==========================================
|
||||
# Gate: run tests before deploy
|
||||
# ==========================================
|
||||
if [ "$SKIP_TESTS" = false ]; then
|
||||
echo ""
|
||||
echo "[CHECK] Running tests..."
|
||||
cd "$REPO_ROOT/py_service"
|
||||
if curl -sf http://localhost:8000/health > /dev/null 2>&1; then
|
||||
if ! pytest -v --tb=short -x; then
|
||||
echo ""
|
||||
echo "❌ Tests failed. Deploy aborted."
|
||||
echo " Fix errors or use --skip-tests to force deploy."
|
||||
exit 1
|
||||
fi
|
||||
echo " ✅ Tests passed"
|
||||
else
|
||||
echo " ⚠️ Server not reachable at localhost:8000"
|
||||
echo " Start the service first, or use --skip-tests"
|
||||
exit 1
|
||||
fi
|
||||
else
|
||||
echo " ⚠️ Tests skipped (--skip-tests flag)"
|
||||
fi
|
||||
|
||||
# Bump version & update changelog
|
||||
cd "$REPO_ROOT"
|
||||
python py_service/scripts/bump_version.py "$BUMP" '{"features":["Обновление сервисного портала"],"fixes":["Исправления и улучшения"]}'
|
||||
VERSION=$(cat py_service/version.txt)
|
||||
echo "Version: $VERSION"
|
||||
|
||||
echo ""
|
||||
echo "[1/5] Uploading archive..."
|
||||
scp "$ARCHIVE" "$SERVER:/tmp/aegisone-update.tar.gz"
|
||||
|
||||
echo ""
|
||||
echo "[2/5] Applying update on server..."
|
||||
ssh "$SERVER" << 'SSHEOF'
|
||||
set -e
|
||||
cd /tmp
|
||||
rm -rf update
|
||||
mkdir update && tar xzf aegisone-update.tar.gz -C update
|
||||
PY="/opt/projects/aegisone-py"
|
||||
|
||||
# SQL migration (если есть)
|
||||
MIG=$(ls update/py_service/sql/v*.sql 2>/dev/null | head -1)
|
||||
if [ -n "$MIG" ]; then
|
||||
PG=$(docker ps --filter "name=aegisone-postgres" --format "{{.ID}}" | head -1)
|
||||
if [ -n "$PG" ]; then
|
||||
docker cp "$MIG" "$PG:/tmp/mig.sql"
|
||||
docker exec "$PG" psql -U aegisone -d aegisone -f /tmp/mig.sql 2>&1 | grep -v "^ALTER\|^CREATE\|^INSERT\|^ON CONFLICT" || true
|
||||
echo " ✅ Migration applied"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Copy all py_service files
|
||||
rsync -a --delete update/py_service/ "$PY/"
|
||||
echo " ✅ py_service files copied"
|
||||
|
||||
# Copy max_bot files (если есть)
|
||||
if [ -d "update/max_bot" ]; then
|
||||
rsync -a --delete update/max_bot/ "$PY/max_bot/"
|
||||
echo " ✅ max_bot files copied"
|
||||
fi
|
||||
|
||||
rm -rf /tmp/update
|
||||
SSHEOF
|
||||
|
||||
echo ""
|
||||
echo "[3/5] Rebuilding max_bot container..."
|
||||
ssh "$SERVER" "cd $BOT && docker compose up -d --build 2>&1 | tail -5"
|
||||
|
||||
echo ""
|
||||
echo "[4/5] Rebuilding py_service container..."
|
||||
ssh "$SERVER" "cd $PY && docker compose up -d --build 2>&1 | tail -5"
|
||||
|
||||
echo ""
|
||||
echo "[5/5] Health check..."
|
||||
sleep 5
|
||||
ssh "$SERVER" '
|
||||
echo -n " max_bot: "
|
||||
curl -s -o /dev/null -w "%{http_code}" http://localhost:8002/health || echo "FAIL"
|
||||
echo -n " py_service: "
|
||||
curl -s -o /dev/null -w "%{http_code}" http://localhost:8000/health || echo "FAIL"
|
||||
'
|
||||
|
||||
# Commit changelog
|
||||
cd "$REPO_ROOT"
|
||||
git add py_service/version.txt py_service/CHANGELOG.md
|
||||
git diff --cached --quiet || git commit -m "v$VERSION: changelog [skip ci]"
|
||||
|
||||
echo ""
|
||||
echo "=========================================="
|
||||
echo " ✅ Update complete: v$VERSION"
|
||||
echo " Bot: https://max.aegisone.ru"
|
||||
echo " Portal: https://service.aegisone.ru"
|
||||
echo "=========================================="
|
||||
Reference in New Issue
Block a user