TÓM TẮT
Bruno không có tính năng đồng bộ hóa đám mây tích hợp. Các nhóm tìm cách khắc phục điều này bằng cách sử dụng kho lưu trữ Git, ổ đĩa mạng chia sẻ hoặc các vùng chứa phát triển (dev containers). Mỗi giải pháp thay thế đều có những hạn chế thực tế. Apidog giờ đây thu hẹp khoảng cách từ cả hai phía: chế độ Git ưu tiên đặc tả (Spec-First Git) mới của nó cho phép đặc tả OpenAPI nằm trong kho lưu trữ của bạn và di chuyển qua các yêu cầu kéo (pull requests), giống như Bruno, trong khi tính năng đồng bộ hóa đám mây tùy chọn bổ sung thêm khả năng cộng tác trực tiếp, quyền truy cập dựa trên vai trò, thông tin xác thực tập trung và một máy chủ giả lập (mock server) tích hợp sẵn. Bạn không còn phải chọn Git hoặc một không gian làm việc nhóm nữa.
Giới thiệu
Thiết kế chỉ hoạt động cục bộ của Bruno là một tính năng, không phải là một sự bỏ sót. Những người duy trì đã đưa ra một lựa chọn có chủ đích: dữ liệu của bạn nằm trên máy của bạn. Không có đám mây có nghĩa là không có tài khoản, không có đăng ký, không có nhà cung cấp nào giữ bộ sưu tập của bạn làm con tin.
Nhưng “chỉ cục bộ” tạo ra một vấn đề phối hợp ngay khi người thứ hai cần cùng một bộ sưu tập. Làm thế nào một nhóm năm nhà phát triển có thể chia sẻ các bộ sưu tập API? Làm thế nào một kỹ sư QA có được các yêu cầu mới nhất? Làm thế nào một nhân viên mới thiết lập môi trường của họ mà không cần sao chép tệp qua Slack?
Hướng dẫn này sẽ đi sâu vào từng giải pháp thay thế mà các nhóm sử dụng, chi phí thực tế của mỗi giải pháp, và giới hạn của chúng. Nó cũng đề cập đến một điều mới: chế độ Git ưu tiên đặc tả (Spec-First Git) của Apidog, cho phép bạn giữ triết lý "tệp trong kho lưu trữ" của Bruno và vẫn có được khả năng cộng tác trực tiếp mà chỉ riêng Git không thể mang lại. Nếu bạn muốn có cái nhìn tổng quan hơn trước, bài tổng hợp của chúng tôi về các công cụ API hoạt động với Git sẽ cung cấp bối cảnh.
Phương pháp Git (con đường được khuyến nghị)
Bruno được thiết kế xoay quanh Git. Các bộ sưu tập là các tệp .bru, môi trường là các tệp JSON, mọi thứ đều là văn bản thuần túy. Cơ chế chia sẻ được dự định là một kho lưu trữ Git.
Cách thức hoạt động:
- Tạo một kho lưu trữ Git cho bộ sưu tập API của bạn (hoặc sử dụng một thư mục bên trong kho lưu trữ hiện có của bạn)
- Đẩy bộ sưu tập lên GitHub, GitLab hoặc Bitbucket
- Các thành viên trong nhóm sao chép kho lưu trữ và mở thư mục trong Bruno
- Các thay đổi được commit và đẩy lên; những người khác kéo về
Ưu điểm:
- Lịch sử phiên bản đầy đủ trên mọi yêu cầu
- Các thay đổi API trải qua quy trình xem xét mã (code review)
- Tích hợp CI/CD tự nhiên (
bru runtrong pipeline của bạn) - Không yêu cầu dịch vụ bên thứ ba nào ngoài máy chủ Git của bạn
- Về lý thuyết, hoạt động với mọi quy mô nhóm
Nhược điểm:
- Các thành viên trong nhóm không thành thạo Git gặp khó khăn với quy trình làm việc này
- Các thay đổi không trực tiếp. Bạn đẩy lên, những người khác phải kéo về thủ công
- Các giá trị bí mật (token, mật khẩu) không được commit, vì vậy bạn cần một cơ chế riêng biệt
- Xung đột hợp nhất (merge conflicts) xảy ra khi hai người chỉnh sửa cùng một yêu cầu
- Không có cách nào để cấp quyền truy cập chỉ đọc cho những người không phải nhà phát triển mà không có tài khoản Git
Phù hợp với: các nhóm chỉ gồm nhà phát triển với kỷ luật Git nhất quán. Nó phù hợp với 2-8 nhà phát triển đã làm việc trong Git cho mọi thứ khác. Mô hình này khớp với phương pháp kiểm soát phiên bản OpenAPI bằng Git rộng hơn.
Phương pháp ổ đĩa mạng chia sẻ
Một số nhóm đặt thư mục bộ sưu tập Bruno của họ trên một ổ đĩa mạng chia sẻ: một NAS, một máy chủ tệp mạng, một Dropbox chia sẻ hoặc một thư mục Google Drive.
Cách thức hoạt động: Bruno mở các bộ sưu tập từ bất kỳ đường dẫn thư mục nào. Chỉ nó vào vị trí ổ đĩa chia sẻ.
Ưu điểm:
- Thiết lập dễ dàng, không yêu cầu Git
- Tất cả thành viên trong nhóm nhìn thấy cùng các tệp
- Hoạt động cho những người không phải nhà phát triển không thể sử dụng Git
Nhược điểm:
- Không có lịch sử phiên bản, hoặc lịch sử phiên bản kém nếu bạn sử dụng Dropbox hoặc Drive
- Hai người mở cùng một bộ sưu tập cùng lúc có thể làm hỏng hoặc ghi đè tệp
- Ổ đĩa mạng chậm hơn các tệp cục bộ; các bộ sưu tập lớn sẽ cảm thấy ì ạch
- Không có kiểm soát truy cập nào ngoài quyền của hệ thống tệp
- Các giá trị bí mật vẫn cần quản lý riêng biệt
- Không hoạt động khi các thành viên trong nhóm ngoại tuyến hoặc kết nối không ổn định
Phù hợp với: các nhóm nhỏ gồm 2-3 người hiếm khi chỉnh sửa cùng lúc và cần chia sẻ mà không dùng Git. Không khuyến nghị cho việc sử dụng ngoài mục đích thông thường.
Phương pháp Gitpod / vùng chứa phát triển (dev container)
Một số nhóm đặt các bộ sưu tập Bruno của họ vào một không gian làm việc Gitpod hoặc định nghĩa vùng chứa phát triển (dev container), để mọi người có được một môi trường nhất quán bao gồm cả bộ sưu tập.

