Giới thiệu
Trong phát triển phần mềm, việc kiểm thử các tính năng đang hoặc đã được phát triển là cần thiết để đảm bảo chất lượng sản phẩm. Khi mã nguồn chạy trên máy chủ, việc triển khai (deploy) vào môi trường cụ thể giúp kiểm tra một phiên bản mã nhất định tương tác với các ứng dụng khách hoặc dịch vụ khác. Tuy nhiên, khi nhiều tính năng được phát triển song song trên các nhánh khác nhau của Git, việc kiểm thử nhiều tính năng cùng lúc không phải lúc nào cũng dễ dàng.
Vấn đề thường gặp
Một quy trình phổ biến trong Git là tạo một nhánh (branch) để phát triển một tính năng. Khi tính năng đó đã sẵn sàng và được kiểm thử, nó sẽ được gộp (merge) vào nhánh chính của dự án. Điều này cho phép các tính năng khác nhau được phát triển song song mà không làm ảnh hưởng đến nhau.
Ví dụ về các nhánh trong Git
Giả sử dự án là mã nguồn của một API Rest chạy trên máy chủ, có các môi trường như:
- Sản xuất (Produção): nơi dự án đang được sử dụng thực tế. Triển khai từ nhánh
main. - Kiểm thử (Homologação): môi trường để xác nhận trước khi đưa vào sản xuất. Triển khai từ nhánh
main. - Phát triển (Desenvolvimento): môi trường cho lập trình viên thử nghiệm mà không cần phải đưa vào sản xuất ngay. Triển khai từ bất kỳ nhánh nào.
Nếu các lập trình viên đã phát triển các nhánh feature-1 và feature-2 muốn kiểm thử mã của họ trong môi trường Phát triển, chỉ một phiên bản (nhánh) có thể được kiểm thử tại một thời điểm. Khi triển khai phiên bản từ commit 4, nó sẽ thay thế phiên bản từ commit 2, và ngược lại.
Giải pháp đề xuất
Để giải quyết vấn đề này, một cách tiếp cận là tạo một nhánh mới bao gồm tất cả các tính năng muốn kiểm thử. Trong Git, điều này có thể thực hiện bằng cách tạo một nhánh mới để gộp các nhánh mong muốn. Ví dụ:
bash
git checkout -b phát-triển main
git merge --no-ff feature-1
git merge --no-ff feature-2
Khi đó, khi triển khai trong môi trường Phát triển, bạn sẽ kiểm thử tất cả các tính năng mong muốn cùng lúc mà không làm ảnh hưởng đến các nhánh khác. Nhánh phát-triển vẫn có thể nhận thêm các tính năng mới từ các nhánh khác hoặc các thay đổi từ những nhánh đã được gộp trước đó.
Quy trình bàn giao tính năng
Khi một tính năng đã được xác nhận và sẵn sàng, nó có thể được gộp vào nhánh main, như thể nhánh phát-triển không tồn tại. Điều này đảm bảo rằng chỉ có tính năng đó được tích hợp vào nhánh main, có thể được xác nhận trong môi trường Kiểm thử và đưa vào Sản xuất mà không có sự ảnh hưởng của các tính năng khác.
Dọn dẹp nhánh
Khi tính năng đã được kiểm thử và gộp vào nhánh main, có thể xuất hiện sự khác biệt giữa mã nguồn của nhánh phát-triển và nhánh main. Chẳng hạn, nếu có một sửa lỗi được thêm trực tiếp vào main mà không qua nhánh phát-triển, hoặc nếu phát triển feature-1 bị dừng lại. Điều này có thể dẫn đến tình trạng mã hoạt động trong phát-triển nhưng không hoạt động trong main.
Do đó, việc dọn dẹp nhánh phát-triển là cần thiết, có thể thực hiện bằng cách đồng bộ lại với nhánh main mà nó đã được tạo ra. Điều này sẽ loại bỏ các tính năng chưa gộp vào main, nhưng các tính năng đó vẫn có thể có các nhánh riêng của chúng. Bạn có thể dễ dàng tạo lại nhánh phát-triển bằng lệnh:
bash
git checkout -B phát-triển main
Cách triển khai
Các lệnh đã đề xuất ở trên hoạt động trên kho lưu trữ cục bộ. Để tích hợp với kho lưu trữ từ xa, cần thực hiện một số điều chỉnh.
Tạo hoặc dọn dẹp nhánh
Để tạo hoặc dọn dẹp nhánh phát-triển, bạn cần cập nhật nhánh main, tạo nhánh phát-triển và gửi đến máy chủ. Điều này có thể thực hiện bằng các lệnh sau:
bash
git fetch origin main
git checkout -B phát-triển origin/main
git push origin +phát-triển
Gộp tính năng để kiểm thử
Để thêm một tính năng vào nhánh phát-triển, bạn cần đảm bảo nhánh phát-triển và nhánh tính năng đã được cập nhật. Sau đó, bạn có thể thực hiện gộp và gửi lên máy chủ:
bash
git fetch origin phát-triển feature-1
git checkout -B phát-triển origin/phát-triển
git merge --no-ff origin/feature-1
git push origin phát-triển
Nếu có thay đổi trong nhánh tính năng sau đó, bạn có thể thực hiện gộp mới.
Hoàn tác thay đổi
Nếu một tính năng gặp lỗi hoặc bạn muốn loại bỏ nó mà không làm ảnh hưởng đến các tính năng khác, bạn có thể hoàn tác một gộp trong nhánh phát-triển. Để thực hiện điều này, bạn cần cập nhật nhánh phát-triển và sử dụng Git để tạo một commit hoàn tác các thay đổi từ gộp. Cách thực hiện:
bash
git fetch origin phát-triển
git checkout -B phát-triển origin/phát-triển
git revert -m 1 aa9ff52
Một điểm cần lưu ý là sau khi hoàn tác gộp, bạn sẽ không thể gộp lại tính năng đó vào nhánh phát-triển cho đến khi nhánh được làm sạch, vì các commit của nhánh tính năng đã ở trong lịch sử của nhánh phát-triển.
Thực hiện qua script
Một cách để thực hiện các lệnh trên là thông qua một script, cho phép những người cần có thể chạy và chỉ định các thao tác mong muốn. Hoặc bạn có thể sử dụng công cụ tích hợp liên tục (CI) để thực hiện các tác vụ này.
Kết luận
Không có cách nào đơn giản để kiểm thử các nhánh khác nhau cùng lúc, nhưng có thể tạo ra một quy trình với một nhánh phụ để thực hiện điều này mà không làm ảnh hưởng đến quy trình làm việc trước đó. Quy trình này nhằm mục tiêu thực hiện một lần triển khai với tất cả các tính năng mong muốn. Một lựa chọn khác là thực hiện triển khai riêng cho từng nhánh, giúp kiểm tra các tính năng một cách riêng biệt.
Câu hỏi thường gặp (FAQ)
1. Tại sao cần tạo nhánh phát-triển?
Tạo nhánh phát-triển giúp kiểm thử nhiều tính năng cùng lúc mà không làm ảnh hưởng đến quy trình làm việc hiện tại.
2. Làm thế nào để hoàn tác một gộp trong Git?
Bạn có thể sử dụng lệnh git revert với hash của commit gộp để hoàn tác các thay đổi.
3. Có cần dọn dẹp nhánh phát-triển thường xuyên không?
Có, việc dọn dẹp nhánh giúp đồng bộ hóa với nhánh chính và loại bỏ các tính năng không còn cần thiết.