Đưa agent vào CI/CD: chạy tự động, cost và human-in-the-loop
Agent chạy tay trên máy bạn thì hay, nhưng giá trị thật là khi nó tự làm việc trong pipeline mỗi khi có code mới. Bài này ghép agent vào CI/CD, kiểm soát chi phí token, và đặt chốt con người đúng chỗ.
Chọn trigger đúng: đừng chạy trên mọi thứ
Sinh test tốn token và thời gian. Chạy agent trên toàn repo mỗi commit là lãng phí. Trigger hợp lý:
- Chỉ trên file thay đổi trong pull request (diff-based).
- Chỉ khi coverage giảm dưới ngưỡng.
- Chỉ cho code mới chưa có test.
# .github/workflows/test-agent.yml
name: test-agent
on: pull_request
jobs:
gen-tests:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Files changed
run: git diff --name-only origin/main > changed.txt
- name: Run test agent on changed files
run: python agent.py --files changed.txt --max-cost 0.50
- name: Open PR with generated tests
run: gh pr create --title "test: agent-generated" ...
Điểm mấu chốt: agent mở PR với test mới, không commit thẳng vào nhánh chính.
Kiểm soát chi phí (cost guardrails)
Agent lặp = nhiều lời gọi LLM = tiền. Đặt trần cứng:
- Trần chi phí mỗi lần chạy (
--max-cost): vượt thì dừng và báo. - Trần số vòng lặp (
max_iters): tránh lặp vô hạn khi gặp bug thật. - Cache context: file không đổi thì không gom lại context.
- Model phân tầng: model rẻ cho sinh test đơn giản, model mạnh chỉ khi refine phức tạp.
- Batch hợp lý: gom nhiều hàm nhỏ vào một lần gọi thay vì mỗi hàm một request.
if run_cost > MAX_COST:
report("Đạt trần chi phí, dừng an toàn")
exit_gracefully()
Human-in-the-loop: chốt con người ở đâu
Agent sinh test, con người duyệt trước khi merge. Vì sao? Test agent sinh có thể:
- Khẳng định một hành vi sai là đúng (lock-in bug).
- Assertion trùng khớp bug hiện tại thay vì hành vi đúng mong đợi.
- Quá khớp cài đặt (test brittle, đổi refactor là vỡ).
Các bước tích hợp CI/CD
- Chạy agent trên diff của PR, không phải toàn repo.
- Chạy trong runner cô lập, có sandbox như Bài 2.
- Đặt trần cost + trần vòng lặp; dừng an toàn khi vượt.
- Agent mở PR test, gắn kèm báo cáo coverage + mutation score.
- Bắt buộc review con người trước merge; không auto-merge test.
- Ghi log mỗi lần chạy: chi phí, số test sinh, coverage delta để theo dõi ROI.
- Thêm cổng: nếu mutation score dưới ngưỡng, PR bị đánh dấu "cần bổ sung".
Checklist sẵn sàng production
- [ ] Trigger theo diff, không toàn repo.
- [ ] Có trần chi phí và trần vòng lặp.
- [ ] Sandbox cô lập trong CI.
- [ ] Agent mở PR, không commit thẳng main.
- [ ] Review con người là bắt buộc.
- [ ] Log cost + coverage delta mỗi lần.
Khung tư duy: "Agent đề xuất, con người quyết định"
Trong sinh test, sai lầm nguy hiểm nhất không phải test fail — mà là test pass sai, khóa cứng một bug vào suite. Vì thế mọi test agent sinh đều là đề xuất, và con người là người quyết định merge. Tự động hóa việc sinh, đừng tự động hóa việc tin.
Sai lầm thường gặp
- Auto-merge test agent sinh: khóa cứng bug, mất luôn giá trị của test.
- Chạy trên toàn repo mỗi commit: đốt token, CI chậm, chi phí phình.
- Không có trần cost: một PR lỗi khiến agent lặp và tiêu hết ngân sách tháng.
- Không log ROI: không biết agent tiết kiệm hay tốn tiền, không thuyết phục được sếp duy trì.
- Bỏ chốt review: reviewer bấm approve mù vì "test do AI viết chắc ổn".