How we reduced our CI YAML files from 1800 lines to 50 lines

Bài tóm tắt Grab 2022 2. Tăng trưởng Độ khó: Dễ

Grab · 2022 · 2. Tăng trưởng · Độ khó: Dễ — bài gốc

Bối cảnh

  • Cauldron là đội nền tảng ML của Grab. Sản phẩm MerLin Pipelines cho mỗi team một repo chứa các pipeline ML; mỗi pipeline một thư mục con, mỗi thư mục chia thành stage (ví dụ phục vụ model qua Catwalk). Họ dựa vào rules của GitLab để phát hiện thay đổi và kích hoạt deploy đúng stage của đúng pipeline.
  • Phần ML chỉ là ngữ cảnh; lõi của bài là cách tổ chức cấu hình CI khi số pipeline trong một repo tăng.

Thay đổi chính

  • Cách 1: file con lồng nhau. CLI sinh trước các gitlab-ci.yml con cho từng stage, commit vào repo, file gốc include chúng. Gặp giới hạn mềm về số include (mặc định 100) khi team thêm pipeline và stage.
  • Cách 2: sinh một file lớn. Tiện ích duyệt cây include, chèn nội dung con vào file gốc. Tạm ổn, nhưng file lên tới 1.800 dòng và lại chạm giới hạn mềm về kích thước file CI.
  • Cách 3: dynamic child pipeline. Một job đầu pipeline chạy script sinh YAML lúc chạy, rồi GitLab kích hoạt child pipeline từ YAML đó. Script làm ba việc: git diff so với gốc nhánh để biết file đổi; trích tên pipeline và stage từ đường dẫn bằng "stop pattern" (ví dụ pipeline_name:pipelines nghĩa là lấy thư mục ngay trước pipelines, :: là lùi hai cấp); điền vào template. Công cụ viết bằng Rust (Tera cho template, clap cho CLI).
  • Trên nhánh master, job lấy lại đúng diff.txt của nhánh nguồn qua API artifact của GitLab rồi sinh pipeline như trên.

Kết quả (theo Grab)

  • File .gitlab-ci.yml của một trong những repo pipeline ML lớn nhất từ 1.800 xuống 50 dòng, và giữ cố định 50 dòng dù thêm bao nhiêu pipeline. Người dùng (ML engineer) không còn phải đụng tới YAML của GitLab.

Vì sao

  • Sinh cấu hình trước rồi commit thì cấu hình lớn dần theo số pipeline và chạm giới hạn của công cụ; sinh lúc chạy từ thay đổi thật thì kích thước chỉ phụ thuộc phần bị ảnh hưởng (CI và build ở quy mô lớn).

Bài học cho SWE

  • Khi cấu hình CI tăng tuyến tính theo số thành phần, chuyển sang sinh cấu hình từ quy ước thư mục + diff.
  • Quy ước đường dẫn ổn định (pipeline/stage) là thứ cho phép máy suy ra phải chạy gì; giữ nó như một hợp đồng.
  • Pipeline sau merge phải dùng lại đúng tập thay đổi của nhánh nguồn, nếu không sẽ chạy khác lúc review.

Liên quan