Files
dbbackup/build_all.sh
Alexander Renz faace7271c
Some checks failed
CI/CD / Test (push) Successful in 2m42s
CI/CD / Build (amd64, darwin) (push) Has been cancelled
CI/CD / Build (amd64, linux) (push) Has been cancelled
CI/CD / Build (arm64, darwin) (push) Has been cancelled
CI/CD / Build (arm64, linux) (push) Has been cancelled
CI/CD / Lint (push) Has been cancelled
fix(restore): add pre-validation for truncated SQL dumps
- Validate SQL dump files BEFORE attempting restore
- Detect unterminated COPY blocks that cause 'syntax error' failures
- Cluster restore now pre-validates ALL dumps upfront (fail-fast)
- Saves hours of wasted restore time on corrupted backups

The truncated resydb.sql.gz was causing 49min restore attempts
that failed with 2.6M errors. Now fails immediately with clear
error message showing which table's COPY block was truncated.
2026-01-07 08:34:10 +01:00

288 lines
8.9 KiB
Bash
Executable File

#!/bin/bash
# Cross-platform build script for dbbackup
# Builds binaries for all major platforms and architectures
set -e
# Check prerequisites
if ! command -v go &> /dev/null; then
echo "❌ Error: Go is not installed or not in PATH"
exit 1
fi
GO_VERSION=$(go version | awk '{print $3}' | sed 's/go//')
echo "🔧 Using Go version: $GO_VERSION"
# Configuration
APP_NAME="dbbackup"
VERSION="3.40.0"
BUILD_TIME=$(date -u '+%Y-%m-%d_%H:%M:%S_UTC')
GIT_COMMIT=$(git rev-parse --short HEAD 2>/dev/null || echo "unknown")
BIN_DIR="bin"
# Build flags
LDFLAGS="-w -s -X main.version=${VERSION} -X main.buildTime=${BUILD_TIME} -X main.gitCommit=${GIT_COMMIT}"
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
PURPLE='\033[0;35m'
CYAN='\033[0;36m'
BOLD='\033[1m'
NC='\033[0m'
# Platform configurations
# Format: "GOOS/GOARCH:binary_suffix:description"
PLATFORMS=(
"linux/amd64::Linux 64-bit (Intel/AMD)"
"linux/arm64::Linux 64-bit (ARM)"
"linux/arm:_armv7:Linux 32-bit (ARMv7)"
"darwin/amd64::macOS 64-bit (Intel)"
"darwin/arm64::macOS 64-bit (Apple Silicon)"
"windows/amd64:.exe:Windows 64-bit (Intel/AMD)"
"windows/arm64:.exe:Windows 64-bit (ARM)"
"freebsd/amd64::FreeBSD 64-bit (Intel/AMD)"
"openbsd/amd64::OpenBSD 64-bit (Intel/AMD)"
"netbsd/amd64::NetBSD 64-bit (Intel/AMD)"
)
echo -e "${BOLD}${BLUE}🔨 Cross-Platform Build Script for ${APP_NAME}${NC}"
echo -e "${BOLD}${BLUE}================================================${NC}"
echo -e "Version: ${YELLOW}${VERSION}${NC}"
echo -e "Build Time: ${YELLOW}${BUILD_TIME}${NC}"
echo -e "Git Commit: ${YELLOW}${GIT_COMMIT}${NC}"
echo ""
# Create bin directory
mkdir -p "${BIN_DIR}"
# Clean previous builds
echo -e "${CYAN}🧹 Cleaning previous builds...${NC}"
rm -f "${BIN_DIR}"/*
# Build counter
total_platforms=${#PLATFORMS[@]}
current=0
echo -e "${CYAN}🏗️ Building for ${total_platforms} platforms...${NC}"
echo ""
# Build for each platform
for platform_config in "${PLATFORMS[@]}"; do
current=$((current + 1))
# Parse platform configuration
IFS=':' read -r platform suffix description <<< "$platform_config"
IFS='/' read -r GOOS GOARCH <<< "$platform"
# Generate binary name
binary_name="${APP_NAME}_${GOOS}_${GOARCH}${suffix}"
echo -e "${YELLOW}[$current/$total_platforms]${NC} Building for ${BOLD}$description${NC} (${platform})"
# Set environment and build (using export for better compatibility)
# CGO_ENABLED=0 creates static binaries without glibc dependency
export CGO_ENABLED=0 GOOS GOARCH
if go build -ldflags "$LDFLAGS" -o "${BIN_DIR}/${binary_name}" . 2>/dev/null; then
# Get file size
if [[ "$OSTYPE" == "darwin"* ]]; then
size=$(stat -f%z "${BIN_DIR}/${binary_name}" 2>/dev/null || echo "0")
else
size=$(stat -c%s "${BIN_DIR}/${binary_name}" 2>/dev/null || echo "0")
fi
# Format size
if [ $size -gt 1048576 ]; then
size_mb=$((size / 1048576))
size_formatted="${size_mb}M"
elif [ $size -gt 1024 ]; then
size_kb=$((size / 1024))
size_formatted="${size_kb}K"
else
size_formatted="${size}B"
fi
echo -e " ${GREEN}✅ Success${NC} - ${binary_name} (${size_formatted})"
# Test binary validity (quick check)
if [[ "$GOOS" == "$(go env GOOS)" && "$GOARCH" == "$(go env GOARCH)" ]]; then
if "${BIN_DIR}/${binary_name}" --help >/dev/null 2>&1; then
echo -e " ${GREEN} ✓ Binary test passed${NC}"
else
echo -e " ${YELLOW} ⚠ Binary test failed (may still work)${NC}"
fi
fi
else
echo -e " ${RED}❌ Failed${NC} - ${binary_name}"
echo -e " ${RED} Error during compilation${NC}"
fi
done
echo ""
echo -e "${BOLD}${GREEN}🎉 Build completed!${NC}"
echo ""
# Show build results
echo -e "${BOLD}${PURPLE}📦 Build Results:${NC}"
echo -e "${PURPLE}================${NC}"
ls -la "${BIN_DIR}/" | tail -n +2 | while read -r line; do
filename=$(echo "$line" | awk '{print $9}')
size=$(echo "$line" | awk '{print $5}')
if [[ "$filename" == *"linux_amd64"* ]]; then
echo -e " 🐧 $filename (${size} bytes)"
elif [[ "$filename" == *"linux_arm"* ]]; then
echo -e " 🤖 $filename (${size} bytes)"
elif [[ "$filename" == *"darwin"* ]]; then
echo -e " 🍎 $filename (${size} bytes)"
elif [[ "$filename" == *"windows"* ]]; then
echo -e " 🪟 $filename (${size} bytes)"
elif [[ "$filename" == *"freebsd"* ]]; then
echo -e " 😈 $filename (${size} bytes)"
elif [[ "$filename" == *"openbsd"* ]]; then
echo -e " 🐡 $filename (${size} bytes)"
elif [[ "$filename" == *"netbsd"* ]]; then
echo -e " 🐅 $filename (${size} bytes)"
else
echo -e " 📦 $filename (${size} bytes)"
fi
done
echo ""
# Generate README for bin directory
cat > "${BIN_DIR}/README.md" << EOF
# DB Backup Tool - Pre-compiled Binaries
This directory contains pre-compiled binaries for the DB Backup Tool across multiple platforms and architectures.
## Build Information
- **Version**: ${VERSION}
- **Build Time**: ${BUILD_TIME}
- **Git Commit**: ${GIT_COMMIT}
## Recent Updates (v1.1.0)
- ✅ Fixed TUI progress display with line-by-line output
- ✅ Added interactive configuration settings menu
- ✅ Improved menu navigation and responsiveness
- ✅ Enhanced completion status handling
- ✅ Better CPU detection and optimization
- ✅ Silent mode support for TUI operations
## Available Binaries
### Linux
- \`dbbackup_linux_amd64\` - Linux 64-bit (Intel/AMD)
- \`dbbackup_linux_arm64\` - Linux 64-bit (ARM)
- \`dbbackup_linux_arm_armv7\` - Linux 32-bit (ARMv7)
### macOS
- \`dbbackup_darwin_amd64\` - macOS 64-bit (Intel)
- \`dbbackup_darwin_arm64\` - macOS 64-bit (Apple Silicon)
### Windows
- \`dbbackup_windows_amd64.exe\` - Windows 64-bit (Intel/AMD)
- \`dbbackup_windows_arm64.exe\` - Windows 64-bit (ARM)
### BSD Systems
- \`dbbackup_freebsd_amd64\` - FreeBSD 64-bit
- \`dbbackup_openbsd_amd64\` - OpenBSD 64-bit
- \`dbbackup_netbsd_amd64\` - NetBSD 64-bit
## Usage
1. Download the appropriate binary for your platform
2. Make it executable (Unix-like systems): \`chmod +x dbbackup_*\`
3. Run: \`./dbbackup_* --help\`
## Interactive Mode
Launch the interactive TUI menu for easy configuration and operation:
\`\`\`bash
# Interactive mode with TUI menu
./dbbackup_linux_amd64
# Features:
# - Interactive configuration settings
# - Real-time progress display
# - Operation history and status
# - CPU detection and optimization
\`\`\`
## Command Line Mode
Direct command line usage with line-by-line progress:
\`\`\`bash
# Show CPU information and optimization settings
./dbbackup_linux_amd64 cpu
# Auto-optimize for your hardware
./dbbackup_linux_amd64 backup cluster --auto-detect-cores
# Manual CPU configuration
./dbbackup_linux_amd64 backup single mydb --jobs 8 --dump-jobs 4
# Line-by-line progress output
./dbbackup_linux_amd64 backup cluster --progress-type line
\`\`\`
## CPU Detection
All binaries include advanced CPU detection capabilities:
- Automatic core detection for optimal parallelism
- Support for different workload types (CPU-intensive, I/O-intensive, balanced)
- Platform-specific optimizations for Linux, macOS, and Windows
- Interactive CPU configuration in TUI mode
## Support
For issues or questions, please refer to the main project documentation.
EOF
echo -e "${BOLD}${CYAN}📄 Generated ${BIN_DIR}/README.md${NC}"
echo ""
# Count successful builds
success_count=$(ls -1 "${BIN_DIR}"/dbbackup_* 2>/dev/null | wc -l)
echo -e "${BOLD}${GREEN}✨ Build Summary:${NC}"
echo -e " ${GREEN}${success_count}/${total_platforms} binaries built successfully${NC}"
if [ $success_count -eq $total_platforms ]; then
echo -e " ${GREEN}🎉 All binaries are ready for distribution!${NC}"
else
failed_count=$((total_platforms - success_count))
echo -e " ${YELLOW}⚠️ ${failed_count} builds failed${NC}"
fi
# Detect current platform binary
CURRENT_OS=$(uname -s | tr '[:upper:]' '[:lower:]')
CURRENT_ARCH=$(uname -m)
# Map architecture names
case "$CURRENT_ARCH" in
"x86_64") CURRENT_ARCH="amd64";;
"aarch64") CURRENT_ARCH="arm64";;
"armv7l") CURRENT_ARCH="arm_armv7";;
esac
CURRENT_BINARY="${BIN_DIR}/dbbackup_${CURRENT_OS}_${CURRENT_ARCH}"
if [[ "$CURRENT_OS" == "windows" ]]; then
CURRENT_BINARY="${CURRENT_BINARY}.exe"
fi
echo ""
echo -e "${BOLD}${BLUE}📋 Next Steps:${NC}"
if [[ -f "$CURRENT_BINARY" ]]; then
echo -e " 1. Test current platform: ${CYAN}${CURRENT_BINARY} --help${NC}"
echo -e " 2. Interactive mode: ${CYAN}${CURRENT_BINARY}${NC}"
else
echo -e " 1. Test binary (adjust for your platform): ${CYAN}./bin/dbbackup_*${NC}"
fi
echo -e " 3. Create release: ${CYAN}git tag v${VERSION} && git push --tags${NC}"
echo -e " 4. Archive builds: ${CYAN}tar -czf dbbackup-v${VERSION}-all-platforms.tar.gz bin/${NC}"
echo ""