Claude Certification Guide
0% chương trình học đã hoàn thành
3.6

Tích hợp CI/CD

Những điều bạn cần biết

Tích hợp Claude Code vào các pipeline CI/CD biến nó từ một công cụ tương tác dành cho developer thành một cỗ máy review và sinh code tự động. Đề thi kiểm tra năm khái niệm cụ thể trong task statement này, với flag -p là mục được kiểm tra trực tiếp nhất (đó là câu hỏi số 10 trong bộ câu hỏi mẫu).

Flag -p: chế độ không tương tác

Claude Code mặc định chạy ở chế độ tương tác — nó chờ input từ bàn phím và hiển thị giao diện dạng hội thoại. Trong một pipeline CI, không có bàn phím. Không có flag -p, job CI sẽ treo vô thời hạn, chờ input không bao giờ đến.

bashCopy

# WRONG — hangs in CI
claude "Analyse this pull request for security issues"
 
# CORRECT — runs non-interactively
claude -p "Analyse this pull request for security issues"

Flag -p (còn gọi là --print) chuyển Claude Code sang chế độ print: nó xử lý prompt, xuất kết quả ra stdout, và thoát. Không cần input tương tác.

Đây là một mục cần ghi nhớ. Đề thi đưa ra một kịch bản trong đó job CI bị treo, log cho thấy Claude đang chờ input, và bạn phải chọn cách sửa đúng. Câu trả lời là flag -p. Không phải CLAUDE_HEADLESS=true (không tồn tại). Không phải --batch (không tồn tại). Không phải redirect stdin từ /dev/null (không giải quyết đúng chế độ tương tác của Claude Code).

Khái niệm chính

Flag -p là sự kiện được kiểm tra trực tiếp nhất trong Domain 3. Đó là câu hỏi số 10 trong bộ câu hỏi mẫu chính thức. Khi bạn thấy một pipeline CI bị treo và log cho thấy Claude đang chờ input, câu trả lời luôn là -p.

Output có cấu trúc cho CI

Trong các pipeline CI, output của Claude Code phải có thể phân tích được bằng máy (machine-parseable). Không phải con người đọc output — các hệ thống tự động đang xử lý nó để đăng comment inline trên PR, cập nhật dashboard, hoặc kích hoạt các workflow tiếp theo.

Hai flag hoạt động cùng nhau:

  • --output-format json — ép output ở dạng JSON thay vì văn bản dễ đọc cho người
  • --json-schema — thực thi một cấu trúc JSON cụ thể cho output

bashCopy

claude -p \
  --output-format json \
  --json-schema '{"type":"object","properties":{"findings":{"type":"array","items":{"type":"object","properties":{"file":{"type":"string"},"line":{"type":"integer"},"severity":{"type":"string"},"message":{"type":"string"}}}}}}' \
  "Review this PR for security issues"

Output tuân theo schema được chỉ định, cho phép các hệ thống tự động:

  • Phân tích các phát hiện theo chương trình
  • Đăng các phát hiện dưới dạng comment inline tại đúng file và dòng
  • Lọc theo mức độ nghiêm trọng cho các kênh thông báo khác nhau
  • Theo dõi các phát hiện qua các lần review

Cô lập context giữa các phiên

Cùng một phiên Claude từng sinh ra code sẽ kém hiệu quả hơn khi review chính thay đổi của nó. Đây không phải là mối lo lý thuyết — đó là một hiệu ứng có thể đo lường được.

Tại sao tự review lại yếu hơn:

Khi Claude sinh code trong một phiên, nó xây dựng lên một context lý luận: tại sao nó chọn cách tiếp cận này, những đánh đổi nào nó đã cân nhắc, những phương án nào nó đã loại bỏ. Khi sau đó bạn yêu cầu nó review cùng đoạn code đó trong cùng phiên, nó vẫn giữ context lý luận đó. Nó ít có khả năng đặt câu hỏi về các quyết định mà nó đã tự biện minh cho chính mình.

Cách sửa: các phiên review độc lập

Dùng một lần gọi Claude Code riêng biệt để review — một lần gọi không có quyền truy cập vào context lý luận của phiên sinh code. Người review độc lập đánh giá code dựa trên giá trị tự thân của nó, không bị thiên vị bởi sự biện minh trước đó.

bashCopy

# Step 1: Generate code (session A)
claude -p "Implement the authentication middleware"
 
# Step 2: Review code (session B — independent, no shared context)
claude -p "Review the authentication middleware for security issues, error handling gaps, and edge cases"

Khái niệm này liên hệ với Domain 4 (kiến trúc review đa phiên) và Domain 5 (quản lý context). Đề thi kiểm tra nó cụ thể trong các kịch bản CI/CD.

