Making Order in CI/CD Mess

Bài tóm tắt Wix 2020 2. Tăng trưởng Độ khó: Trung bình

Wix · 2020 · 2. Tăng trưởng · Độ khó: Trung bình — bài gốc

Bối cảnh

  • Khoảng 2011 (bài nói "9 năm trước"), Wix có 5 monolith backend, một project Flash và khoảng 50 developer; cả 5 monolith build trên một server TeamCity. Deploy là thủ công: tải artifact từ TeamCity, FTP lên production, "cầu may". Production không ổn định.
  • Tới 2020, Wix có khoảng 1.000 developer làm trên hàng nghìn artifact.

Thay đổi chính

  • Mô hình phiên bản ba bậc: commit vào master → build ở dev CI → bản SNAPSHOT lưu trong Artifactory; RC là promote bản snapshot cuối (copy sang repo RC, đổi số phiên bản thành duy nhất); GA là developer cập nhật production lên một RC.
  • Lifecycle v1: cổng thông tin CI ghép dữ liệu từ build server, Artifactory, production và New Relic: danh sách build, phiên bản mới nhất ở mỗi bậc, 20 sự kiện production gần nhất (RC/GA/rollback) toàn cục và theo build, biểu đồ hiệu năng; nút Trigger RC và Trigger GA/Rollback. Mọi thao tác production đi qua đây và được ghi lại, nên dễ tương quan thay đổi với sự cố và rollback.
  • Khi lớn lên thì phải self-service: không quản lý build bằng tay được nữa. Lifecycle bản sau là nhiều microservice nói chuyện qua Kafka và RPC:
    • Git Event Listener phát message Kafka cho mỗi commit vào bất kỳ repo nào (service khác ngoài Lifecycle cũng dùng).
    • Plugin TeamCity phát event khi build bắt đầu/xong/lỗi.
    • Repo Descriptor Service dựng thực thể chung "Artifact" (id, build tool Maven/NPM, ngôn ngữ, người đóng góp, phụ thuộc, cấu hình CI riêng), cập nhật mỗi khi repo đổi.
    • Build Descriptor Service nghe event build, hỏi TeamCity, Repo Descriptor và Artifactory để làm mới toàn bộ thông tin một build.
    • Production Interface Service phản ánh artifact nào chạy ở đâu, phiên bản nào, theo dõi tiến độ deploy.
    • RC service kiểm tra build có thể RC (không có thay đổi đang chờ, build CI xanh); GA service quản lý GA/testbed/rollback và lịch sử phiên bản.

Vì sao

  • Theo Wix, nối dữ liệu từ build server, kho artifact, production và monitoring thành một bức tranh không phải là sản phẩm phụ của quy trình; phải có hệ thống làm việc đó. Khi có hàng nghìn artifact, một điểm vào duy nhất là điều kiện để developer tự làm việc ở production (Nền tảng nội bộ cho service (đường ray chung), Deploy và release an toàn).

Bài học cho SWE

  • Ghi mọi thao tác promote/deploy/rollback như event có thể truy vấn; đó là thứ giúp trả lời "sự cố này có trùng với thay đổi nào".
  • Promote cùng một artifact qua các bậc thay vì build lại cho mỗi bậc.
  • Khi CI phục vụ nhiều nghìn artifact, đổi từ "đội CI cấu hình hộ" sang dữ liệu và thao tác self-service (CI và build ở quy mô lớn).

Liên quan