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 development
virtualenv).
Chúng tôi đã tạo ra một ^/srv/trunk
kho 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/lib
cho các mô-đun, /srv/trunk/src
cho phần còn lại của ^/foo/trunk
, ^/srv/trunk/www
cho 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.txt
tệ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ã ...)