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
This commit is contained in:
parent
f2ca7a5e1c
commit
eb64c39312
2 changed files with 169 additions and 0 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
|
@ -16,6 +16,7 @@ logs/
|
||||||
tmp/
|
tmp/
|
||||||
pid/
|
pid/
|
||||||
dist/
|
dist/
|
||||||
|
scripts/upload-package.sh
|
||||||
|
|
||||||
# Issue creation scripts (these create issues, don't version them)
|
# Issue creation scripts (these create issues, don't version them)
|
||||||
scripts/gitea-issues/
|
scripts/gitea-issues/
|
||||||
|
|
|
||||||
168
scripts/build-package.sh
Executable file
168
scripts/build-package.sh
Executable file
|
|
@ -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 "$@"
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue