#!/bin/bash # ============================================================================= # IDS - GitLab Deployment Script con Versioning Semantico # ============================================================================= # Uso: # ./deploy-to-gitlab.sh → incrementa patch (1.0.0 → 1.0.1) # ./deploy-to-gitlab.sh minor → incrementa minor (1.0.5 → 1.1.0) # ./deploy-to-gitlab.sh major → incrementa major (1.1.5 → 2.0.0) # ============================================================================= set -e # Exit on error # Colori per output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # Funzione di log log_info() { echo -e "${BLUE}[INFO]${NC} $1" } log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1" } log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1" } log_error() { echo -e "${RED}[ERROR]${NC} $1" } # ============================================================================= # 1. CARICA CREDENZIALI DA git.env # ============================================================================= if [ ! -f "git.env" ]; then log_error "File git.env non trovato!" log_info "Crea il file git.env con le credenziali GitLab:" echo "" echo "GITLAB_USER=your-username" echo "GITLAB_TOKEN=your-token" echo "GITLAB_REPO=https://gitlab.com/username/repo.git" echo "GITLAB_BRANCH=main" echo "" exit 1 fi log_info "Carico credenziali da git.env..." source git.env # Verifica credenziali obbligatorie if [ -z "$GITLAB_USER" ] || [ -z "$GITLAB_TOKEN" ] || [ -z "$GITLAB_REPO" ]; then log_error "Credenziali mancanti in git.env!" log_info "Assicurati di configurare: GITLAB_USER, GITLAB_TOKEN, GITLAB_REPO" exit 1 fi # Default branch se non specificato GITLAB_BRANCH=${GITLAB_BRANCH:-main} log_success "Credenziali caricate: $GITLAB_USER @ $GITLAB_REPO" # ============================================================================= # 2. DETERMINA TIPO DI INCREMENTO VERSIONE # ============================================================================= INCREMENT_TYPE=${1:-patch} # default: patch if [[ ! "$INCREMENT_TYPE" =~ ^(patch|minor|major)$ ]]; then log_error "Tipo incremento non valido: $INCREMENT_TYPE" log_info "Uso: $0 [patch|minor|major]" exit 1 fi log_info "Tipo incremento: $INCREMENT_TYPE" # ============================================================================= # 3. LEGGI VERSIONE CORRENTE E CALCOLA NUOVA VERSIONE # ============================================================================= if [ ! -f "version.json" ]; then log_warning "version.json non trovato, creo versione iniziale 1.0.0" echo '{"version":"1.0.0","lastUpdate":"","changelog":[]}' > version.json fi CURRENT_VERSION=$(node -pe "JSON.parse(require('fs').readFileSync('version.json', 'utf8')).version") log_info "Versione corrente: $CURRENT_VERSION" # Parse versione (MAJOR.MINOR.PATCH) IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT_VERSION" # Incrementa secondo il tipo case $INCREMENT_TYPE in patch) PATCH=$((PATCH + 1)) ;; minor) MINOR=$((MINOR + 1)) PATCH=0 ;; major) MAJOR=$((MAJOR + 1)) MINOR=0 PATCH=0 ;; esac NEW_VERSION="$MAJOR.$MINOR.$PATCH" log_success "Nuova versione: $NEW_VERSION" # ============================================================================= # 4. EXPORT DATABASE SCHEMA (solo struttura per git) # ============================================================================= log_info "Export schema database (solo DDL, no dati)..." # Directory schema SCHEMA_DIR="database-schema" mkdir -p $SCHEMA_DIR SCHEMA_FILE="$SCHEMA_DIR/schema.sql" # Controlla se DATABASE_URL è disponibile if [ -z "$DATABASE_URL" ]; then log_warning "DATABASE_URL non trovato, salto export schema" else log_info "Esporto schema: $SCHEMA_FILE" # Export solo schema (--schema-only = NO DATA) if pg_dump "$DATABASE_URL" --schema-only --no-owner --no-privileges > "$SCHEMA_FILE"; then TABLES=$(grep -c "CREATE TABLE" "$SCHEMA_FILE" || echo 0) SCHEMA_SIZE=$(du -h "$SCHEMA_FILE" | cut -f1) log_success "Schema esportato: $TABLES tabelle, $SCHEMA_SIZE" else log_warning "Export schema fallito (non critico, continuo)" fi fi # ============================================================================= # 5. BACKUP DATABASE POSTGRESQL (completo, NON committato su git) # ============================================================================= log_info "Avvio backup database PostgreSQL..." # Directory backup BACKUP_DIR="database-backups" mkdir -p $BACKUP_DIR # Nome file backup con timestamp e versione TIMESTAMP=$(date +%Y%m%d_%H%M%S) BACKUP_FILE="$BACKUP_DIR/ids_v${NEW_VERSION}_${TIMESTAMP}.sql" # Controlla se DATABASE_URL è disponibile if [ -z "$DATABASE_URL" ]; then log_warning "DATABASE_URL non trovato, salto backup database" else log_info "Creo backup: $BACKUP_FILE" # Backup con pg_dump (include schema e dati) # Opzioni: --clean (DROP before CREATE), --if-exists (no error if not exists), --inserts (INSERT statements per compatibilità) if pg_dump "$DATABASE_URL" --clean --if-exists --inserts > "$BACKUP_FILE"; then # Comprimi backup gzip "$BACKUP_FILE" BACKUP_FILE="${BACKUP_FILE}.gz" BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1) log_success "Backup completato: $BACKUP_FILE ($BACKUP_SIZE)" # Mantieni solo gli ultimi 10 backup log_info "Pulizia backup vecchi (mantengo ultimi 10)..." ls -t $BACKUP_DIR/*.sql.gz 2>/dev/null | tail -n +11 | xargs rm -f 2>/dev/null || true else log_error "Backup database fallito! Verifica DATABASE_URL e permessi pg_dump" exit 1 fi fi # ============================================================================= # 6. AGGIORNA version.json # ============================================================================= log_info "Aggiorno version.json..." # Crea nuovo changelog entry CHANGELOG_ENTRY=$(cat < 50) { versionData.changelog = versionData.changelog.slice(0, 50); } fs.writeFileSync('version.json', JSON.stringify(versionData, null, 2)); " log_success "version.json aggiornato a v$NEW_VERSION" # ============================================================================= # 7. CONFIGURA GIT REMOTE CON CREDENZIALI # ============================================================================= log_info "Configuro repository GitLab..." # Costruisci URL con autenticazione if [[ "$GITLAB_REPO" == https://* ]]; then # HTTPS: Gitea richiede username:token (token fa da password) # Formato: https://USERNAME:TOKEN@gitea-url/owner/repo.git REPO_WITH_AUTH=$(echo "$GITLAB_REPO" | sed "s|https://|https://${GITLAB_USER}:${GITLAB_TOKEN}@|") elif [[ "$GITLAB_REPO" == git@* ]]; then # SSH: usa direttamente REPO_WITH_AUTH="$GITLAB_REPO" log_warning "Usando SSH, assicurati che le chiavi SSH siano configurate" else log_error "Formato repository non valido: $GITLAB_REPO" exit 1 fi # Rimuovi remote gitlab se esiste git remote remove gitlab 2>/dev/null || true # Aggiungi remote gitlab git remote add gitlab "$REPO_WITH_AUTH" log_success "Remote GitLab configurato" # ============================================================================= # 8. COMMIT E PUSH SU GITLAB # ============================================================================= log_info "Preparo commit..." # Stage tutti i file (incluso backup) git add -A # Verifica se ci sono cambiamenti if git diff --cached --quiet; then log_warning "Nessuna modifica da committare" else # Commit con messaggio versione COMMIT_MSG="🚀 Release v$NEW_VERSION - Tipo: $INCREMENT_TYPE - Database schema: $SCHEMA_FILE (solo struttura) - Data: $(date '+%Y-%m-%d %H:%M:%S') " git commit -m "$COMMIT_MSG" log_success "Commit creato: v$NEW_VERSION" fi # Push su GitLab log_info "Push su GitLab branch $GITLAB_BRANCH..." if git push gitlab "$GITLAB_BRANCH" --force 2>&1; then log_success "Push completato su GitLab!" else log_error "Push fallito! Verifica credenziali e permessi" exit 1 fi # ============================================================================= # 8. CREA TAG VERSIONE # ============================================================================= log_info "Creo tag v$NEW_VERSION..." # Rimuovi tag locale se esiste git tag -d "v$NEW_VERSION" 2>/dev/null || true # Crea nuovo tag git tag -a "v$NEW_VERSION" -m "Release v$NEW_VERSION" # Push tag if git push gitlab "v$NEW_VERSION" --force 2>&1; then log_success "Tag v$NEW_VERSION creato su GitLab" else log_warning "Creazione tag fallita (non critico)" fi # ============================================================================= # 9. SUMMARY FINALE # ============================================================================= echo "" echo "==========================================" echo -e "${GREEN}✅ DEPLOYMENT COMPLETATO${NC}" echo "==========================================" echo "" echo "📦 Versione: $CURRENT_VERSION → $NEW_VERSION" echo "🔄 Incremento: $INCREMENT_TYPE" echo "💾 Database backup: $BACKUP_FILE" echo "🌐 Repository: $GITLAB_REPO" echo "🌿 Branch: $GITLAB_BRANCH" echo "🏷️ Tag: v$NEW_VERSION" echo "" echo "==========================================" echo "" # Cleanup: rimuovi remote con credenziali (sicurezza) git remote remove gitlab 2>/dev/null || true log_success "Deployment completato con successo!" exit 0