Khi trợ lý AI làm tốc độ viết mã tăng gấp mấy lần, khâu kiểm tra phải tự động theo kịp, nếu không nó thành nút thắt hoặc thành cửa mở toang. Quy trình tích hợp liên tục (CI) là cổng chặn cuối cùng trước nhánh chính: mọi thay đổi, do người hay do AI viết, đều phải đi qua cùng một bộ kiểm tra chạy trên máy sạch, không ai nói "trên máy mình chạy được" mà xong.
Bài này nói về các tầng kiểm tra nên có, một cấu hình mẫu ngắn, cách nhờ AI viết cấu hình mà không dính lỗi hay gặp, những luật riêng khi tác tử AI tự mở yêu cầu gộp mã, và cách xử lý khi kiểm tra đỏ. Ví dụ dùng Python và cú pháp của một nền tảng CI phổ biến; nền tảng khác có khái niệm tương đương.
Vì sao mã AI viết càng cần kiểm tra tự động
Lý do đầu tiên là khối lượng. Một lập trình viên làm việc với trợ lý AI có thể mở nhiều yêu cầu gộp mã hơn hẳn trong một ngày, và mỗi yêu cầu dài hơn. Người rà không thể tự chạy lại mọi thứ cho mỗi thay đổi. Những việc kiểm tra lặp đi lặp lại như định dạng, kiểu dữ liệu, kiểm thử đơn vị phải do máy làm để người rà dồn sức cho câu hỏi khó.
Lý do thứ hai là AI không có môi trường của bạn. Nó viết mã dựa trên phiên bản thư viện nó đoán, cấu hình nó đoán, hệ điều hành nó đoán. Máy CI chạy đúng phiên bản trong tệp khai báo phụ thuộc, nên lỗi do đoán sai lộ ra ngay ở đây thay vì trên máy chủ thật.
Lý do thứ ba là tác tử AI. Khi một tác tử có quyền tự sửa mã và mở yêu cầu gộp, CI là thứ duy nhất đứng giữa nó và nhánh chính ngoài người duyệt. Tác tử cũng dùng kết quả CI làm tín hiệu để tự sửa: kiểm tra đỏ thì đọc nhật ký và thử lại. CI rõ ràng giúp tác tử làm tốt hơn; CI lỏng lẻo dạy tác tử rằng mã hỏng cũng qua được.
Các tầng kiểm tra nên có
Không cần dựng hết ngay. Bắt đầu từ hai ba tầng đầu, thêm dần khi dự án lớn lên. Thứ tự trong bảng cũng là thứ tự chạy hợp lý: rẻ và nhanh trước, đắt và chậm sau.
| Tầng | Bắt được gì ở mã AI viết | Thời gian điển hình |
|---|---|---|
| Định dạng mã | Mã không theo quy ước, làm phần thay đổi khó đọc | Vài giây |
| Phân tích tĩnh | Biến không dùng, nhập thư viện thừa, mẫu mã dễ lỗi, tham số mặc định thay đổi được | Vài giây tới một phút |
| Kiểm kiểu dữ liệu | Gọi hàm không tồn tại, truyền sai kiểu, quên xử lý giá trị rỗng | Dưới vài phút |
| Kiểm thử đơn vị | Sai logic so với ca kiểm thử đã có | Vài phút |
| Kiểm thử tích hợp | Sai khi nối với cơ sở dữ liệu, hàng đợi, dịch vụ khác | Vài phút tới hàng chục phút |
| Quét phụ thuộc và bí mật | Gói không rõ nguồn gốc, phiên bản có lỗ hổng đã công bố, khoá lỡ đưa vào mã | Vài phút |
| Đóng gói, dựng bản chạy | Thiếu tệp, sai cấu hình dựng, lệnh dựng chỉ chạy trên máy một người | Tuỳ dự án |
Với mã AI viết, tầng kiểm kiểu và phân tích tĩnh đáng giá hơn nhiều người nghĩ: chúng bắt phần lớn chuyện gọi hàm bịa và dùng sai thư viện trong vài giây, trước khi kiểm thử kịp chạy. Ngôn ngữ không có kiểu tĩnh như Python hay JavaScript vẫn có công cụ kiểm kiểu tuỳ chọn; thêm chú thích kiểu dần dần cho phần mã quan trọng.
Một cấu hình mẫu ngắn
Ví dụ giả định cho dự án Python, theo cú pháp quy trình của một nền tảng quản lý mã phổ biến. Mỗi yêu cầu gộp mã sẽ chạy phân tích tĩnh, kiểm kiểu rồi kiểm thử:
name: kiem-tra
on: [pull_request]
jobs:
kiem-tra:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: "3.12"
- run: pip install -r requirements-dev.txt
- run: ruff check .
- run: mypy src
- run: pytest -q
Phiên bản của các bước dựng sẵn và của công cụ thay đổi theo thời gian; đối chiếu tài liệu hiện hành trước khi dùng. Điểm cốt lõi không nằm ở công cụ cụ thể mà ở ba nguyên tắc: cấu hình nằm trong kho mã nên ai cũng xem và rà được, chạy trên máy sạch với phụ thuộc khai báo rõ, và kết quả gắn thẳng vào yêu cầu gộp mã để người duyệt thấy.
Sau khi chạy ổn, bật quy tắc bảo vệ nhánh chính: không cho gộp khi kiểm tra chưa xanh, và cần ít nhất một người duyệt. Thiếu quy tắc này, CI chỉ là lời khuyên. Với dự án dùng ngôn ngữ khác, khung vẫn y như vậy: lấy mã về, cài đúng phiên bản ngôn ngữ, cài phụ thuộc theo tệp khoá phiên bản, rồi chạy lần lượt các tầng kiểm tra. Điều đáng tránh là chép một cấu hình dài sẵn có từ đâu đó mà không ai trong nhóm hiểu từng dòng làm gì.
Nhờ AI viết cấu hình CI: những chỗ hay sai
Phiên bản cũ của các bước dựng sẵn. AI hay viết theo phiên bản phổ biến vào thời điểm dữ liệu huấn luyện của nó. Cấu hình vẫn chạy nhưng có cảnh báo, rồi hỏng khi phiên bản cũ bị ngừng hỗ trợ. Kiểm từng dòng gọi bước dựng sẵn với tài liệu hiện hành.
Bí mật viết thẳng vào cấu hình. Mật khẩu cơ sở dữ liệu thử nghiệm, khoá API dịch vụ ngoài phải nằm trong kho bí mật của nền tảng và được tham chiếu bằng tên, không bao giờ viết thẳng trong tệp. Khi nhờ AI viết, nói rõ điều này ngay trong câu lệnh.
Quyền quá rộng. Mã thông báo dùng trong quy trình mặc định có thể có quyền ghi vào kho. Quy trình chỉ chạy kiểm tra thì chỉ cần quyền đọc. Dặn AI khai báo quyền tối thiểu cho từng công việc.
Bước bị tắt cho qua. Khi một bước đỏ, AI đôi khi đề xuất thêm tuỳ chọn bỏ qua lỗi hoặc cho phép bước thất bại mà quy trình vẫn xanh. Đọc kỹ mọi thay đổi kiểu này; chúng biến cổng kiểm tra thành cửa trang trí.
Luật riêng khi tác tử AI tự mở yêu cầu gộp mã
Tác tử AI chạy kiểm thử, đọc lỗi và tự sửa theo vòng lặp. Để vòng lặp đó không đi tắt qua cổng kiểm tra, nhiều nhóm thêm vài luật:
- Tệp cấu hình CI, tệp cấu hình công cụ phân tích và ngưỡng độ phủ được đặt dưới quyền sở hữu của người cụ thể; thay đổi ở các tệp này bắt buộc người đó duyệt.
- Cảnh báo tự động khi một yêu cầu gộp mã vừa sửa mã vừa sửa hoặc xoá kiểm thử cũ, hoặc thêm đánh dấu bỏ qua kiểm thử.
- Cảnh báo khi mã thay đổi nhiều mà không có kiểm thử mới nào; không nhất thiết chặn, nhưng người duyệt phải thấy.
- Nhánh của tác tử không bao giờ được tự gộp, kể cả khi mọi kiểm tra xanh.
- Giới hạn số lần tác tử được tự chạy lại quy trình cho một thay đổi; quá giới hạn thì dừng và gọi người, tránh vòng lặp vô tận tốn tài nguyên.
Phần lớn nền tảng quản lý mã có cơ chế chỉ định người sở hữu theo thư mục hoặc tệp và quy tắc bảo vệ nhánh. Tên gọi và vị trí cài đặt khác nhau giữa các nền tảng; kiểm tài liệu của nền tảng nhóm bạn đang dùng.
Khi kiểm tra đỏ: dùng AI đọc nhật ký đúng cách
Nhật ký CI thường dài, và AI tóm tắt nhật ký khá tốt. Trình tự để không tự làm khó mình:
- Tìm lỗi đầu tiên trong nhật ký, không phải dòng cuối. Lỗi phía sau thường chỉ là hệ quả của lỗi đầu.
- Trước khi dán nhật ký cho AI, soát và che mọi thứ trông giống khoá, mã thông báo, đường dẫn nội bộ, địa chỉ máy chủ, dữ liệu kiểm thử có thông tin cá nhân.
- Hỏi AI giải thích nguyên nhân có thể và đề xuất cách tái hiện trên máy, chưa vội hỏi cách sửa.
- Tái hiện trên máy với đúng phiên bản trong cấu hình. Không tái hiện được thì so sự khác nhau giữa môi trường máy bạn và máy CI.
- Sửa, chạy lại trên máy, rồi mới đẩy lên.
- Nếu một kiểm thử lúc đỏ lúc xanh mà mã không đổi, đánh dấu là kiểm thử chập chờn, mở việc riêng để sửa. Không bấm chạy lại cho tới khi xanh rồi gộp.
Bước cuối là thói quen xấu phổ biến nhất. Kiểm thử chập chờn mà ai cũng chạy lại cho qua sẽ dạy cả nhóm, và cả tác tử AI, rằng màu đỏ không có nghĩa gì.
Giữ cho quy trình đủ nhanh
CI chậm là CI bị lách. Khi mỗi lần đẩy mã phải chờ hai mươi phút, người ta gộp nhiều thay đổi vào một lần, hoặc tìm cách bỏ qua. Mục tiêu hợp lý là phần kiểm tra chặn gộp chạy xong trong vài phút.
Vài cách thường dùng: lưu đệm thư mục phụ thuộc giữa các lần chạy; chạy các tầng độc lập song song; tách kiểm thử chậm như kiểm thử giao diện đầu cuối sang lịch chạy hằng đêm hoặc chỉ chạy trước khi phát hành; chỉ chạy kiểm thử của phần mã bị ảnh hưởng khi dự án lớn. AI giúp viết cấu hình cho từng cách này khá nhanh, nhưng bạn phải đo thời gian trước và sau, vì cấu hình lưu đệm sai có thể làm chậm hơn hoặc tệ hơn là dùng nhầm phụ thuộc cũ.
Cuối cùng, xem lại quy trình mỗi quý: tầng nào chưa từng bắt được lỗi nào, tầng nào hay đỏ vì lý do không liên quan tới mã. Bớt đi một tầng vô ích cũng là cải tiến, giống như bớt một ca kiểm thử vô nghĩa. Việc rà soát này cũng là dịp cập nhật phiên bản các bước dựng sẵn và công cụ kiểm tra, thay vì để chúng cũ dần rồi hỏng cùng lúc vào đúng hôm cần phát hành gấp.
Câu hỏi thường gặp
Dự án nhỏ một người làm có cần tích hợp liên tục không?
Cần ở mức tối thiểu: một quy trình chạy kiểm thử và phân tích tĩnh mỗi lần đẩy mã. Một người làm cùng trợ lý AI vẫn sinh ra nhiều thay đổi, và máy sạch bắt được lỗi môi trường mà máy cá nhân che mất. Dựng mất chưa tới một giờ.
Có nên để AI tự sửa khi CI đỏ không?
Có thể với tác tử được cấp quyền, nhưng đặt giới hạn số lần thử và cấm sửa cấu hình CI hay kiểm thử cũ. Người vẫn duyệt cuối. Với lỗi lặp lại nhiều lần, dừng tác tử và tự xem, vì nó có thể đang đoán vòng vòng.
Ngưỡng độ phủ kiểm thử có nên chặn gộp không?
Có thể dùng như lưới thô, ví dụ không cho độ phủ giảm so với nhánh chính. Đừng đặt con số cao rồi để AI viết kiểm thử chỉ để đạt số, vì độ phủ không đo được kiểm thử có kiểm gì hay không.
Nhật ký CI có thể chứa bí mật không?
Có, nếu một bước in biến môi trường hoặc chuỗi kết nối ra màn hình. Nền tảng thường che giá trị bí mật đã khai báo, nhưng không che được giá trị lấy từ nơi khác. Soát nhật ký trước khi dán cho AI hoặc chia sẻ.
Kiểm thử chập chờn nên xử lý thế nào?
Ghi nhận, cách ly khỏi phần chặn gộp nếu cần, và mở việc sửa có người nhận. Nguyên nhân hay gặp là phụ thuộc thời gian, thứ tự chạy, dữ liệu dùng chung giữa kiểm thử hoặc dịch vụ ngoài. Chạy lại cho qua chỉ giấu vấn đề.
Nhờ AI viết cấu hình CI từ đầu có ổn không?
Ổn với điều kiện bạn đọc từng dòng, đối chiếu phiên bản các bước dựng sẵn với tài liệu hiện hành, kiểm quyền và cách dùng bí mật. Chạy thử trên một nhánh riêng trước khi bật quy tắc chặn gộp cho cả nhóm.