diff --git a/.github/workflows/build-desktop.yml b/.github/workflows/build-desktop.yml index 4bec174..d065446 100644 --- a/.github/workflows/build-desktop.yml +++ b/.github/workflows/build-desktop.yml @@ -260,3 +260,105 @@ jobs: echo "- 修復問題後重新觸發此工作流程" >> $GITHUB_STEP_SUMMARY echo "- 確保所有平台都能成功構建後再進行發佈" >> $GITHUB_STEP_SUMMARY fi + + # 新增:將構建的二進制文件提交到 Git + commit-binaries: + name: 提交桌面二進制文件到 Git + runs-on: ubuntu-latest + needs: [build-desktop, build-summary] + if: needs.build-desktop.result == 'success' + permissions: + contents: write + + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + fetch-depth: 0 + + - name: Configure Git + run: | + git config --local user.email "action@github.com" + git config --local user.name "GitHub Action" + + - name: Download all desktop artifacts + uses: actions/download-artifact@v4 + with: + path: desktop-artifacts + + - name: Prepare desktop binaries for commit + run: | + echo "📦 準備桌面二進制文件以提交到 Git..." + + # 創建桌面應用目錄 + mkdir -p src/mcp_feedback_enhanced/desktop_release + + # 確保 __init__.py 存在 + if [ ! -f "src/mcp_feedback_enhanced/desktop_release/__init__.py" ]; then + echo '"""桌面應用程式二進制檔案"""' > src/mcp_feedback_enhanced/desktop_release/__init__.py + fi + + # 定義平台映射 + declare -A PLATFORM_MAP=( + ["desktop-windows"]="mcp-feedback-enhanced-desktop.exe" + ["desktop-macos-intel"]="mcp-feedback-enhanced-desktop-macos-intel" + ["desktop-macos-arm64"]="mcp-feedback-enhanced-desktop-macos-arm64" + ["desktop-linux"]="mcp-feedback-enhanced-desktop-linux" + ) + + # 複製並重命名二進制文件 + COPIED_COUNT=0 + + for platform_dir in desktop-windows desktop-macos-intel desktop-macos-arm64 desktop-linux; do + echo "🔍 處理平台: $platform_dir" + + # 查找該平台的二進制文件 + BINARY_FILE="" + if [ -d "desktop-artifacts/$platform_dir" ]; then + BINARY_FILE=$(find "desktop-artifacts/$platform_dir" -name "mcp-feedback-enhanced-desktop*" -type f | head -1) + fi + + if [ -n "$BINARY_FILE" ] && [ -f "$BINARY_FILE" ]; then + TARGET_NAME="${PLATFORM_MAP[$platform_dir]}" + cp "$BINARY_FILE" "src/mcp_feedback_enhanced/desktop_release/$TARGET_NAME" + + # 設置執行權限(非 Windows) + if [[ "$TARGET_NAME" != *.exe ]]; then + chmod +x "src/mcp_feedback_enhanced/desktop_release/$TARGET_NAME" + fi + + echo "✅ $platform_dir: $BINARY_FILE -> $TARGET_NAME" + COPIED_COUNT=$((COPIED_COUNT + 1)) + else + echo "⚠️ $platform_dir: 未找到二進制文件" + fi + done + + echo "" + echo "📊 複製結果統計:" + echo " 成功複製: $COPIED_COUNT/4 個平台" + + # 顯示最終文件列表 + echo "" + echo "📦 最終的桌面應用二進制文件:" + ls -la src/mcp_feedback_enhanced/desktop_release/ + + - name: Commit desktop binaries + run: | + echo "📝 提交桌面二進制文件到 Git..." + + # 檢查是否有變更 + if [ -n "$(git status --porcelain src/mcp_feedback_enhanced/desktop_release/)" ]; then + # 添加桌面二進制文件 + git add src/mcp_feedback_enhanced/desktop_release/ + + # 提交變更 + git commit -m "🖥️ 更新桌面應用二進制文件 - 自動構建多平台版本 (Run ${{ github.run_id }})" + + # 推送到遠程倉庫 + git push origin main + + echo "✅ 桌面二進制文件已成功提交並推送到 Git" + else + echo "ℹ️ 沒有檢測到桌面二進制文件的變更,跳過提交" + fi diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 8a739b4..f650c9d 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -317,118 +317,39 @@ jobs: fi fi - - name: Download desktop binaries - if: ${{ github.event.inputs.include_desktop == 'true' }} - uses: dawidd6/action-download-artifact@v6 - with: - github_token: ${{ secrets.GITHUB_TOKEN }} - workflow: build-desktop.yml - run_id: ${{ steps.check_desktop.outputs.run_id }} - path: desktop-artifacts - if_no_artifact_found: error - - - name: Prepare multi-platform desktop binaries + - name: Check desktop applications in Git if: ${{ github.event.inputs.include_desktop == 'true' }} run: | - echo "📦 準備多平台桌面應用二進制文件..." + echo "🔍 檢查 Git 中的桌面應用程式二進制檔案..." - # 檢查下載的產物 - echo "🔍 檢查下載的桌面應用產物..." - if [ ! -d "desktop-artifacts" ]; then - echo "❌ 桌面產物目錄不存在" - exit 1 - fi + if [ -d "src/mcp_feedback_enhanced/desktop_release" ]; then + echo "📁 桌面應用目錄內容:" + ls -la src/mcp_feedback_enhanced/desktop_release/ - echo "📁 產物目錄內容:" - find desktop-artifacts -type f -name "*" | head -20 + # 檢查是否有二進制文件 + BINARY_COUNT=$(find src/mcp_feedback_enhanced/desktop_release -name "mcp-feedback-enhanced-desktop*" -type f | wc -l) + echo "📊 找到 $BINARY_COUNT 個桌面二進制文件" - # 創建桌面應用目錄 - mkdir -p src/mcp_feedback_enhanced/desktop_release - - # 定義平台映射 - declare -A PLATFORM_MAP=( - ["desktop-windows"]="mcp-feedback-enhanced-desktop.exe" - ["desktop-macos-intel"]="mcp-feedback-enhanced-desktop-macos-intel" - ["desktop-macos-arm64"]="mcp-feedback-enhanced-desktop-macos-arm64" - ["desktop-linux"]="mcp-feedback-enhanced-desktop-linux" - ) - - # 複製並重命名二進制文件 - COPIED_COUNT=0 - TOTAL_PLATFORMS=4 - - for platform_dir in desktop-windows desktop-macos-intel desktop-macos-arm64 desktop-linux; do - echo "🔍 處理平台: $platform_dir" - - # 查找該平台的二進制文件 - BINARY_FILE="" - if [ -d "desktop-artifacts/$platform_dir" ]; then - # 查找二進制文件(可能是 .exe 或無擴展名) - BINARY_FILE=$(find "desktop-artifacts/$platform_dir" -name "mcp-feedback-enhanced-desktop*" -type f | head -1) - fi - - if [ -n "$BINARY_FILE" ] && [ -f "$BINARY_FILE" ]; then - TARGET_NAME="${PLATFORM_MAP[$platform_dir]}" - cp "$BINARY_FILE" "src/mcp_feedback_enhanced/desktop_release/$TARGET_NAME" - - # 設置執行權限(非 Windows) - if [[ "$TARGET_NAME" != *.exe ]]; then - chmod +x "src/mcp_feedback_enhanced/desktop_release/$TARGET_NAME" - fi - - echo "✅ $platform_dir: $BINARY_FILE -> $TARGET_NAME" - COPIED_COUNT=$((COPIED_COUNT + 1)) + if [ $BINARY_COUNT -eq 0 ]; then + echo "❌ 沒有找到桌面二進制文件" + echo "💡 請先運行 'Build Desktop Applications' 工作流程" + echo " 該工作流程會自動構建並提交桌面二進制文件到 Git" + exit 1 + elif [ $BINARY_COUNT -lt 4 ]; then + echo "⚠️ 桌面二進制文件不完整 ($BINARY_COUNT/4)" + echo "💡 請重新運行 'Build Desktop Applications' 工作流程" + echo " 確保所有 4 個平台都構建成功" + exit 1 else - echo "⚠️ $platform_dir: 未找到二進制文件" + echo "✅ 桌面二進制文件完整 ($BINARY_COUNT/4)" fi - done - - # 創建 __init__.py - echo '"""桌面應用程式二進制檔案"""' > src/mcp_feedback_enhanced/desktop_release/__init__.py - - # 驗證結果 - echo "" - echo "📊 複製結果統計:" - echo " 成功複製: $COPIED_COUNT/$TOTAL_PLATFORMS 個平台" - - if [ $COPIED_COUNT -eq 0 ]; then - echo "❌ 沒有成功複製任何平台的二進制文件" - echo "💡 建議:" - echo " 1. 檢查 'Build Desktop Applications' 工作流程是否成功" - echo " 2. 確認所有平台都構建成功" - echo " 3. 或者設置 include_desktop 為 false" - exit 1 - elif [ $COPIED_COUNT -lt $TOTAL_PLATFORMS ]; then - echo "❌ 部分平台缺失,無法保證多平台支援" - echo "💡 缺失的平台:" - - # 檢查具體缺失哪些平台 - for platform_dir in desktop-windows desktop-macos-intel desktop-macos-arm64 desktop-linux; do - if [ ! -d "desktop-artifacts/$platform_dir" ] || [ -z "$(find "desktop-artifacts/$platform_dir" -name "mcp-feedback-enhanced-desktop*" -type f)" ]; then - case $platform_dir in - "desktop-windows") echo " - ❌ Windows x64" ;; - "desktop-macos-intel") echo " - ❌ macOS Intel" ;; - "desktop-macos-arm64") echo " - ❌ macOS Apple Silicon" ;; - "desktop-linux") echo " - ❌ Linux x64" ;; - esac - fi - done - - echo "" - echo "🔧 解決方案:" - echo " 1. 重新運行 'Build Desktop Applications' 工作流程" - echo " 2. 確保所有平台都構建成功後再發佈" - echo " 3. 或者設置 include_desktop 為 false(僅 Web 版本)" - exit 1 else - echo "✅ 所有平台都已成功複製" + echo "❌ 桌面應用目錄不存在" + echo "💡 請先運行 'Build Desktop Applications' 工作流程" + echo " 該工作流程會自動構建並提交桌面二進制文件到 Git" + exit 1 fi - # 顯示最終文件列表 - echo "" - echo "📦 最終的桌面應用二進制文件:" - ls -la src/mcp_feedback_enhanced/desktop_release/ - - name: Validate desktop binaries if: ${{ github.event.inputs.include_desktop == 'true' }} run: | @@ -532,23 +453,7 @@ jobs: echo "📁 桌面應用目錄內容:" ls -la src/mcp_feedback_enhanced/desktop_release/ - - name: Add desktop binaries to git temporarily (for packaging) - if: ${{ github.event.inputs.include_desktop == 'true' }} - run: | - echo "📦 臨時添加桌面二進制文件到 Git 以便打包..." - # 臨時添加桌面二進制文件到 Git - if [ -d "src/mcp_feedback_enhanced/desktop_release" ]; then - # 強制添加二進制文件(忽略 .gitignore) - git add -f src/mcp_feedback_enhanced/desktop_release/*.exe || true - git add -f src/mcp_feedback_enhanced/desktop_release/mcp-feedback-enhanced-desktop-* || true - - echo "✅ 桌面二進制文件已臨時添加到 Git" - echo "📁 添加的文件:" - git ls-files src/mcp_feedback_enhanced/desktop_release/ | grep -E '\.(exe|mcp-feedback-enhanced-desktop-)' || echo " 沒有找到二進制文件" - else - echo "⚠️ 桌面應用目錄不存在" - fi - name: Build package run: uv build @@ -562,19 +467,7 @@ jobs: user: __token__ password: ${{ secrets.PYPI_API_TOKEN }} - - name: Clean up temporary desktop binaries from git - if: ${{ github.event.inputs.include_desktop == 'true' }} - run: | - echo "🧹 清理臨時添加的桌面二進制文件..." - # 重置 Git 狀態,移除臨時添加的二進制文件 - git reset HEAD src/mcp_feedback_enhanced/desktop_release/*.exe 2>/dev/null || true - git reset HEAD src/mcp_feedback_enhanced/desktop_release/mcp-feedback-enhanced-desktop-* 2>/dev/null || true - - # 清理工作目錄中的未追蹤文件 - git checkout -- src/mcp_feedback_enhanced/desktop_release/ 2>/dev/null || true - - echo "✅ 桌面二進制文件已從 Git 中移除" - name: Push changes and tags run: | diff --git a/.gitignore b/.gitignore index 439edfe..88666e7 100644 --- a/.gitignore +++ b/.gitignore @@ -70,11 +70,6 @@ src-tauri/Cargo.lock src-tauri/WixTools/ src-tauri/gen/ -# Desktop application binaries (these should be built and copied by build script) -# Note: desktop_app module should be tracked, only exclude large binaries -src/mcp_feedback_enhanced/desktop_release/*.exe -src/mcp_feedback_enhanced/desktop_release/mcp-feedback-enhanced-desktop-* -src/mcp_feedback_enhanced/desktop/mcp-feedback-enhanced-desktop diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index a488f0a..7684e57 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -21,9 +21,10 @@ repos: - id: check-toml # 檢查 JSON 語法 - id: check-json - # 檢查是否有大檔案 + # 檢查是否有大檔案(排除桌面應用二進制文件) - id: check-added-large-files args: [--maxkb=1000] + exclude: ^src/mcp_feedback_enhanced/desktop_release/.*\.(exe|mcp-feedback-enhanced-desktop-.*)$ # 檢查檔案名稱 - id: check-case-conflict # 檢查可執行檔案有 shebang diff --git a/docs/DESKTOP_BUILD_IMPROVEMENTS.md b/docs/DESKTOP_BUILD_IMPROVEMENTS.md new file mode 100644 index 0000000..b7eff2a --- /dev/null +++ b/docs/DESKTOP_BUILD_IMPROVEMENTS.md @@ -0,0 +1,224 @@ +# 桌面應用構建和發佈流程改進 + +## 🎯 改進目標 + +確保 GitHub Actions 能夠健全地構建所有平台的桌面應用執行檔,並在發佈流程中正確使用這些構建產物。 + +## 🔧 主要改進 + +### 1. 增強桌面構建工作流程 (`.github/workflows/build-desktop.yml`) + +#### 新增功能: +- **平台特定依賴安裝**:為 Linux 平台自動安裝必要的系統依賴 +- **詳細構建驗證**:檢查二進制文件存在性、大小和類型 +- **錯誤處理改進**:如果找不到構建產物則立即失敗 +- **構建摘要增強**:提供詳細的構建狀態報告和下一步指導 + +#### 技術改進: +```yaml +# Linux 依賴安裝 +- name: Install platform-specific dependencies (Linux) + if: matrix.os == 'ubuntu-latest' + run: | + sudo apt-get update + sudo apt-get install -y \ + libwebkit2gtk-4.1-dev \ + libappindicator3-dev \ + librsvg2-dev \ + patchelf \ + libgtk-3-dev \ + libayatana-appindicator3-dev + +# 增強的構建驗證 +- name: Verify build output + run: | + BINARY_PATH="src-tauri/target/${{ matrix.target }}/release/${{ matrix.binary }}" + if [ -f "$BINARY_PATH" ]; then + echo "✅ 找到二進制文件: $BINARY_PATH" + FILE_SIZE=$(stat -f%z "$BINARY_PATH" 2>/dev/null || stat -c%s "$BINARY_PATH" 2>/dev/null) + echo "📏 文件大小: $FILE_SIZE bytes" + else + echo "❌ 二進制文件不存在: $BINARY_PATH" + exit 1 + fi +``` + +### 2. 優化發佈工作流程 (`.github/workflows/publish.yml`) + +#### 新增功能: +- **智能桌面構建檢測**:自動查找最新成功的桌面構建 +- **健壯的產物下載**:改進錯誤處理和產物驗證 +- **多平台二進制處理**:統一的平台映射和文件重命名 +- **詳細驗證步驟**:確保所有平台的二進制文件都有效 + +#### 技術改進: +```yaml +# 智能構建檢測 +- name: Check desktop build availability + run: | + if [ -n "${{ github.event.inputs.desktop_build_run_id }}" ]; then + echo "🎯 使用指定的構建 Run ID" + else + LATEST_RUN=$(curl -s -H "Authorization: Bearer ${{ secrets.GITHUB_TOKEN }}" \ + "https://api.github.com/repos/${{ github.repository }}/actions/workflows/build-desktop.yml/runs?status=success&per_page=1" \ + | jq -r '.workflow_runs[0].id // empty') + echo "run_id=$LATEST_RUN" >> $GITHUB_OUTPUT + fi + +# 統一平台映射 +declare -A PLATFORM_MAP=( + ["desktop-windows"]="mcp-feedback-enhanced-desktop.exe" + ["desktop-macos-intel"]="mcp-feedback-enhanced-desktop-macos-intel" + ["desktop-macos-arm64"]="mcp-feedback-enhanced-desktop-macos-arm64" + ["desktop-linux"]="mcp-feedback-enhanced-desktop-linux" +) +``` + +### 3. 新增一鍵構建發佈工作流程 (`.github/workflows/build-and-release.yml`) + +#### 功能特點: +- **自動化整個流程**:構建 → 驗證 → 發佈 +- **靈活的平台選擇**:支援選擇特定平台或全平台構建 +- **可選發佈模式**:可以只構建不發佈 +- **統一狀態報告**:提供完整的流程摘要 + +#### 使用方式: +1. 前往 [Build Desktop & Release](../../actions/workflows/build-and-release.yml) +2. 點擊 "Run workflow" +3. 選擇版本類型或輸入自定義版本 +4. 選擇要構建的平台(默認:all) +5. 可選:勾選 "只構建桌面應用,不進行發佈" + +### 4. 工作流程驗證腳本 (`scripts/validate_workflows.py`) + +#### 功能: +- **YAML 語法驗證**:確保所有工作流程文件語法正確 +- **結構完整性檢查**:驗證必需字段和配置 +- **特定工作流程驗證**:針對桌面構建和發佈流程的專項檢查 + +#### 使用方式: +```bash +python scripts/validate_workflows.py +``` + +## 🚀 使用指南 + +### 方案 1:使用一鍵構建發佈(推薦) +1. 觸發 "Build Desktop & Release" 工作流程 +2. 系統自動構建所有平台 +3. 構建成功後自動發佈 + +### 方案 2:分步執行 +1. 先觸發 "Build Desktop Applications" 工作流程 +2. 等待所有平台構建完成 +3. 記錄 Run ID +4. 觸發 "Auto Release to PyPI" 工作流程 +5. 設置 `include_desktop: true` 和對應的 Run ID + +## 🔍 驗證清單 + +### 構建階段 +- [ ] Windows x64 構建成功 +- [ ] macOS Intel 構建成功 +- [ ] macOS ARM64 構建成功 +- [ ] Linux x64 構建成功 +- [ ] 所有二進制文件大小 > 1MB +- [ ] Artifacts 正確上傳 + +### 發佈階段 +- [ ] 桌面構建產物正確下載 +- [ ] 所有平台二進制文件正確重命名 +- [ ] 執行權限正確設置 +- [ ] PyPI 包包含桌面應用 +- [ ] GitHub Release 創建成功 + +## 🛠️ 故障排除 + +### 常見問題 + +1. **Windows 平台 PowerShell 語法錯誤** + - **問題**:`Missing '(' after 'if' in if statement` + - **原因**:在 Windows 上使用了 bash 語法 + - **解決方案**:為所有 shell 腳本添加 `shell: bash` 指定 + +2. **Linux 依賴包衝突** + - **問題**:`libayatana-appindicator3-dev` 與 `libappindicator3-dev` 衝突 + - **原因**:Ubuntu 24.04 中兩個包不能同時安裝 + - **解決方案**:優先嘗試 ayatana 版本,失敗時回退到傳統版本 + +3. **Linux 構建失敗** + - 檢查系統依賴是否正確安裝 + - 確認 GTK 和 WebKit 版本兼容性 + - 檢查 appindicator 依賴是否正確安裝 + +4. **macOS 構建失敗** + - 檢查 Xcode 命令行工具 + - 確認 target 配置正確 + - 驗證 Rust 工具鏈是否支援目標架構 + +5. **桌面產物下載失敗** + - 確認指定的 Run ID 存在且成功 + - 檢查 Artifacts 保留期限(30天) + - 驗證工作流程權限設置 + +6. **發佈包缺少桌面應用** + - 驗證 `include_desktop` 設置為 true + - 檢查桌面應用驗證步驟是否通過 + - 確認平台選擇邏輯正確執行 + +7. **部分平台構建失敗導致發佈被阻擋** + - **問題**:只有部分平台構建成功(例如 2/4 個平台) + - **原因**:發佈流程要求所有 4 個平台都必須成功 + - **解決方案**: + - 重新運行桌面構建工作流程,確保所有平台成功 + - 檢查失敗平台的構建日誌 + - 或者設置 `include_desktop=false` 僅發佈 Web 版本 + +8. **多平台完整性要求** + - **必須平台**:Windows x64、macOS Intel、macOS Apple Silicon、Linux x64 + - **驗證標準**:每個平台的二進制文件必須 > 1MB + - **失敗處理**:任何平台缺失或無效都會阻擋發佈 + +### 調試步驟 + +1. **檢查工作流程配置**: + ```bash + python scripts/validate_workflows.py + ``` + +2. **查看構建日誌**: + - 前往 GitHub Actions 頁面 + - 檢查失敗步驟的詳細日誌 + +3. **驗證產物**: + - 下載 Artifacts 手動檢查 + - 確認文件大小和執行權限 + +## 📈 效果評估 + +### 改進前的問題 +- ❌ 跨平台編譯在本地環境失敗 +- ❌ 發佈流程缺少桌面應用驗證 +- ❌ 錯誤處理不夠健壯 +- ❌ 缺少統一的構建發佈流程 + +### 改進後的優勢 +- ✅ 所有平台在原生環境構建 +- ✅ 完整的產物驗證和錯誤處理 +- ✅ 自動化的端到端流程 +- ✅ 詳細的狀態報告和故障排除指導 +- ✅ 靈活的構建和發佈選項 + +## 🎯 下一步 + +1. **測試新工作流程**: + - 觸發桌面構建測試所有平台 + - 驗證發佈流程包含桌面應用 + +2. **監控和優化**: + - 收集構建時間數據 + - 根據實際使用情況調整配置 + +3. **文檔更新**: + - 更新用戶指南 + - 添加更多故障排除案例 diff --git a/pyproject.toml b/pyproject.toml index 5c7a493..247ee26 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -62,8 +62,8 @@ build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/mcp_feedback_enhanced"] -# 桌面應用程式二進制檔案會在發佈流程中動態添加到 src/mcp_feedback_enhanced/desktop_release -# 如果目錄不存在,構建過程會自動跳過 +# 桌面應用程式二進制檔案現在直接存儲在 Git 中 +# 由 build-desktop.yml 工作流程自動構建並提交 [tool.uv] dev-dependencies = [ diff --git a/src/mcp_feedback_enhanced/desktop_app/desktop_app.py b/src/mcp_feedback_enhanced/desktop_app/desktop_app.py index 54e63d4..f48d807 100644 --- a/src/mcp_feedback_enhanced/desktop_app/desktop_app.py +++ b/src/mcp_feedback_enhanced/desktop_app/desktop_app.py @@ -70,8 +70,8 @@ class DesktopApp: self.web_manager.start_server() # 等待服務器啟動 - max_wait = 10 # 最多等待 10 秒 - wait_count = 0 + max_wait = 10.0 # 最多等待 10 秒 + wait_count = 0.0 while wait_count < max_wait: if ( self.web_manager.server_thread diff --git a/src/mcp_feedback_enhanced/desktop_release/mcp-feedback-enhanced-desktop.exe b/src/mcp_feedback_enhanced/desktop_release/mcp-feedback-enhanced-desktop.exe new file mode 100644 index 0000000..ccb9cf7 Binary files /dev/null and b/src/mcp_feedback_enhanced/desktop_release/mcp-feedback-enhanced-desktop.exe differ