convertor/.github/UPSTREAM_SYNC.md
2026-01-19 23:54:04 +08:00

280 lines
9.3 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 🔄 Upstream 自動同步機制
本專案實作了完整的 upstream 自動同步、變更追蹤與 smoke test 機制。
## 📋 目錄
- [功能概述](#功能概述)
- [工作流程圖](#工作流程圖)
- [Workflow 說明](#workflow-說明)
- [Smoke Test 內容](#smoke-test-內容)
- [設定說明](#設定說明)
- [手動操作](#手動操作)
---
## 功能概述
### 1⃣ 自動同步 Upstream
| 功能 | 說明 |
| ---------- | ---------------------------- |
| 觸發方式 | 每 6 小時自動檢查 / 手動觸發 |
| 同步目標 | `dev` 分支 |
| Merge 策略 | 自動 merge無衝突時 |
| 衝突處理 | 自動建立 GitHub Issue 通知 |
### 2⃣ 變更摘要
同步完成後自動產生:
- ✅ GitHub Issue詳細變更記錄
-`upstream-changelog.md`(累積變更歷史)
- ✅ GitHub Actions Summary快速查看
### 3⃣ Smoke Test
| 測試項目 | 內容 | 時間限制 |
| -------------- | -------------------------------------- | ------------- |
| Container 啟動 | 驗證 image 可正常啟動 | 60s |
| 工具檢查 | libreoffice, pandoc, ffmpeg, tesseract | 30s |
| 最小轉換 | txt → pdf | 60s |
| API 端點 | healthcheck, root | 10s |
| **總計** | | **< 10 分鐘** |
---
## 工作流程圖
```
┌─────────────────────────────────────────────────────────────────────────┐
│ Upstream 自動同步流程 │
└─────────────────────────────────────────────────────────────────────────┘
┌──────────────┐
│ Upstream │
│ (C4illin/ │
│ ConvertX) │
└──────┬───────┘
│ 每 6 小時檢查
┌──────────────┐ 無更新 ┌──────────────┐
│ 檢查是否有 │ ─────────────► │ 結束 │
│ 新 commits │ └──────────────┘
└──────┬───────┘
│ 有更新
┌──────────────┐ 衝突 ┌──────────────┐
│ 自動 Merge │ ─────────────► │ 建立 Issue │
│ 到 dev 分支 │ │ 需手動處理 │
└──────┬───────┘ └──────────────┘
│ 成功
┌──────────────┐
│ 產生變更摘要 │
│ • Issue │
│ • Changelog │
└──────┬───────┘
┌──────────────┐
│ Push 到 dev │
└──────┬───────┘
│ 觸發 upstream-sync.yml
┌──────────────┐
│ Build 測試 │
│ Image (amd64)│
└──────┬───────┘
┌──────────────────────────────────────────────────┐
│ Smoke Test │
│ ┌────────────┐ ┌────────────┐ ┌────────────┐ │
│ │ Container │ │ 工具 │ │ 轉換 │ │
│ │ 啟動 │ │ 檢查 │ │ 測試 │ │
│ └─────┬──────┘ └─────┬──────┘ └─────┬──────┘ │
│ │ │ │ │
│ └──────────────┼──────────────┘ │
│ │ │
└───────────────────────┼──────────────────────────┘
┌─────────────┴─────────────┐
│ │
▼ ▼
┌────────────┐ ┌────────────┐
│ ✅ 通過 │ │ ❌ 失敗 │
└─────┬──────┘ └─────┬──────┘
│ │
▼ ▼
┌────────────┐ ┌────────────┐
│ Build 並 │ │ Workflow │
│ Push 到 │ │ 失敗 │
│ Docker Hub │ │ (不發布) │
└─────┬──────┘ └────────────┘
┌────────────────────────┐
│ upstream-YYYYMMDD tag │
│ ❌ 不更新 latest │
│ ❌ 不打 semver tag │
└────────────────────────┘
```
---
## Workflow 說明
### `auto-upstream-sync.yml`
**用途:** 自動檢測並同步 upstream 更新
**觸發條件:**
- 6 小時自動執行
- 🖱 手動觸發
**主要步驟:**
1. Fetch upstream 最新程式碼
2. 檢查是否有新 commits
3. 自動 merge `dev` 分支
4. 產生變更摘要Issue + Changelog
5. Push `dev`
### `upstream-sync.yml`
**用途:** `dev` 分支有 push 執行 build + smoke test
**觸發條件:**
- 📦 `dev` 分支有 push
**主要步驟:**
1. Build 測試用 image amd64加速測試
2. 執行 Smoke Test10 分鐘內
3. 測試通過後 build multi-arch image
4. Push Docker Hubtag: `upstream-YYYYMMDD`
---
## Smoke Test 內容
### Test 1: Container 啟動測試
```bash
# 啟動 container 並等待 healthcheck 回應
docker run -d --name convertx-test $IMAGE
curl http://localhost:3000/healthcheck
```
### Test 2: 關鍵工具檢查
```bash
# 必須通過(任一失敗則整體失敗)
libreoffice --version
pandoc --version
ffmpeg -version
tesseract --version
```
### Test 3: 最小轉換測試
```bash
# txt → pdf 轉換測試
echo "test" > test.txt
libreoffice --headless --convert-to pdf test.txt
```
### Test 4: API 端點檢查
```bash
# 確認服務正常運作
curl http://localhost:3000/healthcheck
curl http://localhost:3000/
```
---
## 設定說明
### 必要的 GitHub Secrets
Repository Settings Secrets and variables Actions 中設定
| Secret 名稱 | 說明 |
| -------------------- | ----------------------- |
| `DOCKERHUB_USERNAME` | Docker Hub 帳號 |
| `DOCKERHUB_TOKEN` | Docker Hub Access Token |
### 分支保護規則
建議設定
**`main` 分支**
- Require pull request before merging
- Require status checks to pass
- Allow force pushes
**`dev` 分支**
- Allow direct pushes (for automation)
---
## 手動操作
### 手動觸發同步
1. 前往 Actions Auto Upstream Sync
2. 點選 "Run workflow"
3. 可選擇強制同步
### 手動處理 Merge 衝突
當自動同步發生衝突時
```bash
# 1. 切換到 dev 分支
git checkout dev
# 2. 添加 upstream remote如果還沒有
git remote add upstream https://github.com/C4illin/ConvertX.git
# 3. Fetch upstream
git fetch upstream main
# 4. Merge upstream
git merge upstream/main
# 5. 解決衝突
# ... 編輯衝突的檔案 ...
# 6. 提交並 push
git add .
git commit -m "Resolve merge conflicts with upstream"
git push origin dev
```
---
## ⚠️ 注意事項
1. **不會自動更新 `latest` tag** - 需要手動發布正式版本
2. **不會自動打 semver tag** - 需要手動建立 release
3. **`main` 分支不會被自動修改** - 只有 `dev` 會自動同步
4. **Smoke test 失敗時不會發布 image** - 確保品質
---
## 📊 Docker Image Tag 規則
| Tag 格式 | 說明 | 自動/手動 |
| ------------------- | ---------------------------------- | --------- |
| `upstream-YYYYMMDD` | Upstream 同步版經過 smoke test | 自動 |
| `vX.Y.Z` | 正式版本 | 手動 |
| `latest` | 最新穩定版 | 手動 |