CI 系統解析
約 1607 字大約 5 分鐘
MAA 借助 Github Action 完成了大量的自動化工作,包括網站的構建,自動更新資源,最終文件的構建與發版等等過程。隨著時間的推移,這些 CI 逐漸開始嵌套,部分甚至引向了其他的存儲庫。本文檔旨在為想要對 MAA 的 CI 系統做出改進的各位做一個簡要的介紹。
閱讀本文之前,最好對 MAA 的項目結構以及組成有一個基本的概念。
提示
你可以通過在本頁面內搜尋 CI 文件名來快速導航到想看的部分
工作流的文件均存放在 .github/workflows 下,各個文件可以按功能分為以下幾部分:
此外,我們還通過 pre-commit.ci 實現了代碼的自動格式化和圖片資源的自動優化,它在發起 PR 後會自動執行,一般無需特別在意。
Github Action 部分
代碼測試
smoke-testing.yml
本工作流主要負責對 MaaCore 做出基本的檢測,包括資源文件加載,部分簡單 task 運行測試等等。
由於測試用例已經較久沒有更新,該工作流現在基本是為了保證資源文件不會出現錯誤,以及 MaaCore 的代碼沒有出現影響到構建的致命性錯誤。
代碼構建
ci.yml
本工作流負責對代碼進行全量構建工作,包含 MAA 的所有組件,構建成品即為可運行的 MAA。
除了必要的 MaaCore 外,Windows 構建產物會包含 MaaWpfGui,MacOS 構建產物會包含 MaaMacGui,Linux 構建產物會包含 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發布內測版release-ota.yml發布正式版/公測版release-preparation.yml為正式版/公測版生成 changelog 和準備發布pr-auto-tag.yml對正式版/公測版生成 tag
提示
上述文件名內的 ota 意為 Over-the-Air,也就是我們常說的「增量更新包」,因此 MAA 的發版過程實際上包含了對過往版本構建 OTA 包的步驟
內測版
release-nightly-ota.yml
本工作流會在每天 UTC 時間 22 點自動運行,以保證內測版的發版頻率。當然,你也可以在做出更改需要驗證時手動發版。
需要注意的是,內測版的發布僅針對 Windows 用戶,MacOS 與 Linux 用戶並不能接收到內測更新。
正式版/公測版
這兩個通道的發版流程相對複雜一點,我們通過模擬一次發版步驟來解釋各工作流的作用:
- 建立由 
dev到master分支的 pr,且該 pr 的名字需要為Release v****** release-preparation.yml會生成最近的正式版/公測版到當前版本的 changelog(以一個新 pr 的形式)- 對 changelog 進行手動調整,並且添加簡要描述
 - 合併 pr,觸發 
pr-auto-tag.yml,創建 tag 並且同步分支 - 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
通過正則匹配給各個 Issue 打 Tag,以此來分類標記 Issue 內容,方便查看與管理。
issue-checkbox-checker.yml
通過正則匹配自動關閉勾選「我未仔細閱讀」的 Issue;若「我未仔細閱讀」未被勾選,則將所有勾選框折疊。
stale.yml
檢查超過 90 天沒有活動的 Bug Issue,將其標記並發起通知,7 天後若還沒有活動則關閉。
Pull Requests 管理
pr-checker.yml
該工作流用於檢查 PR 中的 Commit Message 是否符合 約定式提交,以及是否包含 Merge Commit,若上述條件符合則會作出提示。
MirrorChyan 相關
MirrorChyan 是有償的更新鏡像服務,與其相關的工作流如下:
mirrorchyan.yml同步更新包到 MirrorChyanmirrorchyan_release_note.yml生成 MirrorChyan 的 Release Note
其他
markdown-checker.yml
負責檢查倉庫中的所有 Markdown 文件中是否包含無效鏈接。
blame-ignore.yml
自動忽略 Commit Message 包含 blame ignore 的提交,保證倉庫歷史的乾淨。
cache-delete.yml
在 PR 合併後清理相關的緩存,以此來節省緩存用量。
update-submodules.yml
定期更新 MaaMacGui 和 maa-cli 等子模組到最新版本。該工作流每天 UTC 時間 21:50 自動執行(在每日內測版發布之前),確保子模組保持最新狀態。
