- Enhanced moebius ring logo design in Blender - Updated Docker Compose for website-only deployment with improved config - Enhanced teaser layout with updated branding integration - Added installation and setup documentation - Consolidated planning and reports documentation - Updated gitignore to exclude Next.js build artifacts and archives 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
409 lines
11 KiB
Bash
Executable File
409 lines
11 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# CHORUS Release Build System
|
|
# Builds cross-platform binaries for distribution
|
|
|
|
set -e
|
|
|
|
# Colors and formatting
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
BLUE='\033[0;34m'
|
|
PURPLE='\033[0;35m'
|
|
CYAN='\033[0;36m'
|
|
WHITE='\033[1;37m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Configuration
|
|
CHORUS_ROOT="$HOME/chorus/project-queues/active"
|
|
BZZZ_SOURCE="$CHORUS_ROOT/BZZZ"
|
|
WHOOSH_SOURCE="$CHORUS_ROOT/WHOOSH"
|
|
BUILD_DIR="$HOME/chorus/releases"
|
|
VERSION="${VERSION:-$(date +%Y%m%d-%H%M%S)}"
|
|
RELEASE_CHANNEL="${RELEASE_CHANNEL:-latest}"
|
|
|
|
# Target platforms
|
|
PLATFORMS=(
|
|
"linux/amd64"
|
|
"linux/arm64"
|
|
"linux/arm"
|
|
"darwin/amd64"
|
|
"darwin/arm64"
|
|
)
|
|
|
|
# Logging functions
|
|
log_info() {
|
|
echo -e "${GREEN}✓${NC} $1"
|
|
}
|
|
|
|
log_warn() {
|
|
echo -e "${YELLOW}⚠${NC} $1"
|
|
}
|
|
|
|
log_error() {
|
|
echo -e "${RED}✗${NC} $1"
|
|
}
|
|
|
|
log_step() {
|
|
echo -e "${BLUE}▶${NC} $1"
|
|
}
|
|
|
|
print_banner() {
|
|
echo -e "${PURPLE}"
|
|
cat << 'EOF'
|
|
██████╗██╗ ██╗ ██████╗ ██████╗ ██╗ ██╗███████╗
|
|
██╔════╝██║ ██║██╔═══██╗██╔══██╗██║ ██║██╔════╝
|
|
██║ ███████║██║ ██║██████╔╝██║ ██║███████╗
|
|
██║ ██╔══██║██║ ██║██╔══██╗██║ ██║╚════██║
|
|
╚██████╗██║ ██║╚██████╔╝██║ ██║╚██████╔╝███████║
|
|
╚═════╝╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚══════╝
|
|
|
|
🏗️ Release Build System
|
|
EOF
|
|
echo -e "${NC}"
|
|
echo -e "${CYAN} Building cross-platform binaries for distribution${NC}"
|
|
echo ""
|
|
}
|
|
|
|
# Clean previous builds
|
|
clean_build_dir() {
|
|
log_step "Cleaning build directory..."
|
|
rm -rf "$BUILD_DIR"
|
|
mkdir -p "$BUILD_DIR"/{bzzz,whoosh}/"$RELEASE_CHANNEL"
|
|
log_info "Build directory cleaned"
|
|
}
|
|
|
|
# Check prerequisites
|
|
check_prerequisites() {
|
|
log_step "Checking prerequisites..."
|
|
|
|
# Check Go installation
|
|
if ! command -v go >/dev/null 2>&1; then
|
|
log_error "Go is not installed. Please install Go first."
|
|
exit 1
|
|
fi
|
|
|
|
# Check Docker for WHOOSH
|
|
if ! command -v docker >/dev/null 2>&1; then
|
|
log_warn "Docker not found - WHOOSH builds will be skipped"
|
|
fi
|
|
|
|
# Check source directories
|
|
if [[ ! -d "$BZZZ_SOURCE" ]]; then
|
|
log_error "BZZZ source not found at $BZZZ_SOURCE"
|
|
exit 1
|
|
fi
|
|
|
|
if [[ ! -d "$WHOOSH_SOURCE" ]]; then
|
|
log_warn "WHOOSH source not found at $WHOOSH_SOURCE - skipping WHOOSH build"
|
|
fi
|
|
|
|
log_info "Prerequisites checked"
|
|
}
|
|
|
|
# Build BZZZ binaries
|
|
build_bzzz() {
|
|
log_step "Building BZZZ binaries..."
|
|
|
|
cd "$BZZZ_SOURCE"
|
|
|
|
# Fix import cycles first
|
|
log_step "Attempting to fix import cycles..."
|
|
if ! fix_import_cycles; then
|
|
log_warn "Could not automatically fix import cycles"
|
|
fi
|
|
|
|
# Clean module cache
|
|
go clean -modcache 2>/dev/null || true
|
|
go mod tidy
|
|
|
|
# Build for each platform
|
|
for platform in "${PLATFORMS[@]}"; do
|
|
local os="${platform%/*}"
|
|
local arch="${platform#*/}"
|
|
|
|
log_step "Building BZZZ for $os/$arch..."
|
|
|
|
local output_name="bzzz-$os-$arch"
|
|
if [[ "$os" == "windows" ]]; then
|
|
output_name="$output_name.exe"
|
|
fi
|
|
|
|
local output_path="$BUILD_DIR/bzzz/$RELEASE_CHANNEL/$output_name"
|
|
|
|
# Set build environment
|
|
export GOOS="$os"
|
|
export GOARCH="$arch"
|
|
export CGO_ENABLED=0
|
|
|
|
# Build with minimal dependencies to avoid import cycles
|
|
if go build -tags="minimal,release" -ldflags="-s -w -X main.version=$VERSION" -o "$output_path" . 2>/dev/null; then
|
|
log_info "Built $output_name successfully"
|
|
else
|
|
log_warn "Failed to build $output_name - trying alternative approach"
|
|
|
|
# Try building with main.go only
|
|
if go build -tags="minimal" -ldflags="-s -w" -o "$output_path" main.go 2>/dev/null; then
|
|
log_info "Built $output_name (minimal version)"
|
|
else
|
|
log_error "Failed to build $output_name"
|
|
fi
|
|
fi
|
|
done
|
|
|
|
# Reset environment
|
|
unset GOOS GOARCH CGO_ENABLED
|
|
|
|
log_info "BZZZ binaries build completed"
|
|
}
|
|
|
|
# Fix import cycles (basic attempt)
|
|
fix_import_cycles() {
|
|
log_step "Attempting to fix Go import cycles..."
|
|
|
|
# Look for common import cycle patterns and try to fix them
|
|
# This is a basic approach - may need manual intervention for complex cycles
|
|
|
|
# Create a backup
|
|
cp -r . "${BZZZ_SOURCE}.backup.$(date +%s)" 2>/dev/null || true
|
|
|
|
# Try to build and capture errors
|
|
local build_output
|
|
if build_output=$(go build . 2>&1); then
|
|
log_info "No import cycles detected"
|
|
return 0
|
|
fi
|
|
|
|
if echo "$build_output" | grep -q "import cycle"; then
|
|
log_warn "Import cycles detected - manual intervention may be required"
|
|
echo "$build_output" | grep "import cycle" | head -5
|
|
return 1
|
|
fi
|
|
|
|
return 0
|
|
}
|
|
|
|
# Copy service files
|
|
copy_service_files() {
|
|
log_step "Copying service files..."
|
|
|
|
local bzzz_release_dir="$BUILD_DIR/bzzz/$RELEASE_CHANNEL"
|
|
|
|
# Copy systemd service file
|
|
if [[ -f "$BZZZ_SOURCE/bzzz.service" ]]; then
|
|
cp "$BZZZ_SOURCE/bzzz.service" "$bzzz_release_dir/"
|
|
log_info "Copied bzzz.service"
|
|
else
|
|
log_warn "bzzz.service not found in source"
|
|
fi
|
|
|
|
# Copy install script
|
|
if [[ -f "$BZZZ_SOURCE/install-service.sh" ]]; then
|
|
cp "$BZZZ_SOURCE/install-service.sh" "$bzzz_release_dir/"
|
|
chmod +x "$bzzz_release_dir/install-service.sh"
|
|
log_info "Copied install-service.sh"
|
|
else
|
|
log_warn "install-service.sh not found in source"
|
|
fi
|
|
|
|
log_info "Service files copied"
|
|
}
|
|
|
|
# Build WHOOSH package
|
|
build_whoosh() {
|
|
if [[ ! -d "$WHOOSH_SOURCE" ]]; then
|
|
log_warn "WHOOSH source not found - skipping"
|
|
return
|
|
fi
|
|
|
|
log_step "Building WHOOSH package..."
|
|
|
|
cd "$WHOOSH_SOURCE"
|
|
|
|
local whoosh_release_dir="$BUILD_DIR/whoosh/$RELEASE_CHANNEL"
|
|
|
|
# Create docker-compose package
|
|
if [[ -f "docker-compose.yml" ]] || [[ -f "docker-compose.swarm.yml" ]]; then
|
|
log_step "Creating WHOOSH Docker Compose package..."
|
|
|
|
# Create temporary directory for packaging
|
|
local temp_dir=$(mktemp -d)
|
|
|
|
# Copy relevant files
|
|
cp -r . "$temp_dir/whoosh/"
|
|
|
|
# Create tarball
|
|
cd "$temp_dir"
|
|
tar -czf "$whoosh_release_dir/whoosh-docker-compose.tar.gz" whoosh/
|
|
|
|
# Cleanup
|
|
rm -rf "$temp_dir"
|
|
|
|
log_info "WHOOSH package created"
|
|
else
|
|
log_warn "No Docker Compose files found for WHOOSH"
|
|
fi
|
|
}
|
|
|
|
# Generate checksums
|
|
generate_checksums() {
|
|
log_step "Generating checksums..."
|
|
|
|
cd "$BUILD_DIR"
|
|
|
|
# Generate checksums for BZZZ binaries
|
|
if [[ -d "bzzz/$RELEASE_CHANNEL" ]]; then
|
|
cd "bzzz/$RELEASE_CHANNEL"
|
|
sha256sum * > checksums.txt
|
|
log_info "BZZZ checksums generated"
|
|
cd "$BUILD_DIR"
|
|
fi
|
|
|
|
# Generate checksums for WHOOSH
|
|
if [[ -d "whoosh/$RELEASE_CHANNEL" ]]; then
|
|
cd "whoosh/$RELEASE_CHANNEL"
|
|
sha256sum * > checksums.txt 2>/dev/null || true
|
|
log_info "WHOOSH checksums generated"
|
|
cd "$BUILD_DIR"
|
|
fi
|
|
|
|
log_info "Checksums generated"
|
|
}
|
|
|
|
# Create release info
|
|
create_release_info() {
|
|
log_step "Creating release information..."
|
|
|
|
local release_info="$BUILD_DIR/release-info.json"
|
|
|
|
cat > "$release_info" << EOF
|
|
{
|
|
"version": "$VERSION",
|
|
"channel": "$RELEASE_CHANNEL",
|
|
"build_time": "$(date -u +%Y-%m-%dT%H:%M:%SZ)",
|
|
"platforms": [
|
|
$(printf ' "%s"' "${PLATFORMS[@]}" | paste -sd ',' -)
|
|
],
|
|
"components": {
|
|
"bzzz": {
|
|
"description": "P2P Task Coordination System",
|
|
"binaries": [
|
|
$(find "$BUILD_DIR/bzzz/$RELEASE_CHANNEL" -name "bzzz-*" -type f | sed 's|.*/||' | sed 's/^/ "/' | sed 's/$/"/' | paste -sd ',' -)
|
|
]
|
|
},
|
|
"whoosh": {
|
|
"description": "Web Dashboard and Management Interface",
|
|
"packages": [
|
|
$(find "$BUILD_DIR/whoosh/$RELEASE_CHANNEL" -name "*.tar.gz" -type f 2>/dev/null | sed 's|.*/||' | sed 's/^/ "/' | sed 's/$/"/' | paste -sd ',' - || echo '')
|
|
]
|
|
}
|
|
}
|
|
}
|
|
EOF
|
|
|
|
log_info "Release information created"
|
|
}
|
|
|
|
# Show build summary
|
|
show_summary() {
|
|
echo ""
|
|
echo -e "${GREEN}🎉 Release Build Complete!${NC}"
|
|
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
|
echo ""
|
|
echo -e "${WHITE}Build Information:${NC}"
|
|
echo " • Version: $VERSION"
|
|
echo " • Channel: $RELEASE_CHANNEL"
|
|
echo " • Build Directory: $BUILD_DIR"
|
|
echo ""
|
|
echo -e "${WHITE}Built Components:${NC}"
|
|
|
|
# List BZZZ binaries
|
|
local bzzz_count=$(find "$BUILD_DIR/bzzz/$RELEASE_CHANNEL" -name "bzzz-*" -type f 2>/dev/null | wc -l)
|
|
echo " • BZZZ binaries: $bzzz_count"
|
|
|
|
# List WHOOSH packages
|
|
local whoosh_count=$(find "$BUILD_DIR/whoosh/$RELEASE_CHANNEL" -name "*.tar.gz" -type f 2>/dev/null | wc -l)
|
|
echo " • WHOOSH packages: $whoosh_count"
|
|
|
|
echo ""
|
|
echo -e "${WHITE}Next Steps:${NC}"
|
|
echo " 1. Test binaries: $BUILD_DIR/bzzz/$RELEASE_CHANNEL/bzzz-linux-amd64 --version"
|
|
echo " 2. Upload to releases.chorus.services"
|
|
echo " 3. Update installer URLs if needed"
|
|
echo ""
|
|
}
|
|
|
|
# Parse command line arguments
|
|
while [[ $# -gt 0 ]]; do
|
|
case $1 in
|
|
--version)
|
|
VERSION="$2"
|
|
shift 2
|
|
;;
|
|
--channel)
|
|
RELEASE_CHANNEL="$2"
|
|
shift 2
|
|
;;
|
|
--bzzz-only)
|
|
BUILD_WHOOSH=false
|
|
shift
|
|
;;
|
|
--whoosh-only)
|
|
BUILD_BZZZ=false
|
|
shift
|
|
;;
|
|
--help)
|
|
echo "CHORUS Release Build System"
|
|
echo ""
|
|
echo "Usage: $0 [OPTIONS]"
|
|
echo ""
|
|
echo "Options:"
|
|
echo " --version VERSION Set release version (default: timestamp)"
|
|
echo " --channel CHANNEL Set release channel (default: latest)"
|
|
echo " --bzzz-only Build only BZZZ binaries"
|
|
echo " --whoosh-only Build only WHOOSH packages"
|
|
echo " --help Show this help"
|
|
echo ""
|
|
exit 0
|
|
;;
|
|
*)
|
|
echo "Unknown option: $1"
|
|
exit 1
|
|
;;
|
|
esac
|
|
done
|
|
|
|
# Default build flags
|
|
BUILD_BZZZ=${BUILD_BZZZ:-true}
|
|
BUILD_WHOOSH=${BUILD_WHOOSH:-true}
|
|
|
|
# Main build process
|
|
main() {
|
|
print_banner
|
|
|
|
echo -e "${WHITE}Starting CHORUS release build...${NC}"
|
|
echo " Version: $VERSION"
|
|
echo " Channel: $RELEASE_CHANNEL"
|
|
echo ""
|
|
|
|
check_prerequisites
|
|
clean_build_dir
|
|
|
|
if [[ "$BUILD_BZZZ" == "true" ]]; then
|
|
build_bzzz
|
|
copy_service_files
|
|
fi
|
|
|
|
if [[ "$BUILD_WHOOSH" == "true" ]]; then
|
|
build_whoosh
|
|
fi
|
|
|
|
generate_checksums
|
|
create_release_info
|
|
|
|
show_summary
|
|
}
|
|
|
|
# Run main build process
|
|
main "$@" |