Running an automated test pipeline for the League client update

Bài tóm tắt Riot Games 2016 3. Quy mô lớn Độ khó: Trung bình

Riot Games · 2016 · 3. Quy mô lớn · Độ khó: Trung bình — bài gốc

Bối cảnh

  • Client cũ của League of Legends viết bằng Adobe AIR, có những lỗi lọt ra người chơi. Client mới (League client update) gồm frontend dựa trên Chromium và backend C++ cung cấp REST và websocket, nên tự động hoá được: ChromeDriver cho frontend, HTTP/websocket cho backend.
  • Môi trường dev chính nhận build mới mỗi 15 phút; chờ đội QA đọc kết quả là quá chậm.

Thay đổi chính

  • Văn hoá trước công nghệ: đội Test, Build, Deploy chỉ làm công cụ và hạ tầng test; team tính năng tự sở hữu unit, functional, performance, load test của mình.
  • Flaky test: quy trình cũ là thấy hỏng thỉnh thoảng thì bỏ qua vài giờ tới vài ngày, rồi cả team mặc định mọi lỗi là flaky và bỏ qua hết. Quy trình mới: test hỏng là điều tra ngay; test hỏng được chuyển sang staging suite chạy ngoài pipeline (test cho test); test mới hay viết lại cũng ở staging vài ngày rồi mới vào suite chính, nơi nó báo developer và chặn deploy.
  • Pipeline nhiều tầng, phạm vi rộng dần: test hẹp và cục bộ (unit, static analysis của từng plugin) chạy đầu, để lỗi của một team không chặn team khác; tầng chặn cả dự án nằm cuối. Mỗi plugin build xong vào bước Last Known Good (LKG): lấy manifest các phiên bản LKG của mọi plugin khác, thay plugin mới vào, dựng một client tạm và chạy bộ functional test giới hạn; qua thì thành LKG mới.
  • Build frontend chạy trong Docker trên farm Jenkins; functional test chạy trên VM Windows và macOS (client chỉ chạy ở đó). Hàng loạt job tương tự được sinh từ cấu hình JSON bằng Jenkins Job DSL, tham số chung để đấu nối lại dễ.
  • Test về ở cạnh code: tách repo functional test monolith, chuyển test vào repo của từng plugin; harness có "test acquire" duyệt cây phụ thuộc của manifest để tải đúng test cho tập plugin.
  • Việc tiếp theo (lúc viết): song song hoá test qua nhiều node, tự động hoá smoke test sau deploy (vẫn làm tay nhiều năm), đẩy test cục bộ nặng sang farm thay vì máy developer.

Vì sao

  • Theo Riot: hệ thống mất hơn một năm và đổi hướng nhiều lần; vài lần đầu bật LKG là "hỗn loạn". Khi team không tin kết quả test thì hệ thống test vô giá trị, nên giữ tín hiệu sạch quan trọng hơn thêm test.

Bài học cho SWE

  • Cách ly test không ổn định khỏi suite chặn deploy, và có đường vào riêng cho test mới, là cách giữ niềm tin vào tín hiệu.
  • Ghép phiên bản mới của một thành phần với bản tốt gần nhất của mọi thành phần khác cho phép kiểm tích hợp mà lỗi không lan sang team khác.
  • Test nằm cùng repo với code thì được cập nhật cùng code.

Liên quan