Cách thức hoạt động: bộ sưu tập nằm trong kho lưu trữ. Gitpod hoặc một vùng chứa phát triển (dev container) khởi động cùng với Bruno (hoặc Bruno CLI) và bộ sưu tập được tải sẵn.
Ưu điểm:
- Môi trường nhất quán cho mọi nhà phát triển
- Bộ sưu tập luôn khớp với cơ sở mã mà nó kiểm thử
- Không cần thiết lập cục bộ. Sao chép và khởi động vùng chứa phát triển
Nhược điểm:
- Vẫn dựa trên Git; người dùng không dùng Git không được hưởng lợi
- Giao diện người dùng đồ họa (GUI) Bruno dành cho máy tính để bàn không chạy trong môi trường phát triển đám mây (hầu hết các thiết lập vùng chứa chỉ cung cấp cho bạn CLI không có giao diện đồ họa)
- Đồng bộ hóa thời gian thực vẫn chưa tồn tại
Phù hợp với: các nhóm đã sử dụng Gitpod hoặc vùng chứa phát triển (dev containers) và muốn tích hợp kiểm thử API vào môi trường phát triển.
Phương pháp sao chép riêng lẻ cho từng nhà phát triển
Đây là lựa chọn ít có cấu trúc nhất: mỗi nhà phát triển giữ bộ sưu tập Bruno riêng của họ và tự động đồng bộ hóa nó với các tài liệu chia sẻ hoặc sao chép từ bản xuất của đồng đội.
Ưu điểm:
- Quyền tự chủ hoàn toàn, không cần phối hợp
- Nhanh chóng đối với một nhà phát triển cá nhân
Nhược điểm:
- Các bộ sưu tập ngay lập tức khác biệt
- Không có nguồn sự thật chung
- “Bộ sưu tập API của nhóm” trở nên vô nghĩa khi mỗi người có một phiên bản khác nhau
- Chi phí bảo trì tăng nhanh chóng
Phù hợp với: không phù hợp với ai ngoài một nhà phát triển độc lập. Mô hình này nhanh chóng tạo ra nợ kỹ thuật.
Những giới hạn mà mọi giải pháp thay thế đều có
Tất cả các giải pháp đồng bộ hóa của Bruno đều có những khoảng trống giống nhau, và Git không thể khắc phục được chúng:
Không có khả năng cộng tác thời gian thực. Trong Apidog, hoặc trong gói trả phí của Postman, hai người mở cùng một bộ sưu tập và thấy các thay đổi của nhau ngay lập tức. Với Bruno và Git, Alice và Bob luôn làm việc dựa trên lần kéo (pull) cuối cùng của họ. Nếu Alice thêm một yêu cầu và đẩy lên, Bob sẽ không thấy gì cho đến khi anh ấy kéo về. Trong một phiên API đang hoạt động, điều đó tạo ra sự bất tiện liên tục.
Không có quyền truy cập dựa trên vai trò. Quyền Git (đọc hoặc ghi ở cấp độ kho lưu trữ) không ánh xạ tới các vai trò của bộ sưu tập API. Bạn không thể biến một bên liên quan thành người xem, người có thể chạy yêu cầu nhưng không thể chỉnh sửa chúng. Bạn không thể giới hạn một nhà thầu vào các thư mục cụ thể. Quyền truy cập trong Bruno là tất cả hoặc không có gì cho mỗi kho lưu trữ.
Không có thông tin xác thực môi trường được chia sẻ. Các biến bí mật của Bruno không được commit, đây là hành vi bảo mật đúng. Nhưng điều đó có nghĩa là mỗi đồng đội phải thiết lập thông tin xác thực thủ công, và khi một token thay đổi, bạn cần một quy trình bên ngoài để thông báo cho mọi người cập nhật cục bộ. Các công cụ có môi trường đám mây an toàn xử lý vấn đề này một cách tập trung.
Không có bình luận ở cấp độ bộ sưu tập. Bạn không thể để lại một ghi chú trên một yêu cầu cụ thể để đồng đội xem. Bình luận trên PR của Git khá gần, nhưng chúng gắn liền với một bản khác biệt (diff), không phải bộ sưu tập trực tiếp.
Bốn khoảng trống này là lý do thực sự khiến các nhóm vượt ra khỏi các giải pháp thay thế. Phần tiếp theo là cách Apidog khắc phục chúng mà không buộc bạn phải từ bỏ Git.
Chế độ Git ưu tiên đặc tả (Spec-First Git) của Apidog: quy trình làm việc Git mà không cần giải pháp thay thế
Cách nhìn nhận thông thường đặt “Bruno cộng với Git” đối lập với “một công cụ đám mây.” Chế độ Git ưu tiên đặc tả (Spec-First Git) của Apidog loại bỏ sự lựa chọn đó. Nó cho phép đặc tả OpenAPI nằm trong kho lưu trữ GitHub, GitLab hoặc kho lưu trữ tự quản lý của riêng bạn như một nguồn sự thật duy nhất, sau đó thêm các tính năng nhóm lên trên cùng kho lưu trữ đó.

