Neat sccache 快速參考
Neat 使用 sccache 作為 C 和 C++ 編譯器的啟動器。它會快取編譯器的輸出,而不是最終的 Neat 套件、測試結果、依賴項下載或 Docker 映像。
對於大多數開發人員來說,無需安裝或設定任何內容:正常使用 build.sh,並檢查在最後列印的快取統計資訊。
簡要說明
| 建置 | 快取層級 | 寫入位置 | 是否能保留在 --clean 之後 |
|---|---|---|---|
| 本機 | 使用者本機磁碟 | 本機磁碟 | 是 |
Vulcan develop 或 main | 執行器本機磁碟,然後是受保護分支的 S3 | 本機磁碟及其受保護的 S3 命名空間 | S3 可以 |
| Vulcan 功能分支推送 | 執行器本機磁碟,然後是分支 S3 | 本機磁碟及其隔離的分支命名空間 | 直到分支刪除 |
| Vulcan 標籤或非直接引用 | 執行器本機磁碟,然後是最近的受保護 S3 | 僅限本機磁碟 | 沒有持續的執行器狀態 |
支援的進入點始終是:
./build.sh <options>
請勿將 sccache 用作編譯器的替代方案,或手動新增啟動程式選項。build.sh 提供了兩種 CMake 啟動程式:
CMAKE_C_COMPILER_LAUNCHER
CMAKE_CXX_COMPILER_LAUNCHER
本地建置
一般使用
已啟用 auto 模式下的快取功能 :
./build.sh --dev-only
./build.sh --all --clean
預設的快取位置和限制如下:
~/.cache/sima-neat/sccache
10 GiB
快取資料位於 build/ 之外。刪除 build/ 或執行 --clean 不會刪除快取的編譯器輸出。
如果 sccache 不在 PATH 中,build.sh 會將指定的版本下載到:
${XDG_CACHE_HOME:-$HOME/.cache}/sima-neat/tools/sccache/<version>/
此封存檔會與 scripts/configure_sccache.sh 中記錄的 SHA-256 進行比對。支援在 arm64 和 x86-64 架構上的 Linux 和 macOS 系統。
常見控制項
# Explicitly require sccache. Fail the build if it cannot be configured.
SIMANEAT_SCCACHE=on ./build.sh --all
# Disable caching for a reproducibility comparison.
SIMANEAT_SCCACHE=off ./build.sh --all --clean
# Put the local cache on a larger or faster volume.
SCCACHE_DIR=/mnt/nvme/sccache ./build.sh --all
# Change the local cache limit.
SCCACHE_CACHE_SIZE=20G ./build.sh --all
SIMANEAT_SCCACHE=auto 是預設設定。在此模式下,如果啟動程序失敗,則會產生警告,且建置程序會繼續進行,而不會使用快取。on 會使該失敗變成致命錯誤。
檢查或清除本機快取
使用 build.sh 選取的相同二進位檔案,或在 PATH 中啟用 sccache 時使用。
sccache --show-stats
sccache --zero-stats
sccache --show-adv-stats
為了釋放空間,請停止伺服器,並僅移除已設定的快取目錄:
sccache --stop-server
rm -rf "${XDG_CACHE_HOME:-$HOME/.cache}/sima-neat/sccache"
在刪除之前,請確認已解決的檔案路徑。請勿刪除整個使用者快取目錄。
Vulcan Cloud Builds
Vulcan 提供相同的本機磁碟快取,以及加密的 S3 層級:
s3://sima-neat-compiler-cache-production/
core/
sccache-v1/
<architecture>/
<sdk-cache>/
<build-mode>/
develop/
branches/<encoded-feature-branch>/
main/
branches/<encoded-feature-branch>/
例如:
core/sccache-v1/arm64/sdk-develop/standard/develop/
命名空間會刻意包含:
sccache-v1:快取結構描述,允許進行有意的全域重設- 架構:可防止 arm64 和 x86-64 編譯器輸出混合
- SDK 快取識別碼:可防止不相容的 SDK/工具鏈輸出混合
- 建置模式:可將標準和模糊測試工具分開
- 受保護的基本分支:可防止
develop和main寫入同一個命名空間
S3 儲存桶是私有的,使用其自己的 KMS 金鑰進行加密,並且與成品儲存桶分開。它沒有 CloudFront 發布,因為編譯器快取物件是私有的且可丟棄的。物件會在 45 天後自動過期。
分支存取權
| Git 參考 | OIDC 角色 | S3 模式 |
|---|---|---|
精確的 refs/heads/develop | 受保護的寫入者 | READ_WRITE,位於 develop/ 中 |
精確的 refs/heads/main | 受保護的寫入者 | READ_WRITE,位於 main/ 中 |
| 直接的功能分支推送 | 分支寫入者 | READ_WRITE,位於 <base>/branches/<branch>/ 以下 |
| 標籤或非直接參考 | 讀取者 | 從選定的受保護基準讀取,為 READ_ONLY |
在第一次建置時,功能分支會將快取從最接近的受保護 Git 祖先(develop 或 main)複製到其自己的命名空間中。然後,建置會僅讀取和寫入該分支的命名空間。後續的建置會重複使用它,直到 GitHub 的分支刪除事件移除該分支的所有架構、SDK 和建置模式命名空間為止。功能分支無法寫入任何受保護的快取。
自動祖先檢測會比較與 develop 和 main 的合併基準距離。可重複使用或手動啟動的工作流程可以在需要明確基準時設定 cache_base_branch=develop|main。AWS 憑證是短期的 GitHub OIDC 憑證;沒有長期有效的 AWS 金鑰儲存在 GitHub 或 SDK 容器中。
預期在第一次可寫入的受保護分支建置之前,會有一個空的受保護命名空間。功能分支仍然可以填充其自己的命名空間,但如果其選定的受保護基準為空,則不會收到任何初始快取命中。
Vulcan 會在設定 CMake 之前明確地探測 sccache 的啟動。如果 S3、KMS、網路或臨時憑證阻止快取伺服器啟動,則工作流程會列印警告,並在沒有 sccache 的情況下進行編譯。因此,遠端快取可用性是一種最佳化,並且不能阻止編譯。由於 Vulcan 執行器是暫時性的,因此不會使用執行器本地快取作為後備。本地開發人員建置會保留其正常的持續磁碟快取。