Các bài trong khoáBài 18/30

30 bài

Domain 3: Claude Code Configuration & Workflows·Task 3.6

Đưa Claude Code vào pipeline CI/CD

Chạy Claude Code trong CI bằng cờ -p, lấy kết quả JSON theo schema để đăng comment lên PR, đưa context qua CLAUDE.md, và vì sao nên review bằng một phiên khác.

  • 7 phút đọc
  • Đối chiếu docs 02/11/2026
  • 4 nguồn

Đọc xong bạn nắm được

  • Chạy Claude Code trong CI bằng cờ -p để job không bị treo chờ nhập
  • Dùng --output-format json và --json-schema để lấy kết quả máy đọc được
  • Đưa quy ước test, fixture và tiêu chí review cho Claude qua CLAUDE.md
  • Tránh comment trùng khi review lại và tránh sinh test trùng với test đã có
  • Hiểu vì sao phiên viết code không nên tự review code của chính nó

CI/CD là hệ thống tự chạy kiểm tra mỗi khi có người đẩy code lên: chạy test, build, rồi báo kết quả lên pull request (PR). Đưa Claude Code vào đó, bạn có thể để nó tự review mọi PR hay tự viết thêm test. Nhưng trong CI không có ai ngồi gõ phím trả lời Claude, và kết quả phải ở dạng một script đọc được.

Bài này giúp bạn trả lời: chạy Claude Code trong pipeline thế nào cho khỏi treo, lấy kết quả ra sao để đăng lên PR, và đưa context dự án cho nó bằng cách nào?

Ví dụ xuyên suốt: review PR tự động cho website bán vé xem phim

Nhóm bạn làm website bán vé xem phim, code để trên GitHub. Bạn dựng một job CI để Claude Code review mọi PR và viết thêm test cho code mới. Bản đầu gặp năm chuyện:

  1. Job chạy claude "Review PR này, tìm lỗi bảo mật" rồi treo tới khi hết giờ. Log cho thấy Claude Code đang chờ người nhập.
  2. Kết quả là một đoạn văn dài. Script không tách được lỗi nào ở file nào, dòng nào để đăng comment vào đúng dòng code.
  3. Test Claude viết dùng dữ liệu tự bịa, không dùng các fixture (bộ dữ liệu mẫu) nhóm đã có, và có nhiều test chỉ kiểm những thứ hiển nhiên.
  4. Dev đẩy thêm commit sửa lỗi, job review chạy lại và đăng lại y nguyên những comment cũ, kể cả lỗi đã sửa.
  5. Có lúc nhóm cho cùng một phiên Claude vừa viết code vừa review, và nó gần như không tìm ra lỗi nào của chính mình.

Chạy không tương tác với cờ -p

Gõ claude "..." là mở chế độ trò chuyện: Claude trả lời xong thì chờ bạn gõ tiếp. Trong CI không ai gõ, nên job treo. Đó là vấn đề 1.

Thêm cờ -p (viết đầy đủ là --print): Claude Code chạy không tương tác (non-interactive mode), xử lý yêu cầu, in kết quả ra rồi thoát.

claude -p "Review PR này, tìm lỗi bảo mật"

Tài liệu Claude Code hiện gọi cách chạy này là chạy Claude Code bằng chương trình (trang "Run Claude Code programmatically"), xem như dùng Agent SDK qua dòng lệnh. Cờ vẫn là -p, và đề thi gọi đúng như vậy. Chạy thành công thì lệnh trả mã thoát 0, thất bại thì trả mã khác 0, nên CI biết job đạt hay không.

Vài cờ hay đi kèm trong CI:

CờLàm gì
--max-turns 10Dừng khi agent đã chạy đủ số vòng (chỉ ở chế độ -p)
--max-budget-usd 2.00Dừng khi chi phí ước tính chạm mức này (chỉ ở chế độ -p)
--allowedTools "Read,Grep"Các tool được chạy mà không cần hỏi
--append-system-prompt "..."Thêm chỉ dẫn vào cuối system prompt mặc định của Claude Code

Lưu ý --append-system-prompt khác --system-prompt: cờ sau thay toàn bộ system prompt mặc định, kể cả phần dạy Claude cách dùng tool đọc file, tìm code. Thay mất phần đó thì Claude có thể chỉ nhìn đoạn diff mà không chịu mở file nào.

Lấy kết quả có cấu trúc để đăng comment

