jmanus/script/create_dmg.sh
cuijiawang 0982edf55f init
2025-08-01 10:24:29 +08:00

273 lines
8.0 KiB
Bash

#!/bin/bash
/*
* Copyright 2024-2025 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
# DMG creation script for JManus on macOS
# This script creates a distributable DMG package
set -e
# Configuration
APP_NAME="JManus"
APP_BUNDLE_NAME="JManus.app"
DMG_NAME="JManus-Installer"
TEMP_DMG_NAME="temp-${DMG_NAME}"
VOLUME_NAME="JManus Installer"
APP_SIZE_MB=100 # Estimated size, adjust as needed
# Parse arguments
PLATFORM=""
EXECUTABLE_NAME=""
VERSION="3.0.0-SNAPSHOT"
while [[ $# -gt 0 ]]; do
case $1 in
--platform)
PLATFORM="$2"
shift 2
;;
--executable)
EXECUTABLE_NAME="$2"
shift 2
;;
--version)
VERSION="$2"
shift 2
;;
*)
echo "Unknown option: $1"
exit 1
;;
esac
done
if [ -z "$PLATFORM" ] || [ -z "$EXECUTABLE_NAME" ]; then
echo "Usage: $0 --platform <platform> --executable <executable_name> [--version <version>]"
echo "Example: $0 --platform macos-arm --executable spring-ai-alibaba-jmanus --version 3.0.0"
exit 1
fi
echo "Creating DMG for platform: $PLATFORM"
echo "Executable: $EXECUTABLE_NAME"
echo "Version: $VERSION"
# Create temporary directory structure
TEMP_DIR=$(mktemp -d)
APP_BUNDLE_DIR="$TEMP_DIR/$APP_BUNDLE_NAME"
APP_CONTENTS_DIR="$APP_BUNDLE_DIR/Contents"
APP_MACOS_DIR="$APP_CONTENTS_DIR/MacOS"
APP_RESOURCES_DIR="$APP_CONTENTS_DIR/Resources"
mkdir -p "$APP_MACOS_DIR"
mkdir -p "$APP_RESOURCES_DIR/bin"
mkdir -p "$APP_RESOURCES_DIR/docs"
# Copy the executable
if [ ! -f "dist/$PLATFORM/$EXECUTABLE_NAME" ]; then
echo "Error: Executable not found at dist/$PLATFORM/$EXECUTABLE_NAME"
exit 1
fi
cp "dist/$PLATFORM/$EXECUTABLE_NAME" "$APP_RESOURCES_DIR/bin/"
chmod +x "$APP_RESOURCES_DIR/bin/$EXECUTABLE_NAME"
# Copy startup script
cp "script/start_jmanus.sh" "$APP_RESOURCES_DIR/"
chmod +x "$APP_RESOURCES_DIR/start_jmanus.sh"
# Copy documentation
cp "dist/$PLATFORM/README"*.md "$APP_RESOURCES_DIR/docs/" 2>/dev/null || true
cp "dist/$PLATFORM/BUILD_INFO.txt" "$APP_RESOURCES_DIR/docs/" 2>/dev/null || true
cp "INSTALL-macOS.md" "$APP_RESOURCES_DIR/docs/" 2>/dev/null || true
# Create Info.plist for the app bundle
cat > "$APP_CONTENTS_DIR/Info.plist" << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>CFBundleExecutable</key>
<string>JManus</string>
<key>CFBundleIdentifier</key>
<string>com.alibaba.spring-ai.jmanus</string>
<key>CFBundleName</key>
<string>JManus</string>
<key>CFBundleVersion</key>
<string>$VERSION</string>
<key>CFBundleShortVersionString</key>
<string>$VERSION</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>LSMinimumSystemVersion</key>
<string>10.15</string>
<key>NSHighResolutionCapable</key>
<true/>
<key>LSUIElement</key>
<false/>
</dict>
</plist>
EOF
# Create the main executable launcher
cat > "$APP_MACOS_DIR/JManus" << 'EOF'
#!/bin/bash
# Debug log function
debug_log() {
echo "$(date): $1" >> /tmp/jmanus_debug.log
}
debug_log "JManus launcher started"
# Get the directory of this script (MacOS directory)
MACOS_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
RESOURCES_DIR="$(dirname "$MACOS_DIR")/Resources"
debug_log "MACOS_DIR: $MACOS_DIR"
debug_log "RESOURCES_DIR: $RESOURCES_DIR"
# Check if resources directory exists
if [ ! -d "$RESOURCES_DIR" ]; then
debug_log "Error: Resources directory not found at $RESOURCES_DIR"
osascript -e 'display alert "JManus Error" message "Application resources not found. Please reinstall JManus." as critical'
exit 1
fi
# Check if startup script exists
if [ ! -f "$RESOURCES_DIR/start_jmanus.sh" ]; then
debug_log "Error: start_jmanus.sh not found at $RESOURCES_DIR/start_jmanus.sh"
osascript -e 'display alert "JManus Error" message "Startup script not found. Please reinstall JManus." as critical'
exit 1
fi
debug_log "Changing to Resources directory and executing startup script"
# Change to Resources directory and run the startup script
cd "$RESOURCES_DIR"
debug_log "Current directory: $(pwd)"
# Make sure the startup script is executable
chmod +x "./start_jmanus.sh"
# Execute the startup script
debug_log "Executing start_jmanus.sh"
exec ./start_jmanus.sh
EOF
chmod +x "$APP_MACOS_DIR/JManus"
# Create application info file in Resources
cat > "$APP_RESOURCES_DIR/Application Info.txt" << EOF
JManus Application
Version: $VERSION
Platform: $PLATFORM
Build Date: $(date)
To start the application:
- Double-click the JManus.app icon
Requirements:
- macOS 10.15 or later
- DashScope API Key (you will be prompted on first run)
The application will be available at http://localhost:18080
For more information, see the documentation in the 'docs' folder.
EOF
# Create README for the DMG
cat > "$TEMP_DIR/README.txt" << EOF
JManus Application Installer
To install JManus:
1. Drag the "JManus.app" to your Applications folder or any desired location
2. Double-click JManus.app to start the application
You will be prompted to enter your DashScope API Key on first run.
The application will be available at http://localhost:18080
For support and documentation, visit:
https://github.com/alibaba/spring-ai-alibaba
EOF
# Calculate total size
TOTAL_SIZE_KB=$(du -sk "$TEMP_DIR" | cut -f1)
TOTAL_SIZE_MB=$((TOTAL_SIZE_KB / 1024 + 10)) # Add 10MB buffer
echo "Creating DMG with size: ${TOTAL_SIZE_MB}MB"
# Create DMG
DMG_PATH="dist/$PLATFORM/${DMG_NAME}-${VERSION}-${PLATFORM}.dmg"
TEMP_DMG_PATH="dist/$PLATFORM/${TEMP_DMG_NAME}.dmg"
# Remove existing DMG if it exists
rm -f "$DMG_PATH" "$TEMP_DMG_PATH"
# Create temporary DMG
hdiutil create -srcfolder "$TEMP_DIR" -volname "$VOLUME_NAME" -fs HFS+ -fsargs "-c c=64,a=16,e=16" -format UDRW -size ${TOTAL_SIZE_MB}m "$TEMP_DMG_PATH"
# Mount the temporary DMG
MOUNT_POINT="/Volumes/$VOLUME_NAME"
hdiutil attach "$TEMP_DMG_PATH" -readwrite -mount required
# Wait for mount
sleep 2
# Create Applications alias for easier installation
ln -sf "/Applications" "$MOUNT_POINT/Applications"
# Optional: Set DMG window properties using AppleScript (simplified)
osascript << EOF || true
tell application "Finder"
tell disk "$VOLUME_NAME"
open
set current view of container window to icon view
set toolbar visible of container window to false
set statusbar visible of container window to false
set the bounds of container window to {400, 100, 800, 400}
set viewOptions to the icon view options of container window
set arrangement of viewOptions to not arranged
set icon size of viewOptions to 72
make new alias file at container window to POSIX file "/Applications" with properties {name:"Applications"}
set position of item "JManus.app" of container window to {150, 200}
set position of item "Applications" of container window to {350, 200}
set position of item "README.txt" of container window to {250, 300}
close
open
update without registering applications
delay 2
end tell
end tell
EOF
# Unmount the DMG
hdiutil detach "$MOUNT_POINT"
# Convert to compressed read-only DMG
hdiutil convert "$TEMP_DMG_PATH" -format UDZO -imagekey zlib-level=9 -o "$DMG_PATH"
# Clean up
rm -f "$TEMP_DMG_PATH"
rm -rf "$TEMP_DIR"
echo "DMG created successfully: $DMG_PATH"
# Show file size
if [ -f "$DMG_PATH" ]; then
DMG_SIZE=$(du -h "$DMG_PATH" | cut -f1)
echo "DMG size: $DMG_SIZE"
fi