diff --git a/.gitignore b/.gitignore index b01aba7..8dec80f 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ logs/ tmp/ pid/ dist/ +scripts/upload-package.sh # Issue creation scripts (these create issues, don't version them) scripts/gitea-issues/ diff --git a/scripts/build-package.sh b/scripts/build-package.sh new file mode 100755 index 0000000..e0b3434 --- /dev/null +++ b/scripts/build-package.sh @@ -0,0 +1,168 @@ +#!/bin/bash +# scripts/build-package.sh +# Clean package creation for furt API Gateway +# Creates distribution-ready packages excluding development files + +set -euo pipefail + +# Colors für Output (nur ASCII) +GREEN='\033[0;32m' +BLUE='\033[0;34m' +YELLOW='\033[1;33m' +RED='\033[0;31m' +NC='\033[0m' + +log_info() { + echo -e "${BLUE}[INFO]${NC} $1" +} + +log_success() { + echo -e "${GREEN}[OK]${NC} $1" +} + +log_warn() { + echo -e "${YELLOW}[WARN]${NC} $1" +} + +log_error() { + echo -e "${RED}[ERROR]${NC} $1" +} + +# Version bestimmen +get_version() { + local version="" + + if [[ $# -gt 0 ]]; then + version="$1" + elif [[ -f "VERSION" ]]; then + version=$(cat VERSION | tr -d '\n\r' | sed 's/^v//') + elif git rev-parse --git-dir >/dev/null 2>&1; then + version=$(git describe --tags --abbrev=0 2>/dev/null | sed 's/^v//') + if [[ -z "$version" ]]; then + version="0.1.0-$(git rev-parse --short HEAD)" + fi + else + version="0.1.0-$(date +%Y%m%d)" + fi + + echo "$version" +} + +# Validiere Projekt-Verzeichnis +validate_project() { + if [[ ! -d "src" ]] || [[ ! -f "src/main.lua" ]]; then + log_error "Nicht im furt-Projektverzeichnis oder src/main.lua fehlt" + exit 1 + fi + + if [[ ! -d "config" ]]; then + log_error "config/ Verzeichnis fehlt" + exit 1 + fi + + log_success "Projekt-Struktur validiert" +} + +# Erstelle sauberes Paket mit VCS-Detection +create_package() { + local version="$1" + local package_name="furt-api-gateway-v${version}.tar.gz" + + log_info "Erstelle Paket: $package_name" + + # Erstelle dist/ Verzeichnis falls nicht vorhanden + mkdir -p dist/ + + # VCS-Detection für saubere Archive (wie bei merkwerk) + if git rev-parse --git-dir >/dev/null 2>&1; then + log_info "Using git archive..." + git archive --format=tar.gz --prefix=furt-api-gateway-v${version}/ HEAD > "dist/$package_name" + elif hg root >/dev/null 2>&1; then + log_info "Using hg archive..." + hg archive -t tgz -p furt-api-gateway-v${version}/ "dist/$package_name" + elif bzr info >/dev/null 2>&1; then + log_info "Using bzr export..." + bzr export --format=tgz "dist/$package_name" --root=furt-api-gateway-v${version}/ + elif fossil info >/dev/null 2>&1; then + log_info "Using fossil tarball..." + fossil tarball --name furt-api-gateway-v${version} "dist/$package_name" HEAD + else + log_info "No VCS detected, using secure tar exclusions..." + tar -czf "dist/$package_name" \ + --exclude='.git*' --exclude='.hg*' --exclude='.bzr*' --exclude='_FOSSIL_*' \ + --exclude='dist' --exclude='*.tmp' --exclude='*~' \ + --exclude='.env*' --exclude='*secret*' --exclude='*key*' \ + --exclude='*.log' --exclude='*.pid' --exclude='.DS_Store' \ + --exclude='debug.log' --exclude='furt.pid' \ + --transform="s,^,furt-api-gateway-v${version}/," \ + . + fi + + # VERSION file in Archive aktualisieren falls nötig + if [[ ! -f "VERSION" ]]; then + log_warn "VERSION file fehlt - wird im Archiv ergänzt" + # Temporär entpacken, VERSION hinzufügen, neu packen + local temp_dir=$(mktemp -d) + tar -xzf "dist/$package_name" -C "$temp_dir" + echo "$version" > "$temp_dir/furt-api-gateway-v${version}/VERSION" + tar -czf "dist/$package_name" -C "$temp_dir" "furt-api-gateway-v${version}" + rm -rf "$temp_dir" + log_info "VERSION file im Archiv ergänzt" + fi + + # Package-Info + local size=$(du -h "dist/$package_name" | cut -f1) + log_success "Paket erstellt: dist/$package_name ($size)" + + # Content-Verification + log_info "Paket-Inhalt:" + tar -tzf "dist/$package_name" | head -20 + if [[ $(tar -tzf "dist/$package_name" | wc -l) -gt 20 ]]; then + log_info " ... und $(( $(tar -tzf "dist/$package_name" | wc -l) - 20 )) weitere Dateien" + fi +} + +# Hilfe anzeigen +show_help() { + echo "build-package.sh - Furt Package Builder" + echo "" + echo "Usage: $0 [VERSION]" + echo "" + echo "VERSION:" + echo " Explicit version string (e.g., 1.0.0)" + echo " If not provided, uses VERSION file or git tags" + echo "" + echo "Examples:" + echo " $0 # Auto-detect version" + echo " $0 1.0.0 # Explicit version" + echo " $0 1.1.0-rc1 # Pre-release" + echo "" + echo "Output: dist/furt-api-gateway-vVERSION.tar.gz" +} + +# Main +main() { + if [[ $# -gt 0 ]] && [[ "$1" == "-h" || "$1" == "--help" ]]; then + show_help + exit 0 + fi + + log_info "Furt Package Builder" + + validate_project + + local version + version=$(get_version "$@") + log_info "Version: $version" + + create_package "$version" + + log_success "Package build abgeschlossen!" + log_info "" + log_info "Nächste Schritte:" + log_info " 1. Upload: ./scripts/upload-package.sh $version" + log_info " 2. Test: tar -tzf dist/furt-api-gateway-v$version.tar.gz" +} + +main "$@" +