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
rulescủ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.ymlcon cho từng stage, commit vào repo, file gốcincludechú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 diffso 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:pipelinesnghĩa là lấy thư mục ngay trướcpipelines,::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.txtcủ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.ymlcủ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
- Pinterest 2021 (chọn việc theo thay đổi, nhưng qua đồ thị Bazel) · Grab 2019
- CI và build ở quy mô lớn
Được nhắc tới trong
Chủ đề (1)
Công ty (1)
Bài tóm tắt (3)