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ờ incremental là 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

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