LLVM CI 最佳實務¶
總覽¶
本文件包含一份在使用 LLVM 的 CI 系統時應遵循的指南和最佳實務列表。這些指南旨在確保我們的操作可靠、一致且安全。
Github Actions 最佳實務¶
本節包含在使用 LLVM 的 github actions 工作流程時的最佳實務/指南資訊。
在 Fork 中停用任務¶
存在許多 LLVM 的 fork,而我們目前預設為阻止 action 在 LLVM 組織外部執行,以防止它們在 fork 中執行。我們預設這樣做是因為在 fork 中執行的 action 通常不是預期的,而只是意外執行。此外,我們的許多工作流程都假設它們在主要的 LLVM 儲存庫內運作,否則會崩潰。
遵循此最佳實務看起來像是在工作流程中指定的每個任務中加入以下內容
jobs:
<job name>:
if: github.repository_owner == 'llvm'
我們選擇使用 github.repository_owner
而不是 github.repository
,以使這些工作流程能夠在 LLVM 組織內部的 fork 中執行,例如 ClangIR fork。
此規則有一些例外情況,在這些情況下,當將工作流程限制為僅在主要單一儲存庫 (monorepo) 中執行才有意義時,可能會使用 github.repository
。這些例外情況包括諸如 issue 訂閱者和發布任務之類的事項,這些任務不應在其他任何地方執行。
雜湊固定相依性¶
Github Actions 允許使用來自其他儲存庫的 action 作為任務中的步驟。我們利用各種 action 來執行各種不同的任務,特別是像檢查儲存庫以及下載/上傳建置快取之類的任務。這些 action 通常僅使用發布版本進行版本控制,如下所示
steps:
- name: Checkout LLVM
uses: actions/checkout@v4
然而,最佳實務是指定要從中提取 action 的確切 commit SHA,並在註解中註明版本
一旦 Github 的不可變更 action 作為 GA 推出後,我們計劃重新檢視此建議。
steps:
- name: Checkout LLVM
uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2
這有兩個好處:可靠性和安全性。指定確切的 SHA 而不是僅僅一個主要版本,可確保我們最終運行的是在工作流程撰寫和/或更新時最初指定的相同 action,並且不會有任何破壞性變更從新發布的工作流程版本中偷偷引入。然而,透過指定確切的點發布版本也可以達到此效果。偏好雜湊固定相依性的最大原因是安全性。Github 上的發布資產是可變的,允許攻擊者在事後更改特定版本 action 內的程式碼,從而可能竊取敏感的 token 和憑證。雜湊固定相依性可以防止這種情況,因為雜湊會隨著程式碼而改變。
使用版本控制的 Runner 映像檔¶
Github actions 允許使用特定版本控制的 runner 映像檔 (例如,ubuntu-22.04
),或僅使用最新的 runner 映像檔 (例如,ubuntu-latest
)。最佳實務是使用明確版本控制的 runner 映像檔。這可以防止當 Github 將最新的 runner 映像檔滾動到具有潛在破壞性變更的新版本時發生故障,而是讓我們能夠在進行充分的測試以確保我們現有的工作流程在新環境中按預期工作後,明確選擇加入使用新的映像檔。