Context review theo từng bước tăng dần

Các đợt review tự động chạy trên mỗi lần push. Không có context về các lần review trước, mỗi lần chạy phân tích toàn bộ PR từ đầu, nên nó suy ra lại cùng những phát hiện đó mỗi lần. Một vấn đề thực sự đã được sửa sẽ tự động biến mất, vì code đã thay đổi không còn kích hoạt nó nữa. Những vấn đề cứ lặp lại là những vấn đề mà developer đã thấy và chủ động chọn không thay đổi; một lần quét lại không có context không thể phân biệt chúng với các vấn đề mới, nên nó gắn cờ chúng lại mỗi lần push.

Cách sửa: đưa các phát hiện của lần review trước vào context và chỉ dẫn Claude chỉ báo cáo các vấn đề mới hoặc vẫn chưa được giải quyết.

bashCopy

claude -p \
  --output-format json \
  "Review this PR. Here are the findings from the previous review:
  ${PREVIOUS_FINDINGS}
 
  Report ONLY:
  1. New issues not in the previous findings
  2. Issues from the previous findings that are still present
 
  Do NOT re-report previous findings the developer has already reviewed and chosen not to act on."

Comment trùng lặp làm xói mòn lòng tin của developer. Nếu mỗi lần push đều tạo ra cùng năm comment bất kể developer đã sửa hay chưa, developer sẽ ngừng đọc comment. Context review theo từng bước tăng dần giữ được tỷ lệ tín hiệu trên nhiễu.

CLAUDE.md cho context CI

Khi Claude Code chạy trong CI, nó đọc các file CLAUDE.md của dự án giống hệt như trong chế độ tương tác. Điều này có nghĩa là CLAUDE.md là cơ chế để cung cấp context riêng của dự án cho Claude Code được gọi trong CI:

  • Chuẩn testing: điều gì tạo nên một test có giá trị, mẫu nào cần tuân theo, điều gì cần tránh
  • Fixture sẵn có: những fixture test nào tồn tại, cách dùng chúng, chúng chứa dữ liệu gì
  • Tiêu chí review: điều gì cấu thành một phát hiện nghiêm trọng so với một vấn đề style nhỏ
  • Độ bao phủ test hiện có: những gì đã được bao phủ, để tránh đề xuất các test trùng lặp

Không có context này trong CLAUDE.md, việc sinh test được gọi trong CI sẽ tạo ra boilerplate giá trị thấp. Có nó, các test được sinh ra tuân theo mẫu hình của nhóm và bổ sung độ bao phủ thực sự.

textCopy

# .claude/CLAUDE.md — CI-relevant section
## Testing Standards
 
- Tests must use the factory pattern from test/factories/ for data creation
- Integration tests connect to the test database via test/setup/db.ts
- Do not test private implementation details — test public API contracts
- Coverage target: 80% branch coverage for new code
- Available fixtures: test/fixtures/users.json, test/fixtures/orders.json

Tra cứu các flag CLI

Flag -p là flag được kiểm tra trực tiếp nhất, nhưng đề thi cũng yêu cầu bạn quen thuộc với các flag định hình một lần chạy headless: output được định dạng như thế nào, system prompt nào được dùng, và quyền cùng tool được giới hạn phạm vi ra sao. Các flag này hoạt động cùng claude -p trong CI và với lệnh claude tương tác.

Các flag system prompt. Claude Code cung cấp bốn flag ở đây, và đề thi kiểm tra sự phân biệt giữa append và replace:

FlagHiệu ứng
--system-prompt "<text>"Thay thế toàn bộ system prompt mặc định
--system-prompt-file <path>Thay thế prompt mặc định bằng nội dung một file
--append-system-prompt "<text>"Nối thêm văn bản vào prompt mặc định
--append-system-prompt-file <path>Nối thêm nội dung một file vào prompt mặc định

Dùng append khi Claude vẫn nên là một trợ lý coding nhưng cũng tuân theo các quy tắc bổ sung của bạn. Append giữ lại hướng dẫn tool mặc định, các hướng dẫn an toàn, và quy ước coding, nên bạn chỉ cần cung cấp phần khác biệt. Dùng replace khi danh tính hay mô hình quyền khác với Claude Code, như một agent không phải coding trong một pipeline không có ai giám sát. Replace loại bỏ toàn bộ prompt mặc định, nên bạn phải tự cung cấp mọi thứ tác vụ còn cần.

Output headless và giới hạn (chế độ print).

FlagHiệu ứng
--output-format text|json|stream-jsonHình dạng output cho -p; jsonstream-json có thể phân tích được bằng máy
--input-format text|stream-jsonHình dạng input cho -p
--json-schema '<schema>'Validate output cuối cùng theo một JSON Schema
--max-turns <n>Giới hạn số lượt agentic, sau đó thoát
--verboseOutput đầy đủ theo từng lượt

