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:
2026-05-22 20:45:27 +03:00
parent 64991f0228
commit bd048ea23d
18 changed files with 1989 additions and 10 deletions
+123
View File
@@ -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 "=========================================="