Files
MaaAssistantArknights/docs/zh-tw/develop/ci-tutorial.md

158 lines
6.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
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.
---
order: 7
icon: devicon-plain:githubactions
---
# CI 系統解析
MAA 藉由 GitHub Actions 完成了大量的自動化工作,包括網站建置、資源自動更新、最終檔案的編譯與發布等過程。隨著時間推移,這些 CI 逐漸開始嵌套,部分甚至連結到了其他的倉庫。本文檔旨在為想要改進 MAA CI 系統的開發者提供一份簡要介紹。
閱讀本文之前,建議先對 MAA 的專案結構與組成有基本的概念。
::: tip
您可以透過在本頁面內搜尋 CI 檔名來快速導航到想看的內容。
:::
工作流Workflow檔案均存放於 `.github/workflows` 目錄下,各檔案可依功能分為以下幾部分:
- [程式碼測試](#程式碼測試)
- [程式碼建置](#程式碼建置)
- [程式碼安全檢查](#程式碼安全檢查)
- [版本發布](#版本發布)
- [資源更新](#資源更新)
- [網站建置](#網站建置)
- [Issues 管理](#issues-管理)
- [Pull Requests 管理](#pull-requests-管理)
- [MirrorChyan 相關](#mirrorchyan-相關)
- [其他](#其他)
此外,我們還透過 [pre-commit.ci](https://pre-commit.ci/) 實現了程式碼自動格式化與圖片資源自動優化,它在發起 PR 後會自動執行,一般無需特別在意。
## GitHub Actions 部分
### 程式碼測試
`smoke-testing.yml`
本工作流主要負責對 MaaCore 進行基礎檢測包括資源檔案載入、部分簡單任務Task執行測試等。
由於測試案例Test Cases已較久未更新該工作流目前的初衷是確保資源檔案不會出錯以及 MaaCore 的程式碼沒有出現影響建置的致命性錯誤。
### 程式碼建置
`ci.yml`
本工作流負責對程式碼進行全量建置工作,包含 MAA 的所有組件,建置產物即為可執行的 MAA。
除了必要的 MaaCore 外Windows 建置產物會包含 MaaWpfGuimacOS 建置產物會包含 MaaMacGuiLinux 建置產物則包含 MaaCLI。
該工作流在有任何新提交Commit或 PR 時都會自動執行;當該工作流由發版 PR 觸發時,本次的建置產物將直接用於發布,並自動建立一個 Release。
### 程式碼安全檢查
程式碼安全檢查透過 CodeQL 對程式碼與工作流進行安全分析,具體工作流如下:
`codeql-core.yml`
負責對 MaaCore 與 MaaWpfGui 的 C++ 和 C# 程式碼進行安全分析,偵測潛在的安全漏洞。
該工作流在修改相關原始碼的 PR 時會自動執行,同時於每天 UTC 時間 11:45 進行定期檢查。
`codeql-wf.yml`
負責對 GitHub Actions 工作流檔案本身進行安全分析,確保 CI/CD 流程的安全性。
該工作流在修改工作流檔案的 PR 時會自動執行,同時於每天 UTC 時間 12:00 進行定期檢查。
### 版本發布
版本發布(簡稱發版)是向用戶發布更新的必要操作,由以下工作流組成:
- `release-nightly-ota.yml` 發布內測版Nightly
- `release-ota.yml` 發布正式版 / 公測版Beta
- `release-preparation.yml` 為正式版 / 公測版產生 Changelog 並準備發布
- `pr-auto-tag.yml` 對正式版 / 公測版產生 Tag
::: tip
上述檔名稱內的 OTA 意為 Over-the-Air雲端更新也就是我們常說的 `增量更新檔案`,因此 MAA 的發版過程實際上包含了對過往版本建置 OTA 檔案的步驟。
:::
#### 內測版
`release-nightly-ota.yml`
本工作流會在每天 UTC 時間 22 點自動執行,以保證內測版的更新頻率。當然,您也可以在做出更改需要驗證時手動觸發發布。
需要注意的是,內測版發布僅針對 Windows 用戶macOS 與 Linux 用戶目前無法接收到內測更新。
#### 正式版 / 公測版
這兩個版本的發布流程相對複雜,我們透過模擬一次發布步驟來解釋各工作流的作用:
1. 建立從 `dev``master` 分支的 PR且該 PR 的標題需為 `Release v******`
2. `release-preparation.yml` 會產生從最近版本到當前版本的 Changelog以一個新 PR 的形式呈現)。
3. 對 Changelog 進行手動調整,並加入簡要描述。
4. 合併 PR觸發 `pr-auto-tag.yml` 建立 Tag 並同步分支。
5. Release 事件觸發 `release-ota.yml`,對 master 標上 Tag 後進行 OTA 包建置及附件上傳。
### 資源更新
這部分工作流主要負責 MAA 的資源更新與優化,具體如下:
- `res-update-game.yml` 定期執行,從指定倉庫拉取遊戲資源。
- `sync-resource.yml` 將資源同步到 MaaResource 倉庫,用於資源更新。
- `optimize-templates.yml` 優化包括範本圖片在內的圖片檔案大小。
### 網站建置
`website-workflow.yml`
本工作流主要負責 MAA 文件站的建置與發布。
請注意,網站的發布與版本更新強烈綁定。平時修改網頁組件時僅會進行建置以確保無誤,只有在正式發布版本時才會部署到 GitHub Pages。
### Issues 管理
`issue-checker.yml`
透過正規表達式Regex比對為各個 Issue 標記 Tag以此分類 Issue 內容,方便查看與管理。
`issue-checkbox-checker.yml`
透過正規表達式自動關閉勾選「我未仔細閱讀」的 Issue若該項未被勾選則將所有勾選框Checkbox折疊。
`stale.yml`
檢查超過 90 天沒有活動的 Bug Issue 並標記通知,若 7 天後仍無活動則自動關閉。
### Pull Requests 管理
`pr-checker.yml`
檢查 PR 中的 Commit Message 是否符合 [約定式提交](https://www.conventionalcommits.org/zh-hans/v1.0.0/),以及是否包含 Merge Commit若不符合則會發出提示。
### MirrorChyan 相關
MirrorChyan 是有償的更新鏡像服務,相關工作流如下:
- `release-package-distribution.yml` 同步更新包至 MirrorChyan。
- `mirrorchyan_release_note.yml` 產生 MirrorChyan 的 Release Note。
### 其他
`markdown-checker.yml`
檢查倉庫中所有 Markdown 檔案是否包含無效連結(死連結)。
`blame-ignore.yml`
自動忽略 Commit Message 包含 `blame ignore` 的提交,以保持 Git Blame 歷史紀錄的簡潔。
`cache-delete.yml`
在 PR 合併後清理相關快取Cache以節省 GitHub 儲存空間。
`update-submodules.yml`
定期將 MaaMacGui 與 maa-cli 等子模組更新至最新版本。該工作流於每天 UTC 時間 21:50 自動執行(在每日內測版發布之前),確保子模組保持在最新狀態。