Quyền, tool, và context.

FlagHiệu ứng
--permission-mode <mode>Bắt đầu ở default, acceptEdits, plan, auto, dontAsk, hoặc bypassPermissions
--allowedTools "<rules>"Các tool chạy mà không cần nhắc xin quyền, ví dụ "Bash(git diff *)" "Read"
--disallowedTools "<rules>"Quy tắc deny; một tên tool trần loại bỏ hoàn toàn tool đó khỏi context
--tools "Bash,Edit,Read"Giới hạn hoàn toàn những tool tích hợp nào khả dụng
--add-dir <path>Thêm một thư mục mà Claude có thể đọc và chỉnh sửa (cấp quyền truy cập file, không phải khám phá cấu hình)
--model <alias|name>Đặt model cho phiên (sonnet, opus, hoặc một tên model đầy đủ)

Phiên và khởi động. -c / --continue tiếp tục cuộc hội thoại gần nhất trong thư mục hiện tại, và -r / --resume <id|name> tiếp tục một phiên cụ thể. --bare là chế độ tối giản: nó bỏ qua việc tự động phát hiện hook, skill, plugin, MCP server, auto memory, và CLAUDE.md để các lần gọi theo kịch bản khởi động nhanh hơn, chỉ để lại cho Claude các tool Bash và đọc/chỉnh sửa file. Dùng --bare khi bạn muốn một lần chạy theo kịch bản nhanh, dễ đoán và không cần nạp cấu hình dự án.

Cung cấp các test hiện có để tránh trùng lặp

Khi chạy việc sinh test trong CI, hãy đưa các file test hiện có vào context. Không có chúng, Claude Code có thể đề xuất các test đã tồn tại sẵn, làm lãng phí thời gian review của developer. Việc bao gồm các test hiện có cho phép Claude xác định các khoảng trống về độ bao phủ thay vì lặp lại các kịch bản đã có.

Batch API so với thời gian thực cho các workflow CI

Message Batches API mang lại mức tiết kiệm chi phí 50% nhưng có thời gian xử lý lên đến 24 giờ mà không có SLA về độ trễ đảm bảo. Điều này tạo ra một ranh giới quyết định rõ ràng:

Loại workflowLựa chọn APILý do
Kiểm tra trước khi merge (blocking)Real-time (đồng bộ)Developer chờ kết quả
Báo cáo nợ kỹ thuật qua đêmBatch APIKhông nhạy cảm về thời gian, tiết kiệm 50%
Kiểm toán code hàng tuầnBatch APITheo lịch, chấp nhận độ trễ
Sinh test hàng đêmBatch APIChạy qua đêm, xem lại vào sáng hôm sau

Các kiểm tra trước khi merge là các workflow chặn (blocking). Developer không thể merge cho đến khi kiểm tra hoàn tất. Batch API không phù hợp vì không có bảo đảm về độ trễ. Đề thi kiểm tra trực tiếp sự phân biệt này (Câu hỏi mẫu 11).

Bẫy thi

Bẫy thi: Pipeline CI bị treo vì Claude Code đang chờ input tương tác

Cách sửa là flag -p (--print). Không phải CLAUDE_HEADLESS=true (không tồn tại), không phải --batch (không tồn tại), không phải redirect stdin. Flag -p là phương pháp được tài liệu hóa cho việc thực thi không tương tác.

Bẫy thi: Cho rằng tự review trong cùng phiên hiệu quả tương đương review độc lập

Cùng một phiên vẫn giữ context lý luận từ lúc sinh code, khiến nó ít có khả năng đặt câu hỏi về các quyết định của chính nó. Một phiên review độc lập không có context đó hiệu quả hơn trong việc tìm ra vấn đề.

Bẫy thi: Dùng Batch API cho các kiểm tra CI trước khi merge

Message Batches API có thời gian xử lý lên đến 24 giờ mà không có SLA về độ trễ. Các kiểm tra trước khi merge là workflow chặn nơi developer chờ kết quả. Dùng API thời gian thực cho các kiểm tra chặn; dùng batch API cho phân tích qua đêm hoặc hàng tuần không chặn.

Bẫy thi: Không đưa các phát hiện của lần review trước vào các lần review tiếp theo

Không có context trước đó, mỗi lần review phân tích lại từ đầu và tạo ra comment trùng lặp. Hãy đưa vào các phát hiện trước đó và chỉ dẫn Claude chỉ báo cáo các vấn đề mới hoặc chưa được giải quyết để duy trì lòng tin của developer.