Vấn đề 2 cần kết quả máy đọc được. Dùng hai cờ:

  • --output-format json: kết quả in ra là một đối tượng JSON, gồm result (câu trả lời), session_id, chi phí và các thông tin khác của lần chạy.
  • --json-schema: bạn đưa một JSON Schema, Claude Code kiểm kết quả theo schema đó và đặt nó vào trường structured_output.
claude -p "Review diff của PR, liệt kê lỗi" \
  --output-format json \
  --json-schema '{"type":"object","properties":{"loi":{"type":"array","items":{"type":"object","properties":{"file":{"type":"string"},"dong":{"type":"integer"},"mucDo":{"type":"string"},"moTa":{"type":"string"}},"required":["file","dong","moTa"]}}},"required":["loi"]}' \
  | jq '.structured_output.loi'

Mỗi lỗi có file và dong, nên script sau đó đăng được từng lỗi thành comment ngay tại dòng code trên PR (inline PR comments). Tài liệu dặn thêm: nếu lần chạy không ra được kết quả hợp lệ thì không có trường structured_output, nên script phải kiểm trường này có tồn tại trước khi dùng.

Đưa context dự án qua CLAUDE.md

Vấn đề 3 xảy ra vì Claude trong CI không biết nhóm viết test thế nào, có fixture gì, coi test nào là có giá trị. CLAUDE.md là chỗ đưa context dự án cho Claude Code chạy trong CI: quy ước test, quy ước fixture, tiêu chí review.

## Test
- Dùng fixture trong tests/fixtures/: suat-chieu.ts, ghe-ngoi.ts, ma-giam-gia.ts. Không tự tạo dữ liệu mẫu mới.
- Test có giá trị: luồng đặt vé, giữ ghế hết hạn, mã giảm giá hết lượt.
- Không viết test chỉ kiểm getter, setter hay giá trị mặc định.

Trang GitHub Actions của Claude Code cũng khuyên đặt quy tắc code, tiêu chí review và quy ước riêng của dự án trong CLAUDE.md ở gốc repo, và giữ file này ngắn gọn vì Claude đọc nó mỗi lần chạy.

Một chi tiết khi làm thật: tài liệu Claude Code khuyên thêm cờ --bare cho lệnh chạy bằng script để khởi động nhanh, và cho biết cờ này có thể thành mặc định của -p trong bản sau. Ở chế độ --bare, Claude Code không tự nạp CLAUDE.md, hook, skill hay MCP server. Nếu dùng --bare, bạn phải tự đưa nội dung CLAUDE.md vào, ví dụ qua --append-system-prompt-file. Trong đề thi, câu hỏi đưa quy ước dự án cho Claude trong CI thì đáp án là CLAUDE.md.

Review lại sau commit mới và sinh test không trùng

Vấn đề 4: lần review thứ hai không biết lần đầu đã nói gì. Cách sửa là đưa kết quả review trước vào context, và dặn Claude chỉ báo lỗi mới hoặc lỗi chưa được sửa. Lỗi đã sửa thì thôi, lỗi vẫn còn thì không đăng thêm một comment giống hệt.

Với test cũng vậy. Muốn Claude không đề xuất những ca test bộ test đã có, hãy đưa các file test hiện có vào context khi bảo nó viết test mới. Claude thấy datVe.spec.ts đã kiểm trường hợp hết ghế thì sẽ không viết lại ca đó.

Phiên khác để review

Vấn đề 5: một phiên Claude vừa viết code thì trong context của nó có đủ lý do vì sao code được viết như vậy. Khi tự review, nó đọc code với đúng những giả định đó, nên khó thấy chỗ sai. Đề thi gọi đây là tách biệt context giữa các phiên (session context isolation): một phiên review độc lập, không mang theo quá trình viết code, review hiệu quả hơn chính phiên đã viết ra code đó.

Trong pipeline, điều này có nghĩa là bước review chạy bằng một lệnh claude -p riêng, chỉ nhận diff, file liên quan và tiêu chí review, chứ không tiếp tục phiên đã sinh code.

Nguồn

  1. Exam Guide CCAR-F v1.0, Task Statement 3.6(mở tab mới)
  2. Run Claude Code programmatically (Claude Code)(mở tab mới)
  3. CLI reference (Claude Code)(mở tab mới)
  4. Claude Code GitHub Actions(mở tab mới)

Nắm rồi thì thử sức với đề

Xem khoá luyện thi
Đưa Claude Code vào pipeline CI/CD · Anthropic Exam Pro