Môi trường xem trước và môi trường thực tế: quy trình phát hành an toàn
Preview vs production: quy trình đơn giản để tạo URL xem trước cho từng tính năng, promote an toàn lên production và rollback nhanh khi có sự cố.

Môi trường xem trước và production nghĩa là gì (không dùng thuật ngữ khó hiểu)
Môi trường xem trước là một bản sao tạm thời của app mà bạn có thể mở trong trình duyệt và chia sẻ với người khác. Nó được cô lập, nên những thay đổi ở đó không ảnh hưởng tới app đang chạy. Hãy nghĩ nó như một giai đoạn thực hành an toàn, nơi một tính năng mới có thể được nhìn và thử trước khi đưa tới mọi người.
Một thiết lập phổ biến là một URL xem trước cho mỗi tính năng hoặc mỗi thay đổi. Điều đó giúp phản hồi đơn giản: bạn gửi một liên kết cho đồng nghiệp, khách hàng, hoặc chính bạn vào ngày mai, và mọi người đang nhìn đúng cùng một phiên bản.
Production là ứng dụng thật. Đó là thứ người dùng thật thấy, với tài khoản thật, thanh toán thật, dữ liệu thật, và kỳ vọng thật. Nếu cái gì đó hỏng ở production, đó không chỉ là phiền toái — có thể gây mất doanh thu, ticket hỗ trợ, hoặc lỗi dữ liệu.
Tên gọi nghe có vẻ kỹ thuật, nhưng ý tưởng đơn giản: preview để thử nghiệm, production để phục vụ.
Các app được xây dựng bằng chat vẫn cần các bước an toàn giống vậy vì rủi ro không thay đổi. Ngay cả khi bạn tạo app bằng việc chat với nền tảng như Koder.ai, bạn vẫn đang phát hành mã chạy trên trình duyệt và tương tác với cơ sở dữ liệu. Một thay đổi nhỏ (như một trường form hay một truy vấn DB) có thể gây hậu quả lớn khi có lưu lượng thực.
Khi bạn dùng preview hiệu quả, bạn nhận phản hồi nhanh mà không làm vỡ app trực tiếp. Bạn có thể xem tính năng trong ngữ cảnh, phát hiện lỗi rõ ràng sớm, và chỉ khi mọi thứ ổn mới promote thay đổi lên production.
Vấn đề thực sự: thay đổi thì dễ, phát hành thì rủi ro
Xây một tính năng trong công cụ chat có thể gần như ngay lập tức. Rủi ro xuất hiện sau đó, khi thay đổi đó phải chạy trên hạ tầng thật, gọi các dịch vụ thật, và phục vụ người dùng thật. Đó là lý do preview vs production không chỉ là lựa chọn hosting — đó là cách giảm bất ngờ.
Hầu hết vấn đề phát hành không phải là “mã tệ”. Chúng là sự không khớp giữa những gì bạn đã kiểm thử và những gì người dùng thực tế gặp sau khi deploy. Một trang có thể hiển thị hoàn hảo trong preview nhưng vẫn bị lỗi ở production vì production có cài đặt khác, dữ liệu khác, và luật bảo mật nghiêm ngặt hơn.
Những vấn đề lặp lại thường gặp:
- Giao diện vỡ do asset bị cache, vấn đề responsive, hoặc thiếu cài đặt lúc build
- Thiếu hoặc sai biến môi trường (API keys, OAuth redirect, base URL)
- Thay đổi database không tương thích với dữ liệu thực (migration, ràng buộc, bản ghi cũ)
- Vấn đề auth và quyền (role, session, cookie, cài đặt domain)
- Tích hợp thất bại (thanh toán, email, webhook, giới hạn tần suất)
Preview là nơi bạn xác nhận hành vi và luồng người dùng mà không mạo hiểm với khách hàng. Chúng hữu ích để kiểm tra layout, điều hướng cơ bản, xác thực form, và liệu một tính năng có hoạt động end-to-end với dữ liệu thử hay không.
Một số thứ khó kiểm chứng hoàn toàn trong preview trừ khi bạn có staging giống production: hành vi trên domain cuối cùng và cookie, nhà cung cấp thanh toán live, gửi email thật, và hiệu năng dưới tải thực tế. Những thứ đó phụ thuộc vào cấu hình production và tích hợp thật.
Mục tiêu là một quy trình phát hành có thể lặp lại. Trên Koder.ai, ví dụ, bạn có thể khởi tạo một URL xem trước cho một tính năng, xem lại cùng đồng đội, rồi promote chính bản build đó lên production sau vài kiểm tra nhỏ. Và khi có lỗi lọt qua, bạn cần con đường rollback nhanh để một phát hành tệ không thành sự cố kéo dài.
Thiết kế chiến lược URL xem trước
Một thiết lập preview tốt trả lời bốn câu hỏi nhanh: thay đổi gì, xem ở đâu, tôi đang nhìn phiên bản nào, và ai được phép mở nó.
1) Đặt tên preview sao cho dễ hiểu
Làm cho URL (hoặc nhãn subdomain) khớp cách nhóm bạn nói về công việc: tên tính năng hoặc ID ticket. Giữ ngắn, nhất quán, và an toàn để dán vào chat.
prv-<ticket>-<short-feature>(ví dụ:prv-482-checkout-tax)- chỉ dùng chữ thường và dấu gạch ngang
- thêm tag chủ sở hữu khi hữu ích (ví dụ:
prv-482-checkout-tax-alex) - coi
mainvàprodlà từ được giữ
Nếu bạn dùng Koder.ai, ghép mỗi URL xem trước với một snapshot giúp giữ preview ổn định ngay cả khi công việc tiếp tục sau đó.
2) Liên kết mỗi preview với một phiên bản cụ thể
Một preview nên trỏ tới một build và cấu hình duy nhất, không phải “cái mới nhất”. Thường nghĩa là một URL preview = một snapshot (hoặc phiên bản giống commit).
Khi có phản hồi, cập nhật preview theo cách hiển thị: tạo snapshot mới và chuyển preview sang snapshot đó (hoặc tạo URL preview mới). Tránh thay đổi ngầm nội dung mà một link đã chia sẻ đang hiển thị.
3) Quyết định preview dùng dữ liệu gì
Chọn một mặc định và ghi lại:
- Dữ liệu mẫu phù hợp cho đánh giá UI và demo.
- Bản sao production đã che phù hợp cho các trường hợp biên thực tế (với biện pháp bảo mật).
- Cơ sở dữ liệu trống phù hợp cho flow onboarding và kiểm tra migration.
4) Thiết lập quy tắc truy cập đơn giản
Preview thường bị lộ qua ảnh chụp màn hình và tin nhắn chuyển tiếp. Dùng quy tắc rõ ràng như “chỉ team trừ khi được chia sẻ” và thực thi bằng các kiểm soát cơ bản (yêu cầu đăng nhập, allowlist, hoặc mật khẩu chia sẻ).
Cũng quyết định thời hạn sống của preview (ví dụ: xóa sau merge) để URL cũ không gây nhầm lẫn cho người xem.
Từng bước: tạo một preview cho mỗi tính năng và review nó
Một thiết lập preview tốt giữ mọi thay đổi tách biệt. Một tính năng có một URL, nên người review không bao giờ phải đoán phiên bản họ đang thấy.
1) Bắt đầu từ nền tảng ổn định
Bắt đầu từ điểm ổn định nhất: nhánh main nếu giữ sạch, hoặc release production gần nhất nếu main lộn xộn. Điều này giữ preview tập trung vào tính năng, không phải những thay đổi không liên quan.
2) Tạo workspace cho tính năng và sinh preview
Tạo workspace dành riêng cho tính năng (ví dụ: “billing-copy-update” hoặc “new-onboarding-step”). Triển khai workspace đó lên môi trường xem trước và coi URL preview là “nhà” của tính năng.
Nếu bạn dùng công cụ chat như Koder.ai, workflow ở bước này sẽ tự nhiên: xây tính năng trong không gian riêng, rồi xuất hoặc triển khai preview riêng mà không đụng tới production.
3) Xác minh các luồng chính trước khi yêu cầu review
Lướt nhanh để bắt các lỗi phổ biến nhất. Giữ nhỏ và có thể lặp lại:
- Đăng nhập và đăng xuất
- Vào các trang chính tính năng chạm tới
- Thực hiện hành động chính (tạo, sửa, lưu, thanh toán, gửi)
- Kiểm tra một trường hợp lỗi (input sai, trạng thái rỗng, không có quyền)
Ghi lại bạn đã kiểm tra gì bằng một câu. Nó tiết kiệm thời gian sau này.
4) Chia sẻ URL preview và thu thập phản hồi
Gửi URL cùng một ghi chú ngắn: đã thay đổi gì, chỗ cần click đầu tiên, và khi nào coi là “xong”. Yêu cầu phản hồi cụ thể (nội dung, bố cục, các trường hợp biên) thay vì hỏi chung chung “ổn chứ?”
5) Lặp: cập nhật, redeploy, lặp lại
Áp dụng phản hồi, triển khai lại, và ghi chú những gì thay đổi giữa các vòng. Khi preview được chấp thuận, bạn nên có một lịch sử rõ ràng những gì đã kiểm tra và vì sao nó sẵn sàng.
Những gì cần test trong preview (nhanh nhưng có ý nghĩa)
Preview không phải nơi làm QA toàn diện. Nó là nơi bắt những lỗi thường lọt vào production vì không ai dùng app như người dùng thực.
Bắt đầu với cơ bản: mở các trang chính trên desktop và kích thước mobile, click qua điều hướng, và đảm bảo không thấy màn hình trắng. Sau đó làm một happy-path end-to-end, giống cách khách hàng sẽ làm.
Bộ kiểm tra tối thiểu phù hợp hầu hết web app:
- Trang load và các route chính hoạt động (home, pricing, account, dashboard)
- Form gửi và hiện phản hồi rõ (thành công, xác thực, thông báo lỗi)
- Lỗi hiển thị hữu ích (không im lặng, không spinner vô hạn)
- Dữ liệu được lưu và hiển thị đúng sau khi refresh (tạo, sửa, xóa một mục)
- Quyền hợp lý (người chưa đăng nhập không thấy trang riêng tư)
Nếu app bạn kết nối với hệ thống khác, làm một kiểm tra tích hợp nhỏ cho mỗi tính năng. Kích hoạt email test, chạy thanh toán nhỏ ở sandbox, gửi webhook tới endpoint thử nghiệm, hoặc tải lên file nhỏ và xác nhận tải xuống. Bạn không cần chứng minh mọi trường hợp, chỉ xác nhận dây nối hoạt động.
Preview cũng hỏng vì lý do tẻ nhạt: thiếu cài đặt. Xác nhận biến môi trường và secret có mặt, và chúng trỏ tới đúng dịch vụ (thường là sandbox). Cạm bẫy phổ biến là preview vô tình dùng key production hoặc dữ liệu production.
Cuối cùng, làm một kiểm tra hiệu năng nhẹ. Load trang chậm nhất và chú ý các vấn đề rõ rệt: ảnh quá lớn, spinner lâu, gọi API lặp. Nếu preview đã chậm, production sẽ còn tệ hơn.
Nếu bạn xây trên Koder.ai, biến những kiểm tra preview này thành thói quen: mở URL preview, chạy checklist, rồi mới promote. Snapshot và rollback hữu ích, nhưng bắt lỗi sớm rẻ hơn sửa sau.
Promote lên production an toàn (cổng kiểm nhỏ)
Promote nên có một ý nghĩa đơn giản: cùng một phiên bản bạn đã kiểm tra ở preview được đưa lên production. Không sửa vội, không “sửa nhanh” sau khi duyệt. Preview là nơi bạn có tự tin; production là nơi bạn bảo vệ người dùng.
Một cổng phát hành nhỏ giữ mọi thứ nhàm chán (theo cách tốt): không cần cả ủy ban. Cần một tập kiểm tra ngắn bạn luôn làm, ngay cả khi vội:
- Smoke test cuối trên preview: đăng nhập, tạo hoặc sửa một bản ghi thật, và chạy hành trình chính.
- Xác nhận config và secret: env var, API key, callback bên thứ ba khớp yêu cầu production.
- Xác nhận hành vi trên domain production: redirect, HTTPS, cookie và nhà cung cấp auth thường khác trên domain thực.
- Kiểm tra cơ bản về observability: lỗi hiển thị (logs/alerts) và biết xem ở đâu khi có sự cố.
Thay đổi database cần cẩn trọng hơn. Một mẫu an toàn là “mở rộng rồi thu hẹp.” Trước tiên triển khai thay đổi tương thích ngược (thêm cột, thêm bảng, viết cho cả hai). Chỉ khi phiên bản mới ổn định mới xóa cột cũ hoặc code cũ. Điều này giảm rủi ro rollback thất bại vì DB không khớp.
Thời điểm cũng quan trọng. Chọn quy tắc đơn giản và giữ:
- Triển khai vào giờ ít traffic.
- Chỉ định một người chịu trách nhiệm trực trong giờ đầu.
- Thông báo một khoảng thời gian hạn chế để không ai merge bất ngờ.
Trên Koder.ai, điều này phù hợp với việc promote một preview đã review lên production, rồi dựa vào snapshot và rollback nếu smoke test production phát hiện lỗi.
Sai lầm thường gặp gây bất ngờ
Hầu hết vấn đề phát hành không phải là “bug mới”. Là sự không khớp giữa preview và production, hoặc thiếu mạng lưới an toàn khi có lỗi.
Một vài lỗi lặp lại:
- Tái sử dụng secret production trong preview. Preview nên giống production về hành vi nhưng không có quyền lực production. Nếu token preview, API key, hoặc credential admin có thể tác động dịch vụ thật, một lần test có thể gửi email thật, charge thật, hoặc thay đổi dữ liệu thật.
- Cho preview và production cùng trỏ vào một database. Người review “thử” tính năng, và khách hàng thấy bản ghi chưa hoàn thiện hoặc migration lỗi. Cho preview nguồn dữ liệu riêng, hoặc dùng quyền read-only an toàn.
- Deploy từ mục tiêu di động. Nếu bạn promote “những gì đang ở trình soạn thảo” thay vì một snapshot cố định, bạn có thể phát hành khác với cái đã được review. Khóa phiên bản chính xác bạn đã test rồi promote.
- Bỏ qua kế hoạch rollback vì thấy thay đổi nhỏ. Thay đổi nhỏ hay phá hơn vì cảm giác an toàn khiến bỏ qua kiểm tra. Quyết định trước rollback nghĩa là gì (snapshot trước, deployment trước, feature toggle) và ai có quyền kích hoạt.
- Gom quá nhiều thay đổi vào một release. Trộn tweak giao diện với thay đổi auth và DB sẽ khiến lỗi khó chẩn đoán. Giữ release hẹp để dễ biết lỗi do đâu và đảo lại nhanh.
Nếu bạn xây bằng công cụ chat như Koder.ai, coi preview là tiêu hao được và production là có kiểm soát. Mục tiêu đơn giản: mọi lần promote đều lặp lại được, và mọi rollback đều nhàm chán.
Những điều cơ bản về rollback: phục hồi nhanh khi có sự cố
Rollback không chỉ là “đưa mã cũ lên lại.” Một rollback tốt khôi phục những thứ người dùng phụ thuộc: phiên bản app, cài đặt runtime, và trạng thái database tương thích với phiên bản đó.
Nếu bạn rollback code nhưng giữ cấu hình mới (ví dụ API key, feature flag, lịch job nền), bạn có thể gặp cùng sự cố dưới dạng khác. Nếu rollback code nhưng DB đã thay đổi cấu trúc, app cũ có thể crash hoặc hiển thị dữ liệu sai.
Một thói quen đơn giản hữu ích: chụp snapshot đã biết chạy tốt ngay trước mỗi release production. Snapshot đó là dây an toàn. Nếu nền tảng hỗ trợ snapshot và rollback một click (Koder.ai có), coi bước này là bắt buộc, kể cả với thay đổi nhỏ.
Khi có sự cố, quyết định nhanh: rollback hay sửa nóng (hotfix) lên.
- Rollback khi người dùng bị chặn, dữ liệu sai, hoặc chưa rõ nguyên nhân.
- Hotfix khi lỗi nhỏ, rõ nguyên nhân, và có thể sửa an toàn trong vài phút.
- Nếu có bất kỳ nghi ngờ nào, rollback trước. Bạn vẫn có thể phát hành bản sửa sau khi hệ thống ổn định.
Một rollback “đầy đủ” nên phục hồi những gì
Hướng tới trạng thái mà hệ thống hoạt động bình thường:
- Phiên bản app (bản build chính xác đã chạy tốt)
- Cấu hình runtime (env var, flag, cài đặt bên thứ ba)
- Tương thích database (migration, seed, và các backfill dữ liệu)
- Worker nền và tác vụ theo lịch (thường là những thứ hay gây rắc rối)
Khía cạnh con người: giữ bình tĩnh và rõ ràng
Đánh dấu là một incident, dừng mọi thay đổi mới, và chỉ định một người để xác nhận phục hồi. Sau đó kiểm tra cơ bản: các trang chính load, đăng nhập hoạt động, và hành động quan trọng thực hiện được. Khi ổn định, ghi lại nguyên nhân gây rollback và thay đổi quy trình trước lần phát hành tiếp theo.
Một checklist ngắn bạn có thể dùng cho mọi lần phát hành
Một phát hành an toàn hơn khi bạn có cùng tập kiểm tra nhỏ mỗi lần. Giữ đủ ngắn để bạn thực sự làm, nhưng đủ cụ thể để bắt các vấn đề thường gặp.
Trước khi promote (preview lên production)
Dùng ngay sau khi tính năng sẵn sàng và bạn có URL preview:
- URL preview khớp tính năng bạn nghĩ đang review (đúng công việc, build mới nhất).
- Biến môi trường đúng cho preview đó (API keys, auth, callback bên thứ ba).
- Nguồn dữ liệu đúng (DB test cho preview, không trỏ nhầm production).
- Các luồng chính hoạt động end-to-end (đăng nhập, hành động chính, lưu, xem kết quả) bằng thao tác thực.
- Các yếu tố production đã sẵn sàng: domain/DNS và HTTPS OK, logs thấy được, và bạn có snapshot hoặc backup mới.
Ngay sau khi release (và làm gì nếu hỏng)
Làm trong vài phút đầu sau khi lên production, khi thay đổi còn dễ hiểu:
- Chạy smoke test 2 phút trên production: load trang chủ, đăng nhập, hoàn thành hành động chính, xác nhận dữ liệu lưu.
- Kiểm tra logs và lỗi xem có spike rõ rệt không (500s, lỗi auth, webhook thanh toán, request chậm).
- Xác nhận một tín hiệu chính: một metric đơn giản (đăng nhập, checkout, gửi tin) hoặc một vài báo cáo người dùng thực.
- Nếu có gì sai, rollback ngay bằng deployment rollback hoặc restore snapshot.
- Sau rollback, lặp lại smoke test và xác nhận incident đã được giải quyết trước khi điều tra nguyên nhân gốc.
Nếu in ra, để checklist này cạnh nút release của bạn. Checklist tốt nhất là cái bạn thực sự làm mỗi lần.
Ví dụ workflow: một tính năng từ preview tới production rồi rollback
Một nhóm nhỏ thêm bước checkout mới (như “tên công ty và VAT”) được xây bằng chat. Sales muốn thử trên các cuộc gọi khách hàng thật trước khi live. Mục tiêu là giữ preview và production tách biệt rõ nhưng vẫn nhanh.
Họ tạo branch tính năng và sinh build preview với URL riêng, ví dụ checkout-vat.preview. Preview dùng cấu trúc DB giống production nhưng với dữ liệu test. Sales nhận URL preview và một kịch bản ngắn: “Thêm món, nhập VAT, hoàn thành thanh toán thử.”
Trong hai ngày, phản hồi đến: trường VAT chưa rõ, và thông báo lỗi quá đáng sợ. Team sửa UI, cập nhật copy, và deploy lại.
Flow đơn giản họ theo:
- Xây tính năng trên branch riêng, sinh URL preview và chia cho Sales.
- Thu thập phản hồi, fix lỗi, và redeploy preview cho tới khi đạt yêu cầu.
- Chạy cổng phát hành nhỏ: smoke test, kiểm tra config, và sign-off rõ ràng.
- Deploy lên production vào thời điểm ít căng thẳng, rồi theo dõi những checkout thực.
Release ban đầu ổn trong 20 phút, rồi thanh toán bắt đầu lỗi. Bug không phải do code. Một giá trị cấu hình ẩn (env var cho provider thanh toán) thiếu ở production.
Thay vì cố sửa nóng trong áp lực, họ rollback về snapshot trước đó. Thanh toán phục hồi nhanh. Sau đó họ khôi phục bản mới trong preview, thêm cấu hình thiếu ở đó trước, và lặp lại cổng phát hành.
Sau đó, họ điều chỉnh quy trình để tránh lặp lại:
- Thêm mục “cấu hình bắt buộc” cho mỗi release.
- Giữ smoke test sản xuất nhỏ kiểm tra handshake với provider thanh toán.
- Ghi lại fix vào ghi chú kế hoạch để lần sau tính năng tương tự bắt đầu đã có cấu hình đúng.
Bước tiếp theo: biến quy trình này thành mặc định
Đối xử với phát hành như một thói quen lặp lại, không phải sự kiện đặc biệt. Mục tiêu là preview vs production trở nên nhàm chán: cùng bước, cùng kiểm tra, mỗi lần.
Viết quy tắc môi trường bằng ngôn ngữ đơn giản. Ngắn và cụ thể: cách đặt tên URL preview, ai được truy cập, dữ liệu nào được cho phép, và ai chịu trách nhiệm sửa vấn đề phát hiện ở đó. Với dữ liệu, quy tắc đơn giản: preview dùng dữ liệu test hoặc bản sao đã che, và không chạm tới hồ sơ khách hàng thật trừ khi có lý do rõ ràng và phê duyệt.
Biến một thói quen thành không thể bỏ qua: mọi release production bắt đầu bằng snapshot và kết thúc bằng smoke test. Snapshot cho bạn đường thoát an toàn nếu release làm hỏng điều gì đó. Smoke test chứng minh app vẫn chạy cho vài hành động quan trọng nhất.
Một mặc định nhẹ bạn có thể tái sử dụng:
- Trước release: tạo snapshot và ghi rõ thay đổi.
- Release: promote chỉ những gì đã pass review ở URL preview.
- Sau release: chạy smoke test 2 phút (đăng nhập, luồng chính, thanh toán hoặc lưu).
- Nếu có gì sai: rollback trước, rồi điều tra bình tĩnh.
Rủi ro giảm nhanh khi thay đổi nhỏ. Ưu tiên phát hành thường xuyên với một tính năng hoặc sửa lỗi mỗi lần. Nếu thay đổi lớn, chia nó ra thành phần có thể phát hành an toàn, ngay cả khi UI đến trước phần logic backend hoàn chỉnh.
Nếu bạn xây với Koder.ai, dựa vào preview deployment cho mỗi tính năng để người review có thể click URL thực thay vì đoán qua ảnh chụp màn hình. Khi mọi thứ ổn, promote lên production, và giữ ready snapshot cùng rollback để một deploy tệ chỉ là một lộ trình tạm thời thay vì outage kéo dài.
Câu hỏi thường gặp
Sự khác nhau giữa môi trường xem trước và production là gì?
Một môi trường xem trước là bản sao tạm thời, cô lập của app mà bạn có thể mở và chia sẻ để lấy phản hồi. Production là ứng dụng đang chạy thật mà người dùng sử dụng, với dữ liệu thật và hậu quả thật nếu có gì hỏng.
Quy tắc mặc định: xem trước để học và kiểm tra, production để phục vụ khách hàng.
Khi nào tôi nên tạo preview thay vì triển khai thẳng lên production?
Tạo preview cho bất kỳ thay đổi nào ảnh hưởng tới trải nghiệm người dùng: cập nhật giao diện, form, xác thực, thanh toán, truy vấn cơ sở dữ liệu hoặc tích hợp bên thứ ba.
Nếu thay đổi có thể sinh ticket hỗ trợ khi sai, thì nó nên có link xem trước trước.
Tôi nên đặt tên URL xem trước thế nào để người xem không nhầm lẫn?
Dùng một mẫu tên đơn giản, nhất quán để cho người xem biết họ đang nhìn cái gì:
prv-<ticket>-<feature>(ví dụ:prv-482-checkout-tax)- dùng chữ thường và dấu gạch ngang
- tránh các tên như
prodhaymain
Mục tiêu: ai đó dán URL vào chat là mọi người hiểu ngay.
Làm sao để chắc chắn preview khớp đúng phiên bản đang được xem xét?
Một preview nên trỏ tới một bản build cụ thể (không phải “mới nhất” liên tục).
Cách làm thực tế:
- gắn preview với một snapshot/phiên bản
- khi thay đổi code, tạo snapshot mới và triển khai lại
- không âm thầm thay đổi nội dung của một link đã chia sẻ
Nhờ vậy phản hồi mới đáng tin vì mọi người kiểm thử cùng một phiên bản.
Preview nên sử dụng dữ liệu gì?
Chọn một chuẩn và ghi rõ cho team:
- dữ liệu mẫu cho đánh giá giao diện và demo
- bản copy production đã che/ẩn cho các trường hợp biên thực tế (chỉ khi có biện pháp bảo mật)
- DB trống cho flow onboarding và kiểm tra migration
Khuyến nghị mặc định: dùng dữ liệu mẫu trừ khi có lý do rõ ràng để mô phỏng trường hợp production.
Làm sao kiểm soát ai truy cập được link xem trước?
Xem trước dễ bị rò rỉ qua ảnh chụp màn hình và chuyển tiếp. Các tùy chọn an toàn phổ biến:
- yêu cầu đăng nhập
- allowlist email/miền
- mật khẩu chia sẻ cho khách hàng
- quy định thời hạn (ví dụ: xóa sau khi merge)
Mặc định: chỉ team trừ khi được chia sẻ rõ ràng.
Những kiểm tra tối thiểu tôi nên làm trên preview trước khi yêu cầu review là gì?
Ngắn gọn đủ để bạn thực sự làm:
- đăng nhập và đăng xuất
- thực hiện hành động chính (tạo/sửa/thanh toán/gửi)
- refresh và xác nhận dữ liệu được lưu
- kiểm tra một trường hợp lỗi (input sai/không có quyền)
- xác nhận các route/trang chính load được trên desktop và mobile
Viết một câu tóm tắt điều bạn đã kiểm tra để người xem biết phạm vi.
Làm sao tránh sai sót về biến môi trường và secret giữa preview và production?
Biến môi trường và secret là nguyên nhân hàng đầu cho “preview chạy nhưng production lỗi”.
Trước khi promote:
- xác minh các env var cần thiết tồn tại (API keys, OAuth redirect, base URL)
- đảm bảo preview dùng credential sandbox/test
- đảm bảo production có giá trị đúng riêng của nó
- kiểm tra domain redirect/redirect URI khớp domain production
Không bao giờ dùng secret production trong preview.
Tôi nên xử lý migration DB thế nào để release và rollback an toàn?
Dùng mẫu tương thích ngược:
- mở rộng: thêm cột/bảng mới trước; giữ mã cũ chạy được
- triển khai phiên bản app mới
- chuyển traffic/dữ liệu dần
- thu hẹp: sau khi ổn định thì xoá cột hoặc code cũ
Cách này giảm rủi ro rollback thất bại vì database không còn tương thích với app cũ.
Nếu production bị lỗi, tôi nên rollback hay hotfix tiếp?
Hành động mặc định khi người dùng bị chặn hoặc chưa rõ nguyên nhân: rollback nhanh về snapshot/phiên bản đã biết chạy tốt.
Dùng hotfix khi:
- lỗi nhỏ và đã hiểu rõ
- có thể sửa và redeploy an toàn trong vài phút
Sau rollback, chạy smoke test production (đăng nhập + hành động chính) để xác nhận đã phục hồi.