Sau khi phá mã của chúng tôi thành các bit có thể tái sử dụng, làm thế nào để chúng tôi kiểm tra và triển khai?


9

Chúng tôi đã bắt đầu với một nhà phát triển và một repo svn chứa tất cả mã của chúng tôi:

^/foo/trunk/module-a
^/foo/trunk/module-b
^/foo/trunk/module-b/submodule-b1
^/foo/trunk/website1

(tại thời điểm này là một cải tiến lớn). Sau khi điều này có cơ hội phát triển một chút, chúng tôi bắt đầu gặp vấn đề với các phụ thuộc vòng tròn, các thử nghiệm chậm và các khó khăn chung khi sử dụng lại mã (ví dụ: bộ tính năng của website1 đã len lỏi vào mô-đun chung-a).

Muốn mô đun hóa cơ sở mã và hy vọng chúng tôi sẽ sớm chuyển sang git (và đã đọc ở đâu đó git không giống như svn mega-repos), chúng tôi đã chuyển sang cấu trúc chi tiết hơn nhiều:

^/module-a/trunk/
^/module-b/trunk/
^/module-b/trunk/sumbmodule-b1
^/earlier-sub-sub-sub-module-c/trunk
etc. (about 120 such modules)

Đây là khái niệm tuyệt vời. Mã mô-đun nhiều hơn, bộ kiểm thử nhanh hơn nhiều, tài liệu dễ dàng hơn, v.v. Chúng tôi đã mở nguồn một số thành phần chung hơn của chúng tôi và làm cho tất cả các mô-đun pip có thể cài đặt được (sử dụng pip install -e .để cài đặt chúng trong developmentvirtualenv).

Chúng tôi đã tạo ra một ^/srv/trunkkho chứa cấu trúc thư mục của môi trường thời gian chạy, tức là. ^/srv/trunk/libcho các mô-đun, /srv/trunk/srccho phần còn lại của ^/foo/trunk, ^/srv/trunk/wwwcho các trang web, vv

