🔨 重新調整發布跟打包流程

This commit is contained in:
Minidoracat 2025-06-15 19:43:05 +08:00
parent 5df2c3a82c
commit ed0d426102
8 changed files with 355 additions and 140 deletions

View File

@ -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

View File

@ -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: |

5
.gitignore vendored
View File

@ -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

View File

@ -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

View File

@ -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. **文檔更新**
- 更新用戶指南
- 添加更多故障排除案例

View File

@ -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 = [

View File

@ -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