Tình huống luyện tập

Không tìm thấy câu hỏi luyện tập "q-3-6-001".

Bài tập thực hành

Thiết lập một Pipeline CI/CD với Claude Code

Bạn sẽ học được gì

  • Dùng flag -p để thực thi Claude Code không tương tác trong các pipeline CI
  • Cấu hình output JSON có cấu trúc với --output-format json và --json-schema
  • Triển khai cô lập context giữa phiên sinh code và phiên review
  • Thiết lập review theo từng bước tăng dần để loại bỏ các phát hiện trùng lặp qua các lần chạy
  • Cung cấp context dự án qua CLAUDE.md cho Claude Code được gọi trong CI

Các bước

Vì sao: Flag -p là sự kiện được kiểm tra trực tiếp nhất trong Domain 3. Không có nó, job CI sẽ treo vô thời hạn chờ input tương tác. Đây là câu hỏi số 10 trong bộ câu hỏi mẫu chính thức.

Bạn sẽ thấy: Một script CI (GitHub Actions YAML, GitLab CI, hoặc tương tự) gọi claude -p với một prompt review. Job hoàn tất thành công mà không bị treo. Output được in ra stdout và được hệ thống CI ghi lại.

Vì sao: Output CI phải có thể phân tích được bằng máy. Các hệ thống tự động cần JSON có cấu trúc để đăng comment inline trên PR, lọc theo mức độ nghiêm trọng, và theo dõi các phát hiện qua các lần chạy. Output văn bản dễ đọc cho người không thể được các công cụ downstream phân tích một cách đáng tin cậy.

Bạn sẽ thấy: Output của Claude Code là JSON hợp lệ tuân theo schema đã chỉ định. Mỗi phát hiện có các trường file, line, severity, và message. Output có thể được pipe qua jq hoặc phân tích bởi một script mà không có lỗi.

Vì sao: Comment inline tại đúng file và số dòng cung cấp phản hồi có thể hành động. Các comment chung chung ở cấp PR bị bỏ qua. Output JSON có cấu trúc giúp việc đăng comment inline chính xác trở nên khả thi.

Bạn sẽ thấy: Mỗi phát hiện từ output JSON xuất hiện dưới dạng một comment inline trên PR tại đúng file và số dòng. Các mức độ nghiêm trọng hiển thị rõ ràng. Developer có thể thấy phát hiện trong ngữ cảnh cùng với đoạn code mà nó tham chiếu đến.

Vì sao: Claude Code đọc CLAUDE.md trong CI giống hệt như trong chế độ tương tác. Không có context dự án, việc sinh test được gọi trong CI sẽ tạo ra boilerplate giá trị thấp. Có chuẩn testing và tài liệu fixture, các test được sinh ra sẽ tuân theo mẫu hình của nhóm.

Bạn sẽ thấy: File CLAUDE.md chứa một phần được đánh dấu rõ ràng liên quan đến CI với chuẩn testing, các đường dẫn fixture sẵn có, và tiêu chí về mức độ nghiêm trọng khi review. Claude Code được gọi trong CI tạo ra các test dùng các factory và fixture đã tài liệu hóa thay vì boilerplate chung chung.

Vì sao: Cùng một phiên từng sinh code sẽ kém hiệu quả hơn khi review nó vì nó vẫn giữ context lý luận thiên vị nó theo hướng ủng hộ các quyết định của chính nó. Các phiên review độc lập đánh giá code dựa trên giá trị tự thân mà không bị thiên vị bởi sự biện minh trước đó.

Bạn sẽ thấy: Hai lần gọi claude -p riêng biệt trong script CI: một cho việc sinh code và một cho việc review. Chúng không chia sẻ context phiên. Lần gọi review phân tích code đã sinh ra một cách độc lập. Các phát hiện từ review kỹ lưỡng hơn so với việc tự review trong cùng phiên.

Vì sao: Không có context theo từng bước tăng dần, mỗi lần review phân tích lại toàn bộ PR từ đầu và tạo ra comment trùng lặp. Comment trùng lặp làm xói mòn lòng tin của developer — khi cùng năm vấn đề xuất hiện trên mỗi lần push bất kể developer đã sửa hay chưa, developer sẽ ngừng đọc chúng.

Bạn sẽ thấy: Lần chạy review đầu tiên tạo ra các phát hiện và lưu trữ chúng (dưới dạng một artifact JSON hoặc file). Các lần chạy tiếp theo đưa các phát hiện trước đó vào context. Output chỉ chứa các vấn đề mới hoặc các vấn đề vẫn chưa được giải quyết. Các vấn đề đã sửa trước đó không xuất hiện lại dưới dạng comment.

Nguồn tham khảo