Gradle Remote Build Cache Misses
Bài tóm tắt SoundCloud 2019 2. Tăng trưởng Độ khó: Trung bình
SoundCloud · 2019 · 2. Tăng trưởng · Độ khó: Trung bình — bài gốc
Phần 1/2. Phần 2: SoundCloud 2019. Codebase là app Android nhưng lõi là hạ tầng build, nên giữ.
Bối cảnh
- Thời gian build tăng là một trong những rủi ro kỹ thuật hàng đầu của đội Android SoundCloud, nằm trong mục tiêu quý của công ty dưới tên modularization. Ngoài module hoá, cách thứ hai là tránh làm lại việc bằng build cache. Họ đã bật remote build cache của Gradle (CI ghi vào, developer đọc ra), nhưng theo họ, chỉ bật thôi thì có khi không trúng cache lần nào.
Thay đổi chính
- Cơ chế: mỗi task có input và output; Gradle tính cache key từ input, input giống nhau thì lấy output đã lưu thay vì chạy lại. Remote cache chỉ có ích khi input ở máy developer và ở CI giống hệt nhau.
- Công cụ: build scan của Gradle Enterprise ghi lại input của từng task, so sánh hai build để thấy input nào khác (ví dụ thêm một khoảng trắng vào file Java cũng đổi key).
- Miss do BuildConfig: hằng số
TEST_RETRY_COUNTđược đặt bởi hàm trả 1 trên CI và 0 ở máy local, nên file sinh ra khác nhau và một trong những module lớn nhất không bao giờ trúng cache giữa CI và local. Sửa: bỏ kiểm tra lúc build, chuyển sang kiểm tra lúc chạy test. - Miss do Kotlin: mọi task compile Kotlin không lấy được gì từ cache, vì họ đã tắt incremental compilation trên CI, mà cờ
incrementallà một phần của input. Bật lại trên các node CI ghi cache thì tỉ lệ trúng tăng vọt.
Vì sao
- Khoá cache là toàn bộ input; bất kỳ khác biệt môi trường nào (cờ CI, đường dẫn, cấu hình) lọt vào input đều làm cache vô dụng giữa hai nơi (Cache và invalidation, CI và build ở quy mô lớn).
Bài học cho SWE
- Đo tỉ lệ trúng remote cache và so input giữa CI và local, đừng chỉ bật lên rồi tin là nó chạy.
- Giữ khác biệt giữa môi trường ở lúc chạy, không ở lúc build.
- Cấu hình của máy ghi cache phải khớp cấu hình của máy đọc.
Liên quan
- SoundCloud 2019 · Mercari 2026 · Uber 2022 · Railway 2025 (deployment ID phá cache)
- CI và build ở quy mô lớn · Cache và invalidation
#Gradle#Remote build cache#Cache key#Cache miss#Build scan#BuildConfig#Kotlin incremental compilation#Android
Được nhắc tới trong
Công ty (1)