169 lines
4.9 KiB
Bash
169 lines
4.9 KiB
Bash
|
|
#!/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 "$@"
|
||
|
|
|