Và cuối cùng (lấy ý tưởng từ perforce, mà tôi đã làm việc từ rất lâu trước đây [ https://www.perforce.com/perforce/r12.1/manuals/cmdref/client.html] ) chúng tôi đã tạo ra một "vcs- tìm nạp "tệp văn bản liệt kê tất cả các repos có liên quan và nơi chúng cần được kiểm tra trong môi trường dev và một lệnh tương ứng để làm như vậy. Ví dụ: dòng vcs-fetc:

svn srv/lib/module-a ^/module-a/trunk

sẽ gây ra một trong hai (lần đầu tiên)

cd /srv/lib && svn co ^/module-a/trunk module-a

hoặc (sau đó)

cd /srv/lib/module-a && svn up

và tương tự cho repos github (cả gói nhà cung cấp riêng và thay đổi / không thay đổi của chúng tôi).

Chúng tôi đã sử dụng quy trình tìm nạp vcs tương tự để tạo môi trường sản xuất, nhưng chúng tôi nhanh chóng phát hiện ra rằng chúng tôi không có cách nào biết phiên bản nào được sử dụng để chạy trong prod sau khi thực hiện vcs-fetch.

Với mega-repo, chúng tôi chỉ có thể lưu ý số sửa đổi trước khi cập nhật prod từ trung kế, và quay trở lại là một cách đơn giản svn -r nnn up .. Với mã trong cả svn và git (và một mô-đun trong hg) - và ~ 120 repos, không rõ ràng làm thế nào để làm điều này ..

Tôi đã đọc http://12factor.net/ hôm nay và yếu tố đầu tiên là "Một cơ sở mã hóa" vì vậy tôi cũng tự hỏi liệu tôi có đi đúng đường ở đây không?

Một ý tưởng tôi có là tạo ra một kịch bản triển khai để tạo ra "triển khai" có thể cài đặt pip -có thể và "bó" chúng lại với nhau trong một requirements.txttệp. Việc triển khai sau đó sẽ liên quan đến việc tạo một virtualenv mới, cài đặt pip tệp tệp.txt.txt liệt kê các bánh xe triển khai và chuyển đổi virtualenv đang hoạt động. Quay trở lại trước đó chỉ liên quan đến việc chuyển lại virtualenv (nhưng trừ khi chúng tôi muốn giữ các virtualenv mãi mãi, nó sẽ không cho phép chúng tôi quay lại bất kỳ thời điểm nào - theo kinh nghiệm của tôi chưa bao giờ cần thiết).

Tại thời điểm này, tôi tự hỏi nếu tôi đi sai hướng, hoặc nếu tôi không đi đủ xa trên con đường bên phải ..? (tất cả mọi thứ tôi đang đọc tiếp tục nói về "ứng dụng của bạn" và tôi không biết làm thế nào để chuyển sang chạy 14 trang web trên cùng một cơ sở mã ...)


Tôi có thể giả định rằng các thành phần riêng lẻ hiện được phát triển bởi các nhóm khác nhau với các chu kỳ phát triển khác nhau không? Nếu vậy, việc phá vỡ kho lưu trữ là không thể tránh khỏi một trong hai cách. Mặc dù với git, sau đó bạn sẽ đặt các thẻ phát hành được đồng bộ hóa cho các cấu hình chính, ổn định. Hãy xem công cụ repo của Google. Cố gắng khớp các phiên bản phát triển bằng dữ liệu meta tích hợp là khá vô ích. Liên kết các ứng dụng với nhau thông qua pip là hoàn toàn hợp pháp là tốt.
Ext3h

Nếu bạn vui lòng bao gồm ước tính KLOC (1000 dòng mã) và số đo byte của mã, chúng ta có thể dễ dàng có được ý tưởng về kích thước, ví dụ "2000 dòng mã. 50 kilobyte mã nguồn." hoặc "40 KLOC, 2 GB XML". . Có vẻ như những gì bạn cần chỉ để di chuyển đến git và git có chức năng nhập khẩu. Bạn có thể bắt đầu bằng cách đọc sách git .
Niklas

1
@ Lập trình viên mã hóa là: .py 670 kloc, .js: 135kloc, .less: 25kloc, .html: 130kloc. Quá lớn, nhưng không lớn. Từ những gì tôi đã đọc git không thực sự thích repos có kích thước này, vì vậy tôi tưởng tượng chúng ta sẽ phải chia thành các repos nhỏ hơn trước khi chuyển sang git ..?
thebjorn

Câu trả lời:


2

Có vẻ như bạn đang thiếu các chi nhánh (hay đúng hơn là các chi nhánh 'thẻ' hoặc 'phát hành').

Thay vì sử dụng phiên bản SVN của bạn làm tài liệu tham khảo để xác định phiên bản nào bạn đang cài đặt, bạn nên tạo một chi nhánh tại phiên bản được phát hành đó. Sau đó, bạn triển khai tên chi nhánh đó.

Việc phân nhánh dễ dàng hơn ngay cả khi không có thay đổi, vì vậy mọi mô-đun đều giữ cùng một số phát hành, tuy nhiên các gói OSS của bạn có thể không thích được phân nhánh mà không có thay đổi, vì vậy điều tốt nhất tiếp theo là giữ một tập lệnh phụ thuộc - vì vậy phiên bản 5 của sản phẩm của bạn yêu cầu mô-đun OSS X v2, v.v.

Bạn sẽ thay đổi tập lệnh của mình để ngừng tham chiếu các phiên bản và thay vào đó hoạt động với tên chi nhánh (mặc dù chúng có thể là bất cứ điều gì, tốt nhất là quyết định một quy ước đặt tên cố định, ví dụ: Release_1_2_3)

Một gợi ý khác là duy trì một tệp với mỗi mô-đun mô tả phiên bản hiện tại, bạn có thể tự động tạo các tệp này nếu cần và cũng có thể bao gồm một thay đổi đầy đủ, nhưng điều đó có nghĩa là bất kỳ ai cũng có thể thấy phiên bản nào được triển khai chỉ bằng cách tìm kiếm.


1

Tôi nghĩ rằng bạn đã có rất nhiều ý tưởng hay, tôi đã sử dụng hầu hết chúng cho các dự án khác nhau trong suốt nhiều năm và mối quan tâm chính của bạn dường như là không thể biết phiên bản nào của tất cả các mô-đun được bao gồm trong một gói nhất định nếu bạn chia tách chúng lên

Tôi là tất cả để tách chúng ra, ở một mức độ chi tiết nào đó, đặc biệt là nếu bạn có nhiều nhóm và chu kỳ phát hành khác nhau, như @ Ext3h đề cập.

Vì tôi không chắc các mô-đun của bạn bị cô lập như thế nào hoặc bạn muốn phiên bản của bạn chi tiết đến mức nào, tôi sẽ đề xuất một số tùy chọn.


Sử dụng mô đun con git. Với các mô hình con, bạn có thể lưu trữ mỗi mô-đun trong một repo git riêng, tương tự như thiết lập svn của bạn và cũng như những gì bạn đang nghĩ đến. Sau đó, bạn liên kết các mô-đun đó với dự án gốc, trong đó sẽ chứa một tham chiếu đến cam kết có liên quan của từng mô hình con, cho mỗi cam kết riêng của nó.

IMO đây là một thiết lập lý thuyết tốt đẹp, và đơn giản hợp lý. Nhược điểm chính là quy trình làm việc cho các mô đun con hơi khó xử, tuy nhiên bạn dường như đã giải quyết những điều như vậy độc đáo với các tập lệnh trước đó, vì vậy nó có thể không phải là vấn đề thực sự.

Một lưu ý khác là các tham chiếu cam kết mô hình con sẽ chỉ là SHA1, không bao giờ có bất kỳ chi tiết nào có thể đọc được của con người về nhánh nào và cuối cùng bạn có thể phải kiểm tra nhánh bên phải khi bạn muốn thực hiện công việc trực tiếp trong mô hình con.

Tuy nhiên, tôi đã không sử dụng mô hình này một cách rộng rãi, vì vậy tôi không biết nó có thể gây ra bao nhiêu vấn đề cho một dự án lớn như của bạn.


Một cách khác là sử dụng một số loại quản lý phụ thuộc. Điều này đòi hỏi mỗi mô-đun hoặc bộ mô-đun có thể được phiên bản, đóng gói và xuất bản riêng lẻ và bạn có một hệ thống có thể kéo các gói đó lại với nhau theo cách bạn muốn khi bạn muốn.

Bạn đã đề xuất pip rồi và điều dường như còn thiếu trong đề xuất của bạn là lưu trữ các yêu cầu kết quả cùng với bản dựng hoặc trong repo dự án gốc, để bạn có thể tạo lại virtualenv sau đó thay vì phải lưu nó trên đĩa.

Có những hệ thống khác nữa; Tôi đã thiết lập một dự án khá lớn bằng cách sử dụng phiên bản Apache Ivy được tùy chỉnh một chút để vừa là công cụ đóng gói và xuất bản từng mô-đun, vừa kéo chúng lại với nhau cho dự án cuối cùng. Ivy cũng lưu trữ một bảng kê khai liệt kê tất cả các phiên bản của tất cả các mô-đun bạn đang tham khảo, nếu bạn cần tạo lại thiết lập sau.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.