diff --git a/.gitignore b/.gitignore index f27c14f..9bd2ad7 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,7 @@ vite.config.ts.* .env.local .env.production .env.staging +git.env # Logs logs @@ -20,6 +21,7 @@ pm2-logs/ # Database *.db *.sqlite +database-backups/ # Deployment .deploy-history \ No newline at end of file diff --git a/deploy-to-gitlab.sh b/deploy-to-gitlab.sh new file mode 100755 index 0000000..46c53b2 --- /dev/null +++ b/deploy-to-gitlab.sh @@ -0,0 +1,294 @@ +#!/bin/bash + +# ============================================================================= +# VigilanzaTurni - 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. BACKUP DATABASE POSTGRESQL +# ============================================================================= + +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/vigilanzaturni_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) + if pg_dump "$DATABASE_URL" > "$BACKUP_FILE" 2>/dev/null; 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!" + exit 1 + fi +fi + +# ============================================================================= +# 5. 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" + +# ============================================================================= +# 6. CONFIGURA GIT REMOTE CON CREDENZIALI +# ============================================================================= + +log_info "Configuro repository GitLab..." + +# Costruisci URL con autenticazione +if [[ "$GITLAB_REPO" == https://* ]]; then + # HTTPS: aggiungi token + 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" + +# ============================================================================= +# 7. 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 backup: $BACKUP_FILE +- 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 diff --git a/version.json b/version.json new file mode 100644 index 0000000..e4feaf4 --- /dev/null +++ b/version.json @@ -0,0 +1,12 @@ +{ + "version": "1.0.0", + "lastUpdate": "2025-01-17T00:00:00Z", + "changelog": [ + { + "version": "1.0.0", + "date": "2025-01-17", + "type": "initial", + "description": "Versione iniziale VigilanzaTurni - Sistema completo gestione turni vigilanza" + } + ] +}