# 新聞稿 Tuist 使用持續發佈系統,每當有意義的變更合併到主分支時,系統就會自動發佈新版本。此方法可確保所做的改進能快速傳達給使用者,而無需維護人員的手動介入。 ## 概述 我們持續發佈三個主要元件: - **Tuist CLI** - 指令列工具 - **Tuist 伺服器** - 後端服務 - **Tuist 應用程式** - macOS 和 iOS 應用程式 (iOS 應用程式僅持續部署至 TestFlight,請參閱 [此處](#app-store-release)) 每個元件都有自己的發行管道,每次推送到主分支時都會自動執行。 ## 如何運作 ### 1.承諾慣例 我們使用 [Conventional Commits](https://www.conventionalcommits.org/) 來結構我們的提交訊息。這可讓我們的工具了解變更的性質、決定版本的升級,並產生適當的變更記錄。 格式:`種類(範圍):描述` #### 承諾類型及其影響 | 類型 | 說明 | 版本影響 | 範例 | | ----- | -------- | ---------------- | -------------------------- | | `功勋` | 新功能或能力 | 次要版本提升 (x.Y.z) | `feat(cli): 新增 Swift 6 支援` | | `定` | 錯誤修正 | 修補程式版本提升 (x.y.Z) | `fix(app): 解決開啟專案時當機的問題` | | `文件` | 文件變更 | 無發佈 | `說明文件:更新安裝指南` | | `風格` | 程式碼樣式變更 | 無發佈 | `樣式:使用 swiftformat 格式化程式碼` | | `重構` | 程式碼重整 | 無發佈 | `重構(server):簡化認證邏輯` | | `敷衍` | 效能改善 | 補丁版本提升 | `perf(cli): 最佳化依賴解析` | | `測試` | 測試新增/變更 | 無發佈 | `test: 新增快取的單元測試` | | `苦差事` | 維護任務 | 無發佈 | `苦差事:更新相依性` | | `ci` | CI/CD 變更 | 無發佈 | `CI:新增發行版本的工作流程` | #### 突破性變更 破壞性變更會觸發主要版本提升 (X.0.0),並應在提交正文中註明: ``` feat(cli): change default cache location BREAKING CHANGE: The cache is now stored in ~/.tuist/cache instead of .tuist-cache. Users will need to clear their old cache directory. ``` ### 2.變更偵測 每個元件使用 [git cliff](https://git-cliff.org/) 來: - 分析自上次發行後的提交 - 依範圍 (用戶端、應用程式、伺服器) 過濾提交內容 - 確定是否有可釋放的變更 - 自動產生更新記錄 ### 3.釋放管線 偵測到可釋放變更時: 1. **版本計算** :流水線決定下一個版本號 2. **變更日誌產生**: git cliff 可從提交訊息建立變更日誌 3. **建置流程** :元件已建立並測試 4. **版本建立** :GitHub 發行版本與工件一起建立 5. **發行** :更新會推送給套件管理員 (例如:Homebrew for CLI) ### 4.範圍過濾 每個元件只有在有相關變更時才會釋放: - **CLI**: 提交範圍為`(cli)` 或無範圍 - **應用程式** :與`(app)` 範圍的提交 - **伺服器** :與`(伺服器)` 範圍的提交 ## 撰寫良好的提交訊息 由於提交訊息會直接影響發行說明,因此撰寫清楚、具說明性的訊息非常重要: ### 做: - 使用現在式:「增加功能」而非「增加功能」。 - 要簡潔但具描述性 - 當變更為特定元件時,包含範圍 - 適用時請參考問題:`fix(cli):解決建立快取記憶體的問題 (#1234)` ### 不要 - 使用含糊不清的訊息,例如「修正錯誤」或「更新程式碼」。 - 在一次提交中混合多個不相關的變更 - 忘記包含故障變更資訊 ### 突破性變更 如果是破壞性的變更,請在提交正文中包含`BREAKING CHANGE:` : ``` feat(cli): change cache directory structure BREAKING CHANGE: Cache files are now stored in a new directory structure. Users need to clear their cache after updating. ``` ## 發佈工作流程 發佈工作流程定義在 - `.github/workflows/cli-release.yml` - CLI 發行版本 - `.github/workflows/app-release.yml` - 應用程式版本 - `.github/workflows/server-release.yml` - 伺服器版本 每個工作流程: - 在推到主機時運行 - 可手動觸發 - 使用 git cliff 檢測變更 - 處理整個發行流程 ## 監控釋放 您可以透過以下方式監控釋出: - [GitHub 發佈頁面](https://github.com/tuist/tuist/releases)。 - 工作流程執行的 GitHub 動作索引標籤 - 各元件目錄中的變更日誌檔案 ## 優點 這種持續釋放的方式提供了 - **快速交付** :合併變更後立即送達使用者 - **減少瓶頸** :無須等待手動釋放 - **清晰的溝通** :從提交訊息自動更新更新記錄 - **一致的流程** :所有元件採用相同的發行流程 - **品質保證** :僅發佈經過測試的變更 ## 疑難排解 如果釋放失敗: 1. 檢查 GitHub Actions 日誌,找出失敗的工作流程 2. 確保您的提交訊息遵循傳統格式 3. 驗證所有測試都通過 4. 檢查元件是否成功建立 用於需要立即釋放的緊急修復: 1. 確保您的委託有明確的範圍 2. 合併後,監控發行工作流程 3. 如果需要,觸發手動釋放 ## App Store 發佈 CLI 和 Server 遵循上述的持續釋出程序,而**iOS 應用程式** 則因 Apple 的 App Store 審核程序而例外: - **手動發佈**: iOS 應用程式發佈需要手動提交至 App Store - **審核延遲** :每個版本都必須經過 Apple 的審核程序,可能需要 1-7 天的時間 - **分批變更** :每個 iOS 版本通常會將多項變更捆綁在一起 - **TestFlight** :Beta 版本可在 App Store 發佈前透過 TestFlight 發佈 - **發行說明** :必須特別針對 App Store 指南撰寫 iOS 應用程式仍遵循相同的提交慣例,並使用 git cliff 來產生變更日誌,但實際發放給使用者的頻率較低,並採用手動排程。