feat: add dual release system (offline + online versions) #1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: Build Dual Release Packages | ||
| on: | ||
| release: | ||
| types: [published] | ||
| workflow_dispatch: | ||
| jobs: | ||
| # Job 1: Build Offline Version (with bundled model) | ||
| build-offline: | ||
| runs-on: windows-latest | ||
| timeout-minutes: 90 | ||
| steps: | ||
| - name: Checkout code | ||
| uses: actions/checkout@v4 | ||
| - name: Create directory structure | ||
| shell: bash | ||
| run: | | ||
| mkdir -p dist/OpenClaw-Portable-v6.0.0-windows-offline/{node,openclaw-pkg,llm/bin,llm/models,config,data,workspace,temp} | ||
| - name: Download model from GitHub Release | ||
| shell: bash | ||
| run: | | ||
| echo "==========================================" | ||
| echo " Downloading Qwen2.5-1.5B Model (1066MB)" | ||
| echo "==========================================" | ||
| cd dist/OpenClaw-Portable-v6.0.0-windows-offline/llm/models | ||
| # Download all parts | ||
| echo "📦 Part 1/3 (500MB)..." | ||
| curl -L --retry 3 --retry-delay 5 -o part1.bin \ | ||
| "https://github.com/SonicBotMan/openclaw-portable/releases/download/v6.0.0/qwen-model-part1.bin" | ||
| echo "📦 Part 2/3 (500MB)..." | ||
| curl -L --retry 3 --retry-delay 5 -o part2.bin \ | ||
| "https://github.com/SonicBotMan/openclaw-portable/releases/download/v6.0.0/qwen-model-part2.bin" | ||
| echo "📦 Part 3/3 (66MB)..." | ||
| curl -L --retry 3 --retry-delay 5 -o part3.bin \ | ||
| "https://github.com/SonicBotMan/openclaw-portable/releases/download/v6.0.0/qwen-model-part3.bin" | ||
| # Merge parts | ||
| echo "🔧 Merging parts..." | ||
| cat part1.bin part2.bin part3.bin > qwen2.5-1.5b-instruct-q4_k_m.gguf | ||
| # Clean up | ||
| rm -f part*.bin | ||
| # Verify | ||
| ls -lh qwen2.5-1.5b-instruct-q4_k_m.gguf | ||
| echo "✅ Model downloaded and merged" | ||
| - name: Download Node.js | ||
| shell: bash | ||
| run: | | ||
| echo "==========================================" | ||
| echo " Downloading Node.js 22.16.0" | ||
| echo "==========================================" | ||
| curl -fsSL \ | ||
| "https://nodejs.org/dist/v22.16.0/node-v22.16.0-win-x64.zip" \ | ||
| -o /tmp/node.zip | ||
| unzip -q /tmp/node.zip -d /tmp/ | ||
| mv /tmp/node-v22.16.0-win-x64/* dist/OpenClaw-Portable-v6.0.0-windows-offline/node/ | ||
| rm -rf /tmp/node.zip /tmp/node-v22.16.0-win-x64 | ||
| echo "✅ Node.js downloaded" | ||
| - name: Install OpenClaw | ||
| shell: bash | ||
| run: | | ||
| echo "==========================================" | ||
| echo " Installing OpenClaw" | ||
| echo "==========================================" | ||
| cd dist/OpenClaw-Portable-v6.0.0-windows-offline | ||
| ./node/node.exe ./node/node_modules/npm/bin/npm-cli.js \ | ||
| install -g openclaw@latest \ | ||
| --prefix openclaw-pkg \ | ||
| --registry https://registry.npmmirror.com | ||
| echo "✅ OpenClaw installed" | ||
| - name: Download llama.cpp | ||
| shell: bash | ||
| run: | | ||
| echo "==========================================" | ||
| echo " Downloading llama.cpp" | ||
| echo "==========================================" | ||
| curl -fsSL \ | ||
| "https://github.com/ggml-org/llama.cpp/releases/download/b4265/llama-b4265-bin-win-avx2-x64.zip" \ | ||
| -o /tmp/llama.zip | ||
| unzip -q /tmp/llama.zip -d /tmp/llama-tmp | ||
| # Find and move llama-server.exe | ||
| find /tmp/llama-tmp -name "llama-server.exe" -exec mv {} \ | ||
| dist/OpenClaw-Portable-v6.0.0-windows-offline/llm/bin/llama-server-win32-avx2.exe \; | ||
| rm -rf /tmp/llama.zip /tmp/llama-tmp | ||
| echo "✅ llama.cpp downloaded" | ||
| - name: Copy scripts and config | ||
| shell: bash | ||
| run: | | ||
| echo "==========================================" | ||
| echo " Copying scripts" | ||
| echo "==========================================" | ||
| cp start.bat stop.bat check.bat dist/OpenClaw-Portable-v6.0.0-windows-offline/ | ||
| cp -r config dist/OpenClaw-Portable-v6.0.0-windows-offline/ || true | ||
| # Create README for offline version | ||
| cat > dist/OpenClaw-Portable-v6.0.0-windows-offline/README-OFFLINE.txt << 'EOF' | ||
| OpenClaw Portable v6.0.0 - OFFLINE VERSION | ||
| ========================================== | ||
| This version includes a built-in CPU-only AI model (Qwen2.5-1.5B). | ||
| Features: | ||
| ✅ Complete offline operation after first download | ||
| ✅ No external API needed | ||
| ✅ Zero configuration required | ||
| The model is located in: llm/models/qwen2.5-1.5b-instruct-q4_k_m.gguf | ||
| To start: Double-click start.bat | ||
| For more information: https://github.com/SonicBotMan/openclaw-portable | ||
| EOF | ||
| echo "✅ Scripts copied" | ||
| - name: Create archive | ||
| shell: bash | ||
| run: | | ||
| echo "==========================================" | ||
| echo " Creating offline archive" | ||
| echo "==========================================" | ||
| cd dist | ||
| tar -czf OpenClaw-Portable-v6.0.0-windows-offline.tar.gz \ | ||
| OpenClaw-Portable-v6.0.0-windows-offline | ||
| SIZE=$(du -h OpenClaw-Portable-v6.0.0-windows-offline.tar.gz | cut -f1) | ||
| echo "✅ Offline archive created: $SIZE" | ||
| ls -lh OpenClaw-Portable-v6.0.0-windows-offline.tar.gz | ||
| - name: Upload to Artifacts | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: openclaw-portable-v6.0.0-windows-offline | ||
| path: dist/OpenClaw-Portable-v6.0.0-windows-offline.tar.gz | ||
| retention-days: 90 | ||
| compression-level: 0 | ||
| - name: Summary | ||
| shell: bash | ||
| run: | | ||
| echo "==========================================" | ||
| echo " ✅ Offline Build Complete!" | ||
| echo "==========================================" | ||
| echo " Package: OpenClaw-Portable-v6.0.0-windows-offline.tar.gz" | ||
| du -h dist/OpenClaw-Portable-v6.0.0-windows-offline.tar.gz | ||
| echo " Size: ~1.2 GB (includes Qwen2.5-1.5B model)" | ||
| echo "==========================================" | ||
| # Job 2: Build Online Version (without bundled model) | ||
| build-online: | ||
| runs-on: windows-latest | ||
| timeout-minutes: 30 | ||
| steps: | ||
| - name: Checkout code | ||
| uses: actions/checkout@v4 | ||
| - name: Create directory structure | ||
| shell: bash | ||
| run: | | ||
| mkdir -p dist/OpenClaw-Portable-v6.0.0-windows-online/{node,openclaw-pkg,llm/bin,llm/models,config,data,workspace,temp} | ||
| - name: Download Node.js | ||
| shell: bash | ||
| run: | | ||
| echo "==========================================" | ||
| echo " Downloading Node.js 22.16.0" | ||
| echo "==========================================" | ||
| curl -fsSL \ | ||
| "https://nodejs.org/dist/v22.16.0/node-v22.16.0-win-x64.zip" \ | ||
| -o /tmp/node.zip | ||
| unzip -q /tmp/node.zip -d /tmp/ | ||
| mv /tmp/node-v22.16.0-win-x64/* dist/OpenClaw-Portable-v6.0.0-windows-online/node/ | ||
| rm -rf /tmp/node.zip /tmp/node-v22.16.0-win-x64 | ||
| echo "✅ Node.js downloaded" | ||
| - name: Install OpenClaw | ||
| shell: bash | ||
| run: | | ||
| echo "==========================================" | ||
| echo " Installing OpenClaw" | ||
| echo "==========================================" | ||
| cd dist/OpenClaw-Portable-v6.0.0-windows-online | ||
| ./node/node.exe ./node/node_modules/npm/bin/npm-cli.js \ | ||
| install -g openclaw@latest \ | ||
| --prefix openclaw-pkg \ | ||
| --registry https://registry.npmmirror.com | ||
| echo "✅ OpenClaw installed" | ||
| - name: Download llama.cpp | ||
| shell: bash | ||
| run: | | ||
| echo "==========================================" | ||
| echo " Downloading llama.cpp" | ||
| echo "==========================================" | ||
| curl -fsSL \ | ||
| "https://github.com/ggml-org/llama.cpp/releases/download/b4265/llama-b4265-bin-win-avx2-x64.zip" \ | ||
| -o /tmp/llama.zip | ||
| unzip -q /tmp/llama.zip -d /tmp/llama-tmp | ||
| # Find and move llama-server.exe | ||
| find /tmp/llama-tmp -name "llama-server.exe" -exec mv {} \ | ||
| dist/OpenClaw-Portable-v6.0.0-windows-online/llm/bin/llama-server-win32-avx2.exe \; | ||
| rm -rf /tmp/llama.zip /tmp/llama-tmp | ||
| echo "✅ llama.cpp downloaded" | ||
| - name: Copy scripts and config | ||
| shell: bash | ||
| run: | | ||
| echo "==========================================" | ||
| echo " Copying scripts" | ||
| echo "==========================================" | ||
| cp start.bat stop.bat check.bat dist/OpenClaw-Portable-v6.0.0-windows-online/ | ||
| cp -r config dist/OpenClaw-Portable-v6.0.0-windows-online/ || true | ||
| # Create README for online version | ||
| cat > dist/OpenClaw-Portable-v6.0.0-windows-online/README-ONLINE.txt << 'EOF' | ||
| OpenClaw Portable v6.0.0 - ONLINE VERSION | ||
| ========================================= | ||
| This version does NOT include a built-in AI model. | ||
| You can: | ||
| 1. Use cloud AI APIs (DeepSeek, OpenAI, etc.) - requires API key | ||
| 2. Add your own local model to llm/models/ directory | ||
| To add a local model: | ||
| 1. Download a GGUF model (e.g., Qwen2.5-1.5B-Instruct) | ||
| 2. Place it in: llm/models/ | ||
| 3. Restart OpenClaw | ||
| Recommended models: | ||
| - Qwen2.5-1.5B-Instruct-Q4_K_M.gguf (~900MB) | ||
| - Qwen2.5-3B-Instruct-Q4_K_M.gguf (~1.8GB) | ||
| - Llama-3.2-3B-Instruct-Q4_K_M.gguf (~1.8GB) | ||
| Download models from: https://huggingface.co/Qwen | ||
| To start: Double-click start.bat | ||
| For more information: https://github.com/SonicBotMan/openclaw-portable | ||
| EOF | ||
| echo "✅ Scripts copied" | ||
| - name: Create archive | ||
| shell: bash | ||
| run: | | ||
| echo "==========================================" | ||
| echo " Creating online archive" | ||
| echo "==========================================" | ||
| cd dist | ||
| tar -czf OpenClaw-Portable-v6.0.0-windows-online.tar.gz \ | ||
| OpenClaw-Portable-v6.0.0-windows-online | ||
| SIZE=$(du -h OpenClaw-Portable-v6.0.0-windows-online.tar.gz | cut -f1) | ||
| echo "✅ Online archive created: $SIZE" | ||
| ls -lh OpenClaw-Portable-v6.0.0-windows-online.tar.gz | ||
| - name: Upload to Artifacts | ||
| uses: actions/upload-artifact@v4 | ||
| with: | ||
| name: openclaw-portable-v6.0.0-windows-online | ||
| path: dist/OpenClaw-Portable-v6.0.0-windows-online.tar.gz | ||
| retention-days: 90 | ||
| compression-level: 0 | ||
| - name: Summary | ||
| shell: bash | ||
| run: | | ||
| echo "==========================================" | ||
| echo " ✅ Online Build Complete!" | ||
| echo "==========================================" | ||
| echo " Package: OpenClaw-Portable-v6.0.0-windows-online.tar.gz" | ||
| du -h dist/OpenClaw-Portable-v6.0.0-windows-online.tar.gz | ||
| echo " Size: ~300 MB (no built-in model)" | ||
| echo "==========================================" | ||
| # Job 3: Upload both packages to Release | ||
| upload-to-release: | ||
| needs: [build-offline, build-online] | ||
| runs-on: ubuntu-latest | ||
| if: github.event_name == 'release' | ||
| steps: | ||
| - name: Download offline artifact | ||
| uses: actions/download-artifact@v4 | ||
| with: | ||
| name: openclaw-portable-v6.0.0-windows-offline | ||
| path: ./packages | ||
| - name: Download online artifact | ||
| uses: actions/download-artifact@v4 | ||
| with: | ||
| name: openclaw-portable-v6.0.0-windows-online | ||
| path: ./packages | ||
| - name: List packages | ||
| run: | | ||
| echo "📦 Packages to upload:" | ||
| ls -lh packages/ | ||
| - name: Upload to Release | ||
| uses: softprops/action-gh-release@v1 | ||
| with: | ||
| files: packages/* | ||
| env: | ||
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | ||
| - name: Summary | ||
| run: | | ||
| echo "==========================================" | ||
| echo " ✅ Dual Release Complete!" | ||
| echo "==========================================" | ||
| echo "" | ||
| echo " Packages uploaded to Release:" | ||
| echo " 1. OpenClaw-Portable-v6.0.0-windows-offline.tar.gz (~1.2 GB)" | ||
| echo " - With built-in Qwen2.5-1.5B model" | ||
| echo " - Complete offline operation" | ||
| echo "" | ||
| echo " 2. OpenClaw-Portable-v6.0.0-windows-online.tar.gz (~300 MB)" | ||
| echo " - No built-in model" | ||
| echo " - Smaller download size" | ||
| echo " - Use cloud APIs or add your own model" | ||
| echo "" | ||
| echo "==========================================" | ||