Project-Image-Uploader/scripts/release.sh
matthias.lotz 8818d2987d chore: release v1.10.0
🔖 Version 1.10.0

###  Features
- Enable drag-and-drop reordering in ModerationGroupImagesPage
- Error handling system and animated error pages

### ♻️ Refactoring
- Extract ConsentFilter and StatsDisplay components from ModerationGroupsPage
- Consolidate error pages into single ErrorPage component
- Centralized styling with CSS and global MUI overrides

### 🔧 Chores
- Improve release script with tag-based commit detection
2025-11-29 16:57:14 +01:00

193 lines
5.7 KiB
Bash
Executable File

#!/bin/bash
# Automatisches Release-Script mit CHANGELOG-Generierung
set -e
VERSION_TYPE=${1:-patch}
CUSTOM_MESSAGE=${2:-""}
if [[ ! "$VERSION_TYPE" =~ ^(patch|minor|major)$ ]]; then
echo "❌ Ungültiger Version-Typ: $VERSION_TYPE"
echo "Verwendung: ./scripts/release.sh [patch|minor|major] [optional: custom message]"
exit 1
fi
GREEN='\033[0;32m'
BLUE='\033[0;34m'
YELLOW='\033[1;33m'
NC='\033[0m'
echo -e "${BLUE}🚀 Automated Release: ${YELLOW}${VERSION_TYPE}${NC}"
echo ""
# 1. Hole aktuelle Version vom letzten Git-Tag
LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
if [ -z "$LAST_TAG" ]; then
echo -e "${YELLOW}⚠️ Kein vorheriger Tag gefunden. Verwende Version aus package.json${NC}"
CURRENT_VERSION=$(node -p "require('./frontend/package.json').version")
else
# Entferne führendes "v" falls vorhanden
CURRENT_VERSION=${LAST_TAG#v}
fi
echo -e "📌 Aktuelle Version (Tag): ${CURRENT_VERSION}"
# 2. Berechne neue Version basierend auf dem Tag
IFS='.' read -r MAJOR MINOR PATCH <<< "$CURRENT_VERSION"
case $VERSION_TYPE in
major)
NEW_VERSION="$((MAJOR + 1)).0.0"
;;
minor)
NEW_VERSION="${MAJOR}.$((MINOR + 1)).0"
;;
patch)
NEW_VERSION="${MAJOR}.${MINOR}.$((PATCH + 1))"
;;
esac
echo -e "📦 Neue Version: ${GREEN}${NEW_VERSION}${NC}"
echo ""
# 3. Setze neue Version in package.json
cd frontend
npm version $NEW_VERSION --no-git-tag-version > /dev/null
cd ..
# 3. Synchronisiere alle Dateien
echo "🔄 Synchronisiere Version überall..."
./scripts/sync-version.sh > /dev/null 2>&1
# 4. Sammle Commits seit letztem Tag
echo "📝 Generiere CHANGELOG-Eintrag..."
LAST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || echo "")
if [ -z "$LAST_TAG" ]; then
echo -e "${YELLOW}⚠️ Kein vorheriger Tag gefunden. Alle Commits werden verwendet.${NC}"
echo " Tipp: Erstelle rückwirkend einen Tag für die letzte Version:"
echo " git tag -a v1.1.0 <commit-hash> -m 'Release 1.1.0'"
echo ""
COMMITS=$(git log --oneline --no-merges)
else
echo "📋 Commits seit Tag $LAST_TAG werden verwendet"
COMMITS=$(git log ${LAST_TAG}..HEAD --oneline --no-merges)
fi
# 5. Gruppiere Commits nach Typ
FEATURES=$(echo "$COMMITS" | grep "^[a-f0-9]* feat:" || true)
FIXES=$(echo "$COMMITS" | grep "^[a-f0-9]* fix:" || true)
REFACTOR=$(echo "$COMMITS" | grep "^[a-f0-9]* refactor:" || true)
CHORE=$(echo "$COMMITS" | grep "^[a-f0-9]* chore:" || true)
DOCS=$(echo "$COMMITS" | grep "^[a-f0-9]* docs:" || true)
# 6. Erstelle CHANGELOG-Eintrag
DATE=$(date +%Y-%m-%d)
CHANGELOG_ENTRY="## [${NEW_VERSION}] - ${DATE}\n\n"
if [ -n "$CUSTOM_MESSAGE" ]; then
CHANGELOG_ENTRY+="${CUSTOM_MESSAGE}\n\n"
fi
if [ -n "$FEATURES" ]; then
CHANGELOG_ENTRY+="### ✨ Features\n"
while IFS= read -r line; do
MSG=$(echo "$line" | sed -E 's/^[a-f0-9]+ feat: //')
CHANGELOG_ENTRY+="- ${MSG}\n"
done <<< "$FEATURES"
CHANGELOG_ENTRY+="\n"
fi
if [ -n "$FIXES" ]; then
CHANGELOG_ENTRY+="### 🐛 Fixes\n"
while IFS= read -r line; do
MSG=$(echo "$line" | sed -E 's/^[a-f0-9]+ fix: //')
CHANGELOG_ENTRY+="- ${MSG}\n"
done <<< "$FIXES"
CHANGELOG_ENTRY+="\n"
fi
if [ -n "$REFACTOR" ]; then
CHANGELOG_ENTRY+="### ♻️ Refactoring\n"
while IFS= read -r line; do
MSG=$(echo "$line" | sed -E 's/^[a-f0-9]+ refactor: //')
CHANGELOG_ENTRY+="- ${MSG}\n"
done <<< "$REFACTOR"
CHANGELOG_ENTRY+="\n"
fi
if [ -n "$CHORE" ]; then
CHANGELOG_ENTRY+="### 🔧 Chores\n"
while IFS= read -r line; do
MSG=$(echo "$line" | sed -E 's/^[a-f0-9]+ chore: //')
CHANGELOG_ENTRY+="- ${MSG}\n"
done <<< "$CHORE"
CHANGELOG_ENTRY+="\n"
fi
# 7. Füge Eintrag in CHANGELOG.md ein (nach der Überschrift)
if [ -f "CHANGELOG.md" ]; then
# Temporäre Datei erstellen
TEMP_FILE=$(mktemp)
# Erste Zeilen (bis erste ##) behalten
awk '/^## \[/ {exit} {print}' CHANGELOG.md > "$TEMP_FILE"
# Neuen Eintrag hinzufügen
echo -e "$CHANGELOG_ENTRY" >> "$TEMP_FILE"
# Rest des alten CHANGELOG anhängen
awk '/^## \[/ {found=1} found {print}' CHANGELOG.md >> "$TEMP_FILE"
# Ersetzen
mv "$TEMP_FILE" CHANGELOG.md
echo -e "${GREEN}✓ CHANGELOG.md aktualisiert${NC}"
else
# CHANGELOG erstellen
cat > CHANGELOG.md << EOF
# Changelog
Alle wichtigen Änderungen an diesem Projekt werden in dieser Datei dokumentiert.
Das Format basiert auf [Keep a Changelog](https://keepachangelog.com/de/1.0.0/),
und dieses Projekt hält sich an [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
$CHANGELOG_ENTRY
EOF
echo -e "${GREEN}✓ CHANGELOG.md erstellt${NC}"
fi
# 8. Preview anzeigen
echo ""
echo -e "${BLUE}📄 CHANGELOG Preview:${NC}"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo -e "$CHANGELOG_ENTRY" | head -20
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
# 9. Frage nach Bestätigung
read -p "Sieht das gut aus? [Y/n] " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]] && [[ ! -z $REPLY ]]; then
echo "❌ Abgebrochen. Änderungen wurden NICHT committed."
exit 1
fi
# 10. Git Commit & Tag
echo ""
echo "📦 Erstelle Git Commit & Tag..."
git add -A
git commit -m "chore: release v${NEW_VERSION}
🔖 Version ${NEW_VERSION}
$(echo -e "$CHANGELOG_ENTRY" | sed 's/^## .*//' | sed 's/^$//' | head -30)"
git tag -a "v${NEW_VERSION}" -m "Release v${NEW_VERSION}"
echo -e "${GREEN}✓ Commit & Tag erstellt${NC}"
echo ""
echo -e "${BLUE}Nächste Schritte:${NC}"
echo " git push && git push --tags"
echo ""
echo -e "${GREEN}✅ Release v${NEW_VERSION} fertig!${NC}"