Solving Remote Build Cache Misses by Annoying Your Colleagues
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 2/2. Phần 1: SoundCloud 2019.
Bối cảnh
- Gradle khuyên CI ghi cache từ build sạch, developer chỉ đọc; SoundCloud cho cả CI đọc cache để CI nhanh hơn. Miss xảy ra khi danh sách input của cùng một task khác nhau giữa CI và máy developer.
Thay đổi chính
- Chặn đường chậm bằng cách làm build thất bại (vì "không ai đọc tài liệu"):
- Instant Run của Android Studio âm thầm tắt build cache; đo ra nó bằng hoặc chậm hơn build thường. Build script kiểm tra thuộc tính mà Android Studio tiêm vào khi bật Instant Run, nếu có thì fail kèm hướng dẫn tắt.
- Thư mục rỗng: javac bỏ qua, nhưng Gradle coi là input khác; Git không theo dõi thư mục rỗng nên chúng hay sót lại sau refactor hay đổi nhánh. Thêm kiểm tra trước mọi
SourceTask: thấy thư mục nguồn rỗng thì fail và in lệnhrmdir. Kiểm tra tốn dưới 5 ms mỗi module (89 ms ở một module di sản lớn). Lúc đầu developer bực vì fail liên tiếp, sau đó hiếm dần và tỉ lệ trúng cache tăng.
- File sinh ra chứa đường dẫn tuyệt đối: task
compileDebugAidlsinh Java có comment ghi đường dẫn tuyệt đối của file.aidl, nên mỗi máy một key. Thêm bước xoá dòng đó sau khi sinh và báo lỗi cho Google. Cùng task đó mất 1,3 giây để kiểm tra up-to-date vì lọc cả cây nguồn; chuyển file AIDL ra module riêng còn 0,003 giây. - Annotation processor sinh danh sách thì phải sắp xếp, vì thứ tự xử lý có thể khác giữa CI và local.
Kết quả (theo SoundCloud)
- Thời gian build trung bình từ 49,55 giây xuống 36,84 giây dù codebase lớn thêm bốn tháng; mỗi developer trung bình khoảng 40 build/ngày. Theo họ, lợi ích của module hoá được nhân lên khi cache trúng.
Vì sao
- Mọi nguồn không tất định trong input (cờ IDE, thư mục rỗng, đường dẫn tuyệt đối, thứ tự) đều phá cache chia sẻ; ép đồng nhất bằng build fail rẻ hơn thuyết phục từng người (Cache và invalidation, CI và build ở quy mô lớn).
Bài học cho SWE
- Một quy tắc quan trọng cho hiệu năng build nên được ép bằng build fail có thông báo sửa, không bằng wiki.
- Output sinh ra phải tất định: không đường dẫn tuyệt đối, không phụ thuộc thứ tự.
- Đo chi phí của chính kiểm tra trước khi thêm vào mọi build.
Liên quan
- SoundCloud 2019 · Notion 2025 (ép quy tắc bằng công cụ) · SoundCloud 2019
- CI và build ở quy mô lớn · Cache và invalidation
#Gradle#Remote build cache#Fail the build#Instant Run#Empty directory#AIDL#Absolute path#Annotation processor ordering
Được nhắc tới trong
Công ty (1)
Bài tóm tắt (3)