Quy mô nhóm hoặc ứng dụng có ảnh hưởng đến quá trình phát hành không? Vâng, nó phụ thuộc. Hãy tưởng tượng một công ty khởi nghiệp với một nhóm nhỏ. Trong trường hợp này, nhóm thường tạo ra một tính năng và sau đó chỉ phát hành nó. Bây giờ, hãy tưởng tượng một dự án lớn, chẳng hạn như một ứng dụng ngân hàng, với nhiều nhóm làm việc trên đó.
Trong trường hợp này, có lẽ nên có một quy trình, chu kỳ phát hành và có thể có một số thủ tục hành chính. Không có điều đó sẽ có sự hỗn loạn.
Vì vậy, khi nào thì rõ ràng đã đến lúc thiết lập quy trình như vậy cho ứng dụng của bạn?
Trong bài viết này, tôi sẽ chia sẻ kinh nghiệm triển khai Đào tạo phát hành cho ứng dụng Dodo Pizza (Android và iOS) và những vấn đề chúng tôi gặp phải khiến nhóm của chúng tôi triển khai Đào tạo phát hành.
Nếu bạn là Trưởng nhóm/Trưởng nhóm công nghệ của một dự án Android hoặc iOS đang phát triển nhanh chóng và bạn chưa quản lý quy trình phát hành, tôi hy vọng rằng kinh nghiệm của chúng tôi sẽ giúp ích cho bạn.
Vào năm 2021, chúng tôi đã sử dụng phương pháp Phát triển dựa trên đường trục (TBD) trong nhóm của mình. Chúng tôi đã bao phủ mã bằng các chuyển đổi tính năng, các tác vụ được phân tách và chạy thử nghiệm đơn vị và giao diện người dùng. Các nhánh tính năng của chúng tôi không tồn tại được lâu và chúng tôi đã có CI hoạt động.
Quá trình phát hành rất đơn giản: bất cứ ai sẵn sàng triển khai tính năng của mình thì hãy triển khai nó.
Đây là đại khái quy trình làm việc tại chi nhánh của chúng tôi trông như thế nào. Một số đội (xám, xanh lam, cam và xanh lục) đã nghiên cứu các tính năng khác nhau. Vì chúng tôi đang làm việc theo TBD nên mỗi tính năng có thể tồn tại qua một số nhánh liên tiếp.
Ví dụ: đội xám thực hiện đặc điểm của mình trong 4 bước, đội xanh lam và cam thực hiện đặc điểm của mình trong 1 bước và đội xanh lá cây thực hiện đặc điểm của mình trong 2 bước.
Khi một nhóm hoàn thành một tính năng, họ có thể tung ra bản phát hành. Ví dụ: nếu đội xanh hoàn thành một tính năng, họ có thể phát hành. Sau đó, đội màu cam sẽ hoàn thành một tính năng và thực hiện một bản phát hành khác.
Có vẻ như lúc đó chúng tôi đã có một dòng chảy hoàn hảo. Nó hoạt động rất tốt ở một mức độ nào đó, nhưng tất cả những điều tốt đẹp đều kết thúc.
Đã xảy ra sự cố: khó khăn, đông đúc và không thể đoán trước
Vấn đề đầu tiên chúng tôi gặp phải là các bản phát hành bắt đầu tích lũy nhiều tính năng và trở nên quá lớn.
Không phải lúc nào các nhóm cũng muốn phát hành tính năng của mình ngay lập tức. Quá trình phát hành và hồi quy tốn nhiều thời gian và mất 3–4 ngày. Vì vậy, nếu tính năng của bạn nhỏ và không khẩn cấp, không phải lúc nào bạn cũng có thể tự mình phát hành nó vì có thể một số nhóm khác sẽ sớm phát hành và nó sẽ được đưa vào bản phát hành đó. Đại khái nó trông như thế này:
Đây là một sự sắp xếp khá mong manh, đặc biệt khi số lượng đội bắt đầu tăng lên. Nhiều nhóm đã phát triển nhiều tính năng nhỏ và tổng khối lượng mã mới trong mỗi bản phát hành mới trở nên khổng lồ. Khi ai đó phải phát hành tính năng lớn của mình, họ phải phát hành cả một con voi ma mút cùng với nó.
Việc phát hành khổng lồ đã dẫn đến:
Chúng tôi cần phải làm sao để ngay cả khi đội xanh và cam trong ví dụ không muốn phát hành thì việc phát hành vẫn được thực hiện bằng cách nào đó.
Mỗi đội là duy nhất và mọi tính năng đều khác nhau. Đôi khi, mọi thứ diễn ra theo cách mà một số đội sẽ hoàn thành các tính năng của mình trong cùng một thời điểm. Trong trường hợp này, có rất nhiều câu “đợi tôi nhé, sáng mai tôi sẽ hợp nhất, tôi hứa!” đi xung quanh.
Cuối cùng, những tắc nghẽn như vậy đã dẫn đến:
Chúng tôi cần thực hiện 2 thay đổi quan trọng:
Nhóm phát hành không cần phải đợi ai cả;
mọi nhóm khác nên biết khi nào dự kiến có bản phát hành tiếp theo.
Hãy tưởng tượng, đội xanh làm một tính năng nhỏ và mong đội cam sẽ sớm ra mắt. Nhưng đã xảy ra sự cố và đội màu cam cũng không tung ra bản phát hành vì một số vấn đề của riêng họ.
Do đó, đội xanh đã nói với doanh nghiệp rằng tính năng này sẽ sớm được đưa vào sản xuất, nhưng hóa ra là chưa đủ sớm. Do đó, không thể dự đoán khi nào tính năng này sẽ được đưa vào sản xuất.
Điều này không có nghĩa là đội xanh vô trách nhiệm. Nếu họ có tính năng siêu quan trọng hoặc cấp bách thì tất nhiên họ sẽ tự tung ra. Nhưng trong các trường hợp khác, không có cách nào để biết chính xác khi nào tính năng này sẽ có sẵn cho người dùng.
Như bạn có thể đoán, chúng tôi gặp phải những vấn đề như vậy khá thường xuyên. Chúng tôi cần có thể biết chính xác khi nào khách hàng sẽ nhận được một tính năng trong quá trình sản xuất bất kể quy mô hay mức độ khẩn cấp của nó. Cả 3 vấn đề (phát hành khổng lồ, tắc nghẽn và thiếu khả năng dự đoán) đều liên quan chặt chẽ và bổ sung cho nhau.
Tuy nhiên, có lẽ điều cơ bản và quan trọng nhất trong số đó là thiếu khả năng dự đoán. Nó tạo ra các vấn đề khác.
Chúng tôi đã có đủ; đã đến lúc phải thay đổi. Chuyến tàu phóng thích được cho là sẽ giúp chúng tôi làm điều đó.
Thuật ngữ Đào tạo phát hành có nhiều ý nghĩa khác nhau: quy trình phát hành theo lịch trình hoặc một nhóm chuyên trách quản lý quy trình phát hành. Ở đây, chúng ta sẽ nói về quy trình phát hành theo lịch trình.
Tôi thích cách Martin Fowler mô tả Release Train trong bài viết “ Các mô hình quản lý các nhánh mã nguồn ” và định nghĩa được Thoughtworks đưa ra trong radar công nghệ của họ (có thể nó cũng thuộc về Martin).
Đây là cách chúng tôi đã xác định Release Train cho chính mình:
Release Train là quá trình phối hợp phát hành giữa các nhóm. Tất cả các bản phát hành đều diễn ra theo một lịch trình cố định, không phụ thuộc vào việc các tính năng đã sẵn sàng hay chưa. Chuyến tàu không đợi ai cả. Nếu đến trễ thì phải đợi chuyến sau.
Hãy chia nhỏ nó bằng một vài ví dụ sử dụng các nhóm được mã hóa màu của chúng tôi.
Release Train diễn ra theo lịch trình và không phụ thuộc vào người đã sáp nhập những gì vào nhánh chính. Trong ví dụ bên dưới, các tính năng của đội xanh và cam sẽ được ra mắt. Những người còn lại sẽ đợi chuyến tàu tiếp theo. Chúng ta có thể đợi lâu hơn một chút, nhưng sau đó chúng ta sẽ có được một con voi ma mút.
Đồng thời, Chuyến tàu phát hành giúp chúng tôi lên kế hoạch cho công việc của mình hiệu quả hơn. Giả sử đội xanh ban đầu dự định hoàn thành một tính năng sau. Nhưng vì mọi người đều biết ngày phát hành nên họ có thể sắp xếp lại kế hoạch của mình một chút để hoàn thành sớm tính năng này.
Hoặc ngược lại, họ có thể nhận ra rằng mình chắc chắn sẽ không đến kịp chuyến tàu tiếp theo và do đó, họ có thể hoàn thành nhiệm vụ một cách an toàn vì họ biết toàn bộ lịch trình.
Trong ví dụ bên dưới, đội xanh muốn tiếp cận bản phát hành và hợp nhất tất cả các thay đổi của họ trước khi phát hành. Nếu không, có thể đã có một nút thắt cổ chai.
Quan trọng nhất, Release Train đã cho chúng tôi khả năng dự đoán theo thiết kế .
Những ví dụ này có vẻ hiển nhiên đối với một số người, nhưng chúng tôi đã giải quyết được vấn đề khi chúng phát sinh. Khi không có vấn đề gì với các bản phát hành, chúng tôi không bận tâm đến việc sử dụng Release Train. Khi vấn đề chồng chất, chúng tôi nhận ra rằng thời cơ đã đến.
Điều đầu tiên chúng tôi làm là viết một RFC . RFC đề cập đến cả quy trình và tài liệu thiết kế mà nhiều công ty sử dụng trước khi họ bắt đầu thực hiện một dự án. Một số sử dụng RFC cụ thể, một số sử dụng ADR và một số chỉ gọi chúng bằng thuật ngữ chung hơn là Design Doc.
Tại Dodo Engineering, chúng tôi sử dụng cả RFC và ADR.
Quá trình RFC của chúng tôi trông như thế này:
Chúng tôi đã soạn thảo một tài liệu RFC;
chúng tôi đã thảo luận về nó trong một nhóm nhỏ, thu thập ý kiến và điều chỉnh;
sau đó RFC được truyền đạt đến một nhóm rộng hơn;
sau đó chúng tôi thực hiện nó;
sau đó, chúng tôi thu thập phản hồi, theo dõi số liệu và đánh giá kết quả.
Cấu trúc của tài liệu RFC dành cho Bản phát hành của chúng tôi như sau:
Khi soạn thảo RFC, chúng tôi đã dựa vào kinh nghiệm của các công ty khác:
Đầu tiên, chúng tôi nghĩ ra quy trình này:
1 nhà phát triển iOS và 1 Android từ một trong các nhóm tính năng;
2 kỹ sư QA.
Theo sơ đồ, Chuyến tàu phát hành của chúng tôi trông như thế này:
Sau một tháng, rõ ràng là mặc dù trải nghiệm đầu tiên rất tuyệt vời,
Vào năm 2021, thử nghiệm hồi quy của chúng tôi thường mất trung bình 3–4 ngày. Chúng tôi đã cố gắng rút ngắn thời gian xuống còn 2–3 ngày vào năm 2022, nhưng đôi khi, thời gian sẽ vượt quá khung thời gian đó. Chúng tôi tiếp tục đề cập đến các trường hợp hồi quy bằng thử nghiệm e2e, nhưng chúng tôi chưa đạt được phạm vi bao phủ 100%. Chúng tôi có phạm vi bao phủ khoảng 70% và 60% các trường hợp hồi quy trên mỗi nền tảng tương ứng.
Bài học rút ra từ điều này là miễn là bạn phải hoàn thành các bài kiểm tra hồi quy trong vài ngày, thì việc chạy chu kỳ phát hành hàng tuần có thể sẽ không thoải mái.
Cuối cùng, chúng tôi đã chuyển sang chu kỳ phát hành 2 tuần và Quá trình phát hành giờ đây trông như thế này:
1 nhà phát triển iOS và 1 Android từ một trong các nhóm tính năng;
2 kỹ sư QA.
Quy trình sẽ trông như thế này nếu mọi thứ diễn ra theo đúng kế hoạch:
Tất cả trông giống như một chu kỳ hàng tuần ngoại trừ việc còn rất nhiều thời gian cho các bản sửa lỗi tiềm năng. Đây là giao diện của nó trong trường hợp kiểm tra hồi quy mở rộng:
Cũng không có gì to tát cả; vẫn còn thời gian cho các bản sửa lỗi nóng.
Mục tiêu chính của chúng tôi là tăng khả năng dự đoán . Nó có thể được chia thành hai phần:
Chúng tôi đã trả lời câu hỏi “Khi nào sẽ có bản phát hành?” bằng cách thực hiện quy trình Đào tạo phát hành. Bây giờ, mỗi nhóm sẽ có thể trả lời câu hỏi “Tính năng của tôi sẽ xuất hiện ở phiên bản nào?” độc lập tại thời điểm họ lập kế hoạch và đánh giá tính năng.
Trước đây, không thể nói chắc chắn vì nhóm khác có thể thực hiện hoặc không thể thực hiện việc phát hành. Giờ đây, mọi chuyện chỉ còn phụ thuộc vào kế hoạch của chính đội đó.
Để xác nhận thêm điều này, chúng tôi đã tiến hành khảo sát giữa các nhà phát triển thiết bị di động, QA và người quản lý sản phẩm, trong đó, cùng với các câu hỏi khác, chúng tôi đã hỏi:
Release Train cũng đã giúp chúng tôi trong việc đóng băng mã và đóng băng phát hành. Chúng tôi đã có một số sự kiện trong số đó, ngoài đêm giao thừa (ví dụ: ngày 1 tháng 9 và một số ngày lễ). Giờ đây, với Release Train, chúng tôi không phải điều chỉnh theo những ngày này bằng cách tạo các nhánh phát hành, thử nghiệm hồi quy, v.v. Phát hành công việc đúng tiến độ; chúng tôi chỉ mở chúng trong các cửa hàng sau.
Ngoài việc giải quyết vấn đề, chúng tôi còn đo lường các số liệu. Chúng ta hãy nhìn vào những cái chính.
Số liệu quan trọng đầu tiên mà chúng tôi đo lường là cam kết về Thời gian thực hiện để phát hành .
Biểu đồ trông như thế này. Tôi đã đánh dấu điểm khi chúng tôi bắt đầu quá trình Đào tạo phát hành bằng một mũi tên.
Biểu đồ cho thấy Thời gian thực hiện đã giảm xuống khoảng sáu ngày. Sáu ngày là thời gian dài hay ngắn?
Có
Tôi tin rằng đối với các ứng dụng di động tiêu chuẩn, thời gian thực hiện lý tưởng nhất là bằng một nửa thời gian của chu kỳ phát hành. Điều này tương đương với việc hợp nhất một nhiệm vụ vào nhánh chính mỗi ngày. Điều này cho biết, nếu chu kỳ phát hành là 14 ngày thì Thời gian thực hiện nên nhắm đến là 7 ngày .
Một số liệu khác mà chúng tôi theo dõi là số lượng lỗi trên mỗi lần hồi quy. Nó mô tả mức độ ổn định của ứng cử viên phát hành. Nếu bản phát hành trước đó đã lâu thì có lẽ chúng ta đã tạo ra rất nhiều mã mới có khả năng chứa nhiều lỗi và chúng ta có thể dành nhiều thời gian hơn cho việc hồi quy và sửa lỗi.
Tại một thời điểm, số liệu này có tới ba lỗi. Những con số cụ thể không quá quan trọng nhưng nhìn chung, bạn có thể thấy xu hướng đã đi xuống.
Tôi sẽ thảo luận ngắn gọn về những số liệu nào cũng được giám sát như một phần của Khóa đào tạo phát hành.
Chúng tôi thích quy trình hiện tại vì chúng tôi nghĩ rằng nó đã đạt được mục tiêu. Chúng tôi cũng biết cách cải thiện nó hơn nữa:
Mặc dù chúng tôi còn tương đối nhỏ nhưng chúng tôi không cần Tàu phát hành. Khi đối mặt với thực tế là chúng tôi không thể dự đoán các bản phát hành, quy mô và số lượng của chúng, chúng tôi đã quyết định triển khai Đào tạo phát hành. Lúc đầu, chúng tôi thử chu kỳ phát hành hàng tuần, nhưng do quá trình hồi quy tốn thời gian nên chúng tôi phải chuyển sang chu kỳ phát hành hai tuần. Chúng tôi đã sống như vậy kể từ đó.
Bây giờ, chúng tôi có khả năng dự đoán về các bản phát hành và các số liệu cho thấy động lực tích cực. Chúng tôi có kế hoạch tăng mức độ bao phủ của các trường hợp hồi quy bằng thử nghiệm e2e, tự động hóa quy trình làm việc với các nhánh và tối ưu hóa quy trình dịch.
Tôi hy vọng bài viết này và kinh nghiệm của chúng tôi sẽ giúp ích cho bạn, đặc biệt nếu bạn đã gặp phải những vấn đề tương tự và chúng khiến bạn phải suy nghĩ về quá trình phát hành.
Cảm ơn bạn rất nhiều vì đã đọc bài viết của tôi. Tôi hy vọng bạn thích nó. Nếu bạn có bất kỳ câu hỏi hoặc đề xuất nào, hãy gửi cho tôi một dòng trong phần bình luận và tôi chắc chắn sẽ đọc nó!
Và
Cũng được xuất bản ở đây