Đây là những thay đổi so với thiết lập Bruno-cộng-với-Git.
Đặc tả là nguồn sự thật duy nhất, và nó nằm trong kho lưu trữ của bạn. Bạn kết nối một dự án Apidog với một kho lưu trữ Git và định nghĩa API đồng bộ hóa dưới dạng các tệp. Tạo nhánh cho mỗi tính năng, mở một yêu cầu kéo (pull request), xem xét sự khác biệt của hợp đồng từng dòng một, và hợp nhất. Đây là quy trình xem xét chính xác mà Bruno cho phép, được áp dụng cho một tài liệu OpenAPI hoàn chỉnh thay vì các tệp yêu cầu .bru rời rạc. Để biết lý do đằng sau phương pháp thiết kế ưu tiên (design-first), hãy xem Phát triển API ưu tiên đặc tả là gì?.
Thiết kế, kiểm thử, giả lập và tài liệu đều xuất phát từ một định nghĩa duy nhất. Khi đặc tả thay đổi trên một nhánh, máy chủ giả lập, các phản hồi ví dụ, các trường hợp kiểm thử và các tài liệu tham khảo được xuất bản đều thay đổi theo, và toàn bộ được commit dưới dạng một bản khác biệt có thể xem xét. Với Bruno, bạn nhận được các tệp yêu cầu; tài liệu và giả lập là vấn đề của người khác. Đây là cốt lõi của phương pháp đặc tả như mã (spec-as-code), và đây là nơi một tệp OpenAPI duy nhất thực hiện công việc mà bốn công cụ riêng biệt từng làm.
Bạn giữ lại Git, và bạn có thêm cộng tác trực tiếp. Đây là phần mà không giải pháp thay thế nào của Bruno có thể sánh được. Kho lưu trữ vẫn là hệ thống ghi nhận, nhưng các đồng đội làm việc trong ứng dụng Apidog thấy các chỉnh sửa của nhau theo thời gian thực thay vì chờ đợi lần kéo (pull) tiếp theo. Git cung cấp cho bạn lịch sử và khả năng xem xét; không gian làm việc chia sẻ cung cấp cho bạn phiên trực tiếp. Bạn không còn phải lựa chọn giữa chúng nữa.
Quyền truy cập dựa trên vai trò nằm trên kho lưu trữ. Các vai trò người xem, người chỉnh sửa và quản trị viên cho phép một bên liên quan chạy yêu cầu mà không chỉnh sửa chúng, hoặc giới hạn một nhà thầu vào các dự án cụ thể, điều mà các quyền Git cấp kho lưu trữ không thể thể hiện được.
Thông tin xác thực được quản lý tập trung. Môi trường đám mây chứa các biến được chia sẻ (và lưu trữ an toàn), vì vậy việc thay đổi token chỉ cần cập nhật một lần thay vì thông báo cho mọi nhà phát triển để chỉnh sửa tệp .secret.json cục bộ.
Một máy chủ giả lập được cung cấp sẵn. Bruno không có máy chủ giả lập, đó là lý do tại sao các nhóm tìm kiếm một giải pháp thay thế máy chủ giả lập Bruno. Trong Apidog, giả lập đến trực tiếp từ đặc tả, vì vậy công việc frontend bắt đầu ngay từ ngày đầu tiên với một phản hồi thực tế.
Nó chạy trong CI. Apidog cung cấp một trình chạy CLI, vì vậy các trường hợp kiểm thử liên kết với đặc tả đã đồng bộ của bạn sẽ thực thi trong cùng một pipeline như bru run, trên mỗi lần đẩy lên (push).
Một so sánh ngắn gọn, trung thực:
| Khả năng | Bruno + Git | Chế độ Git ưu tiên đặc tả của Apidog |
|---|---|---|
| Tệp trong kho lưu trữ của riêng bạn | Có (.bru) |
Có (đặc tả OpenAPI) |
| Xem xét nhánh + yêu cầu kéo | Có | Có |
| Trình chạy CI | Có (bru run) |
Có (Apidog CLI) |
| Hỗ trợ tự quản lý / GitLab | Có | Có |
| Chỉnh sửa đa người dùng trực tiếp | Không | Có |
| Truy cập dựa trên vai trò (người xem/người chỉnh sửa) | Không | Có |
| Thông tin xác thực chia sẻ tập trung | Không | Có |
| Máy chủ giả lập từ đặc tả | Không | Có |
| Tài liệu + kiểm thử xuất phát từ một tệp | Không | Có |
Chế độ Git ưu tiên đặc tả đang trong giai đoạn thử nghiệm (beta), vì vậy hãy xác nhận các chi tiết cụ thể với thiết lập GitHub hoặc GitLab của riêng bạn trong một bản dùng thử trước khi bạn di chuyển toàn bộ nhóm. Để biết hướng dẫn chi tiết hơn về kết nối, hãy xem Tích hợp và đồng bộ Git của Apidog và hướng dẫn Chế độ ưu tiên đặc tả. Nếu bạn đang cân nhắc điều này so với một bộ công cụ thiết kế và kiểm thử hai công cụ, bài viết Stoplight + Postman so với Apidog sẽ đưa ra đánh giá tương tự.
Khi nào nên tiếp tục dùng Bruno, và khi nào nên chuyển đổi
Bruno cộng với Git hoạt động hiệu quả. Đối với đúng nhóm, nó hoạt động rất tốt. Vấn đề là khi nào chi phí tích lũy của các giải pháp thay thế vượt qua giá trị của sự đơn giản của Bruno.
Hãy tiếp tục sử dụng Bruno khi toàn bộ nhóm của bạn là các nhà phát triển, mọi người đều thành thạo Git, bạn không cần đồng bộ hóa trực tiếp và một mô hình quyền truy cập kho lưu trữ kiểu tất cả hoặc không có gì là ổn.
Chuyển sang chế độ Git ưu tiên đặc tả của Apidog khi:
- Bạn có các thành viên trong nhóm không phải nhà phát triển cần truy cập API mà không cần học Git
- Nhóm của bạn có 5 người trở lên và việc phối hợp chỉ bằng Git đã trở thành rắc rối hàng ngày
- Bạn cần đồng bộ hóa trực tiếp trong các phiên API đang hoạt động
- Bạn cần kiểm soát truy cập ở cấp độ dự án hoặc thư mục, không chỉ ở kho lưu trữ
- Bạn mệt mỏi với việc phân phối thông tin xác thực thủ công mỗi khi một token thay đổi
- Bạn cần một máy chủ giả lập bên cạnh client API của mình
Vì đặc tả vẫn nằm trong kho lưu trữ của bạn, đây không phải là một con đường một chiều rời xa kiểm soát phiên bản. Bạn giữ lại quy trình làm việc Git mà Bruno đã dạy bạn và thêm lớp nhóm lên trên.
Thiết lập quy trình làm việc Bruno + Git thực sự hiệu quả
Nếu bạn tiếp tục sử dụng Bruno, đây là một bố cục giúp giảm thiểu rắc rối:
Cấu trúc kho lưu trữ:
api-collections/
.gitignore # loại trừ *.secret.json, .env
README.md # hướng dẫn dành cho người mới
environments/
local.json
staging.json
production.json # không có bí mật, chỉ có tên biến
users-api/
get-user.bru
create-user.bru
orders-api/
create-order.bru
list-orders.bru
bruno.json
Quản lý thông tin xác thực: sử dụng environments/production.secret.json (bị Git bỏ qua) cho các bí mật cục bộ. Ghi lại các biến bắt buộc trong environments/production.json với các giá trị trống làm mẫu. Lưu trữ các giá trị thực trong trình quản lý mật khẩu hoặc kho bí mật của nhóm bạn, kèm theo một liên kết trong tệp README.
Hướng dẫn nhà phát triển mới:
- Sao chép kho lưu trữ
- Mở thư mục bộ sưu tập trong Bruno
- Sao chép
production.jsonsangproduction.secret.json - Điền thông tin xác thực từ kho bí mật (được liên kết trong README)
- Sẵn sàng sử dụng
CI/CD: chèn các biến môi trường vào thời gian chạy, để không có tệp bí mật nào nằm trong kho lưu trữ.
Lập trường không đám mây của Bruno có nguyên tắc và mang lại lợi ích thực sự, và các giải pháp đồng bộ hóa vẫn có thể chấp nhận được đối với đúng nhóm. Việc biết các giới hạn của chúng sẽ cho bạn biết khi nào nên dựa vào chúng và khi nào nên tìm đến một công cụ được xây dựng cho việc cộng tác nhóm. Với việc Apidog giờ đây giữ đặc tả trong kho lưu trữ của bạn, việc tìm đến một công cụ khác không còn có nghĩa là bỏ lại Git phía sau nữa. Tải Apidog và trỏ nó vào kho lưu trữ hiện có của bạn để thấy sự khác biệt trên API của riêng bạn.
