From f1337d9b5b09a74e545142e34cd8829e36cbf152 Mon Sep 17 00:00:00 2001 From: kjh2064 Date: Sat, 11 Jul 2026 18:56:12 +0900 Subject: [PATCH] chore: Deployment version naming and cleanup policy - **Version naming**: Include date, time, commit hash, and CI run number Format: quantengine_YYYYMMDD_HHMMSS_COMMIT_HASH_RUNNUM - **Cleanup script**: Auto-remove old versions to prevent disk exhaustion - Keep 5 most recent by default - Remove staging/test versions - Can be run weekly via cron or after deployments - Supports dry-run mode for validation Addresses: Disk usage management for long-running CI/CD pipeline Co-Authored-By: Claude Haiku 4.5 --- .gitea/workflows/deploy-prod.yml | 4 +- scripts/cleanup_old_deployments.sh | 92 ++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 scripts/cleanup_old_deployments.sh diff --git a/.gitea/workflows/deploy-prod.yml b/.gitea/workflows/deploy-prod.yml index 4e676afe..894863bb 100644 --- a/.gitea/workflows/deploy-prod.yml +++ b/.gitea/workflows/deploy-prod.yml @@ -182,9 +182,11 @@ jobs: set -e TIMESTAMP=$(date +%Y%m%d_%H%M%S) COMMIT=$(git rev-parse --short HEAD) + RUN_NUM="${{ github.run_number }}" DEPLOY_BASE="/home/kjh2064/deployments" ACTIVE_LINK="/home/kjh2064/quantengine_active" - TARGET_DIR="${DEPLOY_BASE}/quantengine_${TIMESTAMP}" + # Version format: quantengine_YYYYMMDD_HHMMSS_COMMIT_HASH_RUNNUM + TARGET_DIR="${DEPLOY_BASE}/quantengine_${TIMESTAMP}_${COMMIT}_${RUN_NUM}" TELEGRAM_BOT_TOKEN="${{ secrets.TELEGRAM_BOT_TOKEN }}" [ -z "$TELEGRAM_BOT_TOKEN" ] && TELEGRAM_BOT_TOKEN="${{ env.TELEGRAM_BOT_TOKEN_DEFAULT }}" diff --git a/scripts/cleanup_old_deployments.sh b/scripts/cleanup_old_deployments.sh new file mode 100644 index 00000000..2d0fe353 --- /dev/null +++ b/scripts/cleanup_old_deployments.sh @@ -0,0 +1,92 @@ +#!/bin/bash +# Cleanup old deployment versions to prevent disk exhaustion +# Deployment version format: quantengine_YYYYMMDD_HHMMSS_COMMIT_HASH_[SEQ] +# Usage: ./cleanup_old_deployments.sh [keep_count] + +set -euo pipefail + +DEPLOY_BASE="/home/kjh2064/deployments" +KEEP_COUNT="${1:-5}" # Keep 5 most recent versions by default + +echo "==========================================" +echo "๐Ÿงน QuantEngine Deployment Cleanup" +echo "==========================================" +echo "Base: $DEPLOY_BASE" +echo "Keeping: $KEEP_COUNT most recent versions" +echo "" + +# Get active deployment +ACTIVE_LINK="/home/kjh2064/quantengine_active" +if [ ! -L "$ACTIVE_LINK" ]; then + echo "โŒ Active link not found: $ACTIVE_LINK" + exit 1 +fi + +ACTIVE_VERSION=$(readlink -f "$ACTIVE_LINK") +ACTIVE_NAME=$(basename "$ACTIVE_VERSION") + +echo "๐Ÿ”’ Active version: $ACTIVE_NAME" +echo "" + +# List all quantengine deployments sorted by date (newest first) +echo "๐Ÿ“‹ Available versions:" +VERSIONS=$(ls -dt "$DEPLOY_BASE"/quantengine_* 2>/dev/null | head -$((KEEP_COUNT + 1)) | sed 's|.*/||' | sort -r) +COUNT=0 + +TO_DELETE="" +while IFS= read -r version; do + VERSION_PATH="$DEPLOY_BASE/$version" + SIZE=$(du -sh "$VERSION_PATH" 2>/dev/null | cut -f1) + + COUNT=$((COUNT + 1)) + + # Check if this is active + if [ "$VERSION_PATH" = "$ACTIVE_VERSION" ]; then + echo " โœ“ [$COUNT] $version ($SIZE) [ACTIVE]" + elif [ $COUNT -le $KEEP_COUNT ]; then + echo " ยท [$COUNT] $version ($SIZE)" + else + echo " โœ— [$COUNT] $version ($SIZE) [WILL DELETE]" + TO_DELETE="$TO_DELETE $VERSION_PATH" + fi +done <<< "$VERSIONS" + +# Also check for TEST versions (cleanup more aggressively) +echo "" +echo "๐Ÿงช Cleaning up TEST versions..." +TEST_VERSIONS=$(ls -dt "$DEPLOY_BASE"/quantengine_*_TEST 2>/dev/null | head -1 || true) +if [ -n "$TEST_VERSIONS" ]; then + for tv in $TEST_VERSIONS; do + if [ "$tv" != "$(readlink -f "$ACTIVE_LINK")" ]; then + TEST_SIZE=$(du -sh "$tv" 2>/dev/null | cut -f1) + echo " โœ— $(basename "$tv") ($TEST_SIZE) [STAGING]" + TO_DELETE="$TO_DELETE $tv" + fi + done +fi + +# Execute deletion if not in dry-run mode +if [ -n "$TO_DELETE" ] && [ "${2:-}" != "dry-run" ]; then + echo "" + echo "๐Ÿ”„ Removing old versions..." + for dir in $TO_DELETE; do + if [ -d "$dir" ]; then + DIR_NAME=$(basename "$dir") + DIR_SIZE=$(du -sh "$dir" | cut -f1) + rm -rf "$dir" + echo " โœ“ Deleted $DIR_NAME ($DIR_SIZE)" + fi + done + + FREED=$(du -sh "$DEPLOY_BASE" 2>/dev/null | cut -f1 || echo "unknown") + echo "" + echo "โœ… Cleanup complete. Total size: $FREED" +else + echo "" + echo "โญ๏ธ Dry-run mode. Use 'cleanup_old_deployments.sh $KEEP_COUNT' (without dry-run) to delete." +fi + +echo "" +echo "๐Ÿ’ก Recommendation:" +echo " - Run weekly via cron: 0 2 * * 0 /home/kjh2064/scripts/cleanup_old_deployments.sh 3" +echo " - Or after each successful deployment"