|
| 1 | +#!/bin/bash |
| 2 | +# Build MCPB bundles for Claude Desktop |
| 3 | +# Usage: ./mcpb/build.sh [version] [--use-dist] |
| 4 | +# |
| 5 | +# This script creates platform-specific .mcpb bundles for: |
| 6 | +# - macOS (darwin) amd64 and arm64 |
| 7 | +# - Windows amd64 |
| 8 | +# |
| 9 | +# Options: |
| 10 | +# --use-dist Use binaries from goreleaser's dist/ folder instead of building |
| 11 | +# |
| 12 | +# Prerequisites: |
| 13 | +# - Go toolchain (if building from source) |
| 14 | +# - goreleaser dist/ output (if using --use-dist) |
| 15 | + |
| 16 | +set -e |
| 17 | + |
| 18 | +VERSION="${1:-dev}" |
| 19 | +USE_DIST=false |
| 20 | + |
| 21 | +# Check for --use-dist flag |
| 22 | +for arg in "$@"; do |
| 23 | + if [ "$arg" = "--use-dist" ]; then |
| 24 | + USE_DIST=true |
| 25 | + fi |
| 26 | +done |
| 27 | + |
| 28 | +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" |
| 29 | +PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" |
| 30 | +BUILD_DIR="$PROJECT_ROOT/dist/mcpb" |
| 31 | +MANIFEST_TEMPLATE="$SCRIPT_DIR/manifest.json" |
| 32 | + |
| 33 | +echo "Building MCPB bundles for kubefwd v${VERSION}" |
| 34 | +if [ "$USE_DIST" = true ]; then |
| 35 | + echo "Using pre-built binaries from dist/" |
| 36 | +fi |
| 37 | + |
| 38 | +# Clean and create build directory |
| 39 | +rm -rf "$BUILD_DIR" |
| 40 | +mkdir -p "$BUILD_DIR" |
| 41 | + |
| 42 | +# Platforms to build for (Claude Desktop supports macOS and Windows) |
| 43 | +# Format: GOOS:GOARCH:goreleaser_dir_suffix |
| 44 | +PLATFORMS=( |
| 45 | + "darwin:amd64:darwin_amd64_v1" |
| 46 | + "darwin:arm64:darwin_arm64" |
| 47 | + "windows:amd64:windows_amd64_v1" |
| 48 | +) |
| 49 | + |
| 50 | +for platform in "${PLATFORMS[@]}"; do |
| 51 | + IFS=':' read -r GOOS GOARCH DIST_SUFFIX <<< "$platform" |
| 52 | + |
| 53 | + PLATFORM_NAME="${GOOS}-${GOARCH}" |
| 54 | + BUNDLE_DIR="$BUILD_DIR/kubefwd-${PLATFORM_NAME}" |
| 55 | + |
| 56 | + echo "" |
| 57 | + echo "=== Building for ${PLATFORM_NAME} ===" |
| 58 | + |
| 59 | + # Create bundle directory |
| 60 | + mkdir -p "$BUNDLE_DIR" |
| 61 | + |
| 62 | + # Determine binary name |
| 63 | + BINARY_NAME="kubefwd" |
| 64 | + if [ "$GOOS" = "windows" ]; then |
| 65 | + BINARY_NAME="kubefwd.exe" |
| 66 | + fi |
| 67 | + |
| 68 | + if [ "$USE_DIST" = true ]; then |
| 69 | + # Use goreleaser's pre-built binary |
| 70 | + DIST_BINARY="$PROJECT_ROOT/dist/kubefwd_${DIST_SUFFIX}/${BINARY_NAME}" |
| 71 | + if [ ! -f "$DIST_BINARY" ]; then |
| 72 | + echo "ERROR: Binary not found at $DIST_BINARY" |
| 73 | + echo "Make sure goreleaser has run first, or omit --use-dist to build from source" |
| 74 | + exit 1 |
| 75 | + fi |
| 76 | + echo "Copying ${BINARY_NAME} from dist/..." |
| 77 | + cp "$DIST_BINARY" "$BUNDLE_DIR/$BINARY_NAME" |
| 78 | + else |
| 79 | + # Build from source |
| 80 | + echo "Compiling ${BINARY_NAME}..." |
| 81 | + CGO_ENABLED=0 GOOS="$GOOS" GOARCH="$GOARCH" go build \ |
| 82 | + -trimpath \ |
| 83 | + -tags=netgo \ |
| 84 | + -ldflags="-s -w -X main.Version=${VERSION}" \ |
| 85 | + -o "$BUNDLE_DIR/$BINARY_NAME" \ |
| 86 | + "$PROJECT_ROOT/cmd/kubefwd/kubefwd.go" |
| 87 | + fi |
| 88 | + |
| 89 | + # Copy and update manifest |
| 90 | + echo "Creating manifest.json..." |
| 91 | + sed "s/\"version\": \"0.0.0\"/\"version\": \"${VERSION}\"/" "$MANIFEST_TEMPLATE" > "$BUNDLE_DIR/manifest.json" |
| 92 | + |
| 93 | + # Create .mcpb bundle |
| 94 | + MCPB_FILE="$BUILD_DIR/kubefwd-${VERSION}-${PLATFORM_NAME}.mcpb" |
| 95 | + |
| 96 | + echo "Packaging ${MCPB_FILE}..." |
| 97 | + if command -v mcpb &> /dev/null; then |
| 98 | + # Use official mcpb CLI if available |
| 99 | + mcpb pack "$BUNDLE_DIR" "$MCPB_FILE" |
| 100 | + else |
| 101 | + # Fallback to zip (mcpb files are just zip archives) |
| 102 | + echo "Note: mcpb CLI not found, using zip fallback" |
| 103 | + (cd "$BUNDLE_DIR" && zip -r "$MCPB_FILE" .) |
| 104 | + fi |
| 105 | + |
| 106 | + echo "Created: $MCPB_FILE" |
| 107 | +done |
| 108 | + |
| 109 | +echo "" |
| 110 | +echo "=== Build complete ===" |
| 111 | +echo "MCPB bundles created in: $BUILD_DIR" |
| 112 | +ls -la "$BUILD_DIR"/*.mcpb 2>/dev/null || echo "No .mcpb files found" |
0 commit comments