#!/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 "$@"