Hotfix là bản sửa khẩn cấp cho một lỗi nghiêm trọng trên môi trường production, được thực hiện ngoài chu kỳ phát hành thông thường. Khác với bản phát hành theo kế hoạch, hotfix bỏ qua một số giai đoạn QA và kiểm thử để chuyển bản sửa đến người dùng trong thời gian ngắn nhất. Theo Hướng dẫn quy trình làm việc Git của Atlassian, nhánh hotfix được tạo từ tag phát hành mới nhất, và sau khi áp dụng được hợp nhất trở lại vào main và develop. Quy trình hotfix bao gồm một tập hợp tối thiểu các kiểm tra đủ để đảm bảo không có hồi quy.
Ý chính
Hotfix (bản sửa nhanh) là một bản vá cho phiên bản production của ứng dụng được phát hành ngoài hàng đợi để sửa một vấn đề nghiêm trọng. Hotfix được chuyển đến người dùng trong vài giờ, không phải vài ngày, và chỉ dành cho các tình huống ứng dụng không khả dụng, mất dữ liệu hoặc xâm phạm bảo mật người dùng.
Các kịch bản điển hình cho hotfix: sự cố khi khởi động trên một số thiết bị (hồi quy sau bản phát hành cuối cùng), rò rỉ dữ liệu cá nhân do ủy quyền không chính xác, tích hợp thanh toán bị hỏng (mất doanh thu), vi phạm tuân thủ GDPR/CCPA. Tất cả các tình huống này đều có mức độ nghiêm trọng P0 hoặc P1 trong phân loại sự cố. Các nhiệm vụ theo kế hoạch — tối ưu hóa, tái cấu trúc, màn hình mới — không bao giờ được thực hiện qua hotfix.
Một quy tắc quan trọng: hotfix chứa số lượng thay đổi tối thiểu (1–2 tệp, 10–20 dòng mã). Diff càng nhỏ, nguy cơ đưa ra lỗi mới càng thấp. Nếu sửa vấn đề yêu cầu thay đổi kiến trúc hoặc thêm mô-đun mới — đó không phải là hotfix, mà là bản phát hành khẩn cấp yêu cầu review mã đầy đủ và QA.
Sự khác biệt chính giữa hotfix và bản phát hành theo kế hoạch là tốc độ, phạm vi thay đổi và mức độ kiểm thử. Một bản phát hành theo kế hoạch có thể bao gồm hàng chục tính năng, trải qua chu trình QA đầy đủ (kiểm thử hồi quy + tích hợp + UI) và mất 1–2 tuần từ khi đóng băng mã đến khi triển khai. Hotfix bao gồm một hoặc hai bản sửa, trải qua review tăng tốc (2 phê duyệt thay vì 3) và kiểm thử smoke tối thiểu.
Từ góc độ quy trình Git, hotfix được tạo từ tag phát hành, không phải từ nhánh develop. Điều này đảm bảo rằng chỉ có các thay đổi cần thiết để sửa vấn đề được đưa vào hotfix, mà không vô tình kéo theo các tính năng chưa hoàn thành từ develop. Sau khi triển khai, hotfix được hợp nhất trở lại vào main và develop (qua cherry-pick hoặc merge).
| Tiêu chí | Bản phát hành theo kế hoạch | Hotfix |
|---|---|---|
| Phạm vi | Nhiều tính năng và sửa lỗi | 1–2 bản sửa nghiêm trọng |
| Nhánh | Nhánh release từ develop | Nhánh hotfix từ tag phát hành |
| Review mã | 3 phê duyệt, quy trình đầy đủ | 2 phê duyệt, fast-track |
| QA | Bộ kiểm thử hồi quy đầy đủ | Kiểm thử smoke + khu vực ảnh hưởng |
| Thời gian triển khai | 1–4 tuần | 1–24 giờ |
| Rollback | Qua revert commit | Qua xây dựng lại tag trước đó |
Quan trọng: không phải mọi nhiệm vụ khẩn cấp đều là hotfix. Nếu người quản lý nói “chúng ta cần thêm một nút khẩn cấp” — đó không phải hotfix, mà là thay đổi ưu tiên. Một hotfix thực sự được xác định bởi mức độ nghiêm trọng đối với người dùng, không phải tính cấp bách cho doanh nghiệp. Tiêu chí: nếu ứng dụng không bị treo và dữ liệu không bị rò rỉ — nhiệm vụ chờ bản phát hành theo kế hoạch.
Bước đầu tiên khi phát hiện vấn đề nghiêm trọng là phân loại — đánh giá nhanh mức độ nghiêm trọng. Kỹ sư trực ca xác nhận lỗi, kiểm tra log và báo cáo sự cố, xác định vấn đề là hồi quy từ bản phát hành cuối cùng hay lỗi tồn tại lâu dài. Nếu mức độ nghiêm trọng là P0 — pipeline hotfix được kích hoạt. Giai đoạn phân loại không nên mất quá 15 phút.
Bước thứ hai — tạo nhánh từ tag phát hành mới nhất (v2.5.0 → hotfix/v2.5.1). Nhà phát triển thực hiện bản sửa tối thiểu, commit với tiền tố HOTFIX trong thông báo, push và mở PR với nhãn [HOTFIX]. Review mã fast-track: hai người review được chỉ định tự động qua CODEOWNERS, thời gian review không quá 30 phút. Nếu không có review trong 20 phút — người review bị bỏ qua và người tiếp theo được chỉ định.
Bước thứ ba — build và triển khai qua CI/CD. Pipeline hotfix khác với pipeline thông thường: các kiểm thử tích hợp dài (mất hàng giờ) được bỏ qua, chỉ chạy bộ smoke (10–15 kịch bản nghiêm trọng, 5–10 phút). Sau khi triển khai: giám sát tỷ lệ sự cố, tỷ lệ lỗi, độ trễ API — trong 30 phút. Chỉ số DORA cho hotfix: thời gian phục hồi trung bình (MTTR) phải dưới 1 giờ.
# .github/workflows/hotfix-deploy.yml
name: Hotfix Deploy Pipeline
on:
pull_request:
types: [labeled]
branches: [hotfix/*]
jobs:
hotfix-checks:
runs-on: ubuntu-latest
if: contains(github.event.label.name, 'hotfix-critical')
steps:
- uses: actions/checkout@v4
- name: Validate diff size
run: bash .github/scripts/diff-check.sh 30
- name: Build
run: ./gradlew assembleRelease
- name: Smoke test
run: ./gradlew smokeTest
- name: Deploy to staging
run: fastlane deploy_staging
- name: Approve & deploy to production
if: success()
run: fastlane deploy_production
env:
HOTFIX_MODE: true
Các tối ưu hóa chính trong pipeline này: kiểm tra diff (không quá 30 dòng), bỏ qua kiểm thử tích hợp, triển khai tự động lên staging và production khi kiểm thử smoke thành công. HOTFIX_MODE biến môi trường kích hoạt các kiểm tra bổ sung trong thời gian chạy — ví dụ, ghi log mở rộng để chẩn đoán nhanh vấn đề.
Chiến lược làm việc với nhánh hotfix được mô tả trong Gitflow Workflow. Quy tắc chính: nhánh hotfix được tạo từ tag phát hành mới nhất (git checkout -b hotfix/v2.5.1 tags/v2.5.0), không phải từ develop hoặc main. Điều này đảm bảo hotfix dựa trên cùng trạng thái mã hiện đang trong production và không kéo theo các thay đổi chưa hoàn thành từ develop.
Sau khi hoàn thành bản sửa, nhánh hotfix được hợp nhất vào main (hoặc master) và develop. Vào main — một commit merge thông thường với tag phát hành bản vá mới (v2.5.1). Vào develop — merge hoặc cherry-pick, tùy theo chính sách nhóm. Nếu develop chứa nhiều thay đổi hơn main, nên cherry-pick commit hotfix cụ thể để tránh xung đột. GitFlow khuyến nghị hợp nhất hotfix vào main trước, sau đó hợp nhất main vào develop.
# Tạo nhánh hotfix từ tag phát hành mới nhất
git checkout -b hotfix/v2.5.1 tags/v2.5.0
# Áp dụng bản sửa
git commit -m "HOTFIX: Fix crash on Android 14 notification permission"
# Hợp nhất vào main và gắn thẻ phát hành
git checkout main
git merge --no-ff hotfix/v2.5.1
git tag -a v2.5.1 -m "Hotfix release v2.5.1"
# Hợp nhất vào develop
git checkout develop
git merge --no-ff hotfix/v2.5.1
# Dọn dẹp nhánh tạm thời
git branch -d hotfix/v2.5.1
Quan trọng: nếu hotfix sửa một lỗi tồn tại trong nhánh develop hiện tại (lỗi được đưa vào vài sprint trước), thì sau khi hợp nhất hotfix vào main và develop, develop đã có bản sửa. Nếu lỗi chỉ được đưa vào trong nhánh release (lỗi tích tụ qua cherry-pick), thì bản sửa có thể không cần trong develop. Phân tích nguyên nhân gốc rễ giúp xác định có cần cherry-pick vào develop hay không.
Rủi ro chính của hotfix là đưa ra lỗi mới nghiêm trọng hơn do vội vã. Theo nghiên cứu của Stripe (2021), 15% hotfix gây ra hồi quy và yêu cầu hotfix thứ hai. Đây là quy luật trớ trêu: chúng ta sửa càng nhanh, khả năng mắc lỗi càng cao. Giảm thiểu rủi ro đạt được bằng cách giới hạn nghiêm ngặt kích thước diff (không quá 30 dòng) và kiểm thử smoke tự động bắt buộc.
Rủi ro thứ hai — tích lũy nợ kỹ thuật. Nếu nhóm thường xuyên sử dụng hotfix thay vì bản phát hành theo kế hoạch, cơ sở mã sẽ suy thoái: commit hotfix không trải qua tái cấu trúc, giải pháp tạm thời không được thay thế bằng giải pháp phù hợp, tài liệu không được cập nhật. Kiểm tra sức khỏe: nếu hotfix được phát hành nhiều hơn một lần mỗi tháng — quy trình phát hành cần được xem xét lại.
Rủi ro thứ ba — tâm lý. Hotfix thường xuyên làm kiệt sức nhóm: các kỹ sư trực ca luôn trong trạng thái căng thẳng, review mã trở thành hình thức (mọi người đều muốn nhanh hơn), văn hóa chất lượng giảm sút. Tần suất hotfix bình thường cho một nhóm trưởng thành là 1–2 lần mỗi quý. Nếu nhiều hơn — vấn đề không phải ở hotfix mà ở chất lượng các bản phát hành theo kế hoạch.
Sau khi triển khai hotfix và ổn định các chỉ số, một buổi hồi tưởng post-mortem không đổ lỗi được tiến hành. Nhóm trả lời bốn câu hỏi: chuyện gì đã xảy ra, tại sao các kiểm tra không phát hiện lỗi, đã làm gì để sửa và làm thế nào để ngăn chặn tái diễn. Post-mortem được tiến hành trong vòng 24–48 giờ sau hotfix, khi các chi tiết vẫn còn mới. Văn hóa không đổ lỗi là nguyên tắc chính: thảo luận về quy trình, không phải con người.
Kết quả của post-mortem là các mục hành động cụ thể với người chịu trách nhiệm và thời hạn. Các mục hành động điển hình: thêm kiểm thử đơn vị cho trường hợp bỏ lỡ, mở rộng bộ kiểm thử smoke, cải thiện giám sát (thêm cảnh báo trên chỉ số), cập nhật runbook cho các sự cố tương tự. Các mục hành động phải được hoàn thành trước bản phát hành theo kế hoạch tiếp theo.
Câu hỏi thường gặp
Không hoàn toàn. Patch release là việc phân phối các bản sửa nhỏ theo lịch trình thông thường. Hotfix là bản sửa khẩn cấp ngoài lịch trình. Patch release trải qua chu trình QA đầy đủ, hotfix qua chu trình rút gọn. Nhưng về mặt kỹ thuật, cả hai đều có thể sử dụng tăng phiên bản vá (v2.5.0 → v2.5.1).
Không, hotfix luôn được ghi lại trong Git để truy xuất nguồn gốc. Ngoại lệ là bản sửa khẩn cấp ở cấp độ cấu hình (feature flag, remote config) không yêu cầu thay đổi mã. Mỗi hotfix phải được gắn với một commit có thông báo rõ ràng và được tham chiếu trong ticket sự cố.
Đối với iOS, hotfix qua App Review mất 1–24 giờ (có thể yêu cầu xem xét nhanh). Đối với Android — 1–4 giờ qua Google Play Console. Thời gian triển khai phụ thuộc vào chính sách cửa hàng và sự sẵn có của quy trình xem xét khẩn cấp.
Quyết định được đưa ra bởi kỹ sư trực ca dựa trên các tiêu chí nghiêm trọng. Nếu mức nghiêm trọng là P0 — hotfix được khởi chạy mà không cần phê duyệt bổ sung. P1 — yêu cầu phê duyệt từ trưởng nhóm kỹ thuật. Trao quyền cho nhóm: kỹ sư trực ca có thẩm quyền khởi chạy hotfix mà không cần thủ tục hành chính.
Đối với nhóm trưởng thành — 1–2 hotfix mỗi quý. Tần suất nhiều hơn một lần mỗi tháng cho thấy vấn đề trong quy trình QA, mức độ bao phủ kiểm thử không đủ hoặc chiến lược phát hành không đúng. Tần suất hotfix bình thường là KPI cho chất lượng quy trình phát triển.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm