VigilanzaTurni/deploy-to-gitlab.sh
marco370 7fb5f35138 Update repository access to use username and token for Gitea
Modify deploy script to use username and token for HTTPS Git access, aligning with Gitea's authentication requirements instead of GitLab's OAuth2.

Replit-Commit-Author: Agent
Replit-Commit-Session-Id: 42d8028a-fa71-4ec2-938c-e43eedf7df01
Replit-Commit-Checkpoint-Type: full_checkpoint
Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/6d543d2c-20b9-4ea6-93fe-70fe9b1d9f80/42d8028a-fa71-4ec2-938c-e43eedf7df01/Z1LDqzu
2025-10-17 06:52:30 +00:00

296 lines
8.8 KiB
Bash

#!/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 <<EOF
{
"version": "$NEW_VERSION",
"date": "$(date +%Y-%m-%d)",
"type": "$INCREMENT_TYPE",
"description": "Deployment automatico v$NEW_VERSION"
}
EOF
)
# Aggiorna version.json con Node.js
node -e "
const fs = require('fs');
const versionData = JSON.parse(fs.readFileSync('version.json', 'utf8'));
versionData.version = '$NEW_VERSION';
versionData.lastUpdate = new Date().toISOString();
versionData.changelog = versionData.changelog || [];
versionData.changelog.unshift($CHANGELOG_ENTRY);
// Mantieni solo ultimi 50 changelog
if (versionData.changelog.length > 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: 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"
# =============================================================================
# 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