furt/scripts/build-package.sh
michael eb64c39312 feat(distribution): add clean package build system
- Add scripts/build-package.sh for production-ready packages
- VCS-agnostic archive creation (git/hg/bzr/fossil support)
- Automatic version detection from VERSION file or git tags
- Secure exclusions for development files and secrets
- Package validation and content verification
- Support for explicit version override

Creates dist/furt-api-gateway-vX.Y.Z.tar.gz with clean structure
for deployment without development dependencies.

Related to DAW/furt#88
2025-09-03 20:24:59 +02:00

168 lines
4.9 KiB
Bash
Executable file

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