1. Vì sao pact file rải rác là không đủ
Khi mới bắt đầu, ta chép tay pact file từ consumer sang provider. Cách này sập ngay khi hệ thống lớn lên: một nền tảng SaaS đa tenant có thể có hàng chục dịch vụ, mỗi cặp consumer–provider lại có nhiều version đang chạy ở các môi trường khác nhau. Câu hỏi thật sự cần trả lời không phải 'file pact ở đâu' mà là 'version consumer tôi sắp deploy có tương thích với version provider đang chạy production không'. Không một file tĩnh nào trả lời được câu này; ta cần một nơi tập trung ghi nhớ mọi pact, mọi version, và mọi kết quả verify.
Pact Broker là hạ tầng đó. Nó là một dịch vụ lưu trữ pact được publish, gắn mỗi pact với version và tag của consumer, nhận kết quả verify từ provider, và từ đó xây một ma trận tương thích. Trên nền ma trận này, Broker cung cấp câu trả lời 'có/không' cho câu hỏi deploy — biến contract testing từ một bộ test rời rạc thành một cơ chế điều phối release an toàn cho cả tổ chức.
2. Kiến trúc Pact Broker
Về mặt kiến trúc, Pact Broker là một ứng dụng web có database (thường PostgreSQL) lưu bốn nhóm dữ liệu: các pact đã publish, các version và tag của consumer/provider, các kết quả verification, và các bản ghi deployment/release. Consumer CI đẩy pact lên; provider CI kéo pact về, verify, rồi đẩy kết quả lên. Có thể tự host bằng Docker image chính thức, hoặc dùng bản quản lý PactFlow. Với đội nhỏ, một container Broker + một PostgreSQL là đủ để bắt đầu.
# docker-compose.yml — Pact Broker tự host tối thiểu
services:
postgres:
image: postgres:16
environment: { POSTGRES_USER: pact, POSTGRES_PASSWORD: pact, POSTGRES_DB: pact }
broker:
image: pactfoundation/pact-broker:latest
ports: ["9292:9292"]
depends_on: [postgres]
environment:
PACT_BROKER_DATABASE_URL: "postgres://pact:pact@postgres/pact"
PACT_BROKER_BASIC_AUTH_USERNAME: admin
PACT_BROKER_BASIC_AUTH_PASSWORD: ${BROKER_PASSWORD}3. Publish pact kèm version & tag
Sau khi test consumer sinh ra pact, bước publish đẩy nó lên Broker cùng hai mẩu metadata quan trọng: consumer version (nên là git sha để truy vết) và branch/tag (ví dụ nhánh main hay môi trường). Tag là cách Broker biết một version đang 'ở đâu' trong vòng đời — nhờ tag, câu hỏi 'consumer nào đang chạy production' có câu trả lời chính xác. Việc publish thường dùng CLI pact-broker hoặc lệnh tích hợp trong thư viện.
# publish pact với version = git sha và gắn branch hiện tại
pact-broker publish ./pacts \
--consumer-app-version "$GIT_SHA" \
--branch "$GIT_BRANCH" \
--broker-base-url "$PACT_BROKER_URL" \
--broker-token "$PACT_BROKER_TOKEN"
# ví dụ: consumer 'wallet-web' version a1b2c3 trên branch main
💬 Bình luận (0)
Chưa có bình luận nào. Hãy là người đầu tiên!