Sau một tháng dài vất vả thử nhiều thứ khác nhau và lần nào tôi cũng nhận ra,
chỉ vì Heroku sử dụng kho lưu trữ git làm cơ chế triển khai, bạn không nên coi nó như một kho lưu trữ git
nó cũng có thể là rsync, họ đã sử dụng git, đừng để bị phân tâm vì điều này
nếu bạn làm như vậy, bạn mở lòng mình với tất cả các loại tổn thương. Tất cả các giải pháp nói trên đều thất bại thảm hại ở đâu đó:
- nó yêu cầu một cái gì đó phải được thực hiện mọi lúc, hoặc định kỳ, hoặc những điều không mong muốn xảy ra (đẩy mô-đun con, đồng bộ hóa cây con, ...)
- nếu bạn sử dụng một công cụ chẳng hạn để mô-đun hóa mã của mình, Bundler sẽ ăn tươi nuốt sống bạn, thật không thể diễn tả được mức độ thất vọng mà tôi đã có với dự án đó trong quá trình tìm kiếm giải pháp tốt cho việc này
- bạn cố gắng thêm công cụ dưới dạng liên kết git repo +
bundle deploy
- không thành công, bạn cần cập nhật gói mỗi lần
- bạn cố gắng thêm công cụ dưới dạng
:path
+ bundle deploy
- fail, nhóm nhà phát triển coi :path
tùy chọn là "bạn không sử dụng Bundler với tùy chọn gem này" nên nó sẽ không gói để sản xuất
- ngoài ra, mỗi lần làm mới động cơ đều muốn cập nhật ngăn xếp đường ray của bạn -_-
- giải pháp duy nhất tôi đã tìm thấy là sử dụng engine làm
/vendor
liên kết tượng trưng trong quá trình phát triển và thực sự sao chép các tệp để sản xuất
Giải pháp
Ứng dụng được đề cập có 4 dự án trong git root:
- api - tùy theo hồ sơ sẽ chạy trên 2 host heroku khác nhau - upload và api
- web - trang web
- web-old - trang web cũ, vẫn đang di chuyển
- chung - các thành phần phổ biến được trích xuất trong một động cơ
Tất cả các dự án đều có một vendor/common
liên kết biểu tượng nhìn vào gốc của common
động cơ. Khi biên dịch mã nguồn để triển khai cho heroku, chúng ta cần xóa liên kết tượng trưng và rsync, mã của nó để thực tế nằm trong thư mục nhà cung cấp của từng máy chủ riêng biệt.
- chấp nhận danh sách tên máy chủ lưu trữ làm đối số
- chạy một git push trong repo phát triển của bạn và sau đó chạy một git pull sạch trong một thư mục riêng biệt, đảm bảo rằng không có thay đổi bẩn (không giới hạn) nào được đẩy lên máy chủ tự động
- triển khai song song các máy chủ - mọi repo git heroku đều được kéo, mã mới được nhập vào đúng vị trí, được cam kết với thông tin đẩy cơ bản trong nhận xét git commit,
- cuối cùng, chúng tôi gửi một ping với curl để yêu cầu những người chủ sở thích thức dậy và kiểm tra các nhật ký để xem tất cả đã thành rượu chưa
- chơi tốt với jenkins quá: D (tự động đẩy mã đến máy chủ thử nghiệm sau khi thử nghiệm thành công)
Hoạt động rất tốt trong môi trường hoang dã với các vấn đề tối thiểu (không?) 6 tháng nay
Đây là tập lệnh https://gist.github.com/bbozo/fafa2bbbf8c7b12d923f
Cập nhật 1
@AdamBuczynski, nó chưa bao giờ đơn giản như vậy.
Thứ nhất, bạn sẽ luôn có môi trường sản xuất và thử nghiệm ít nhất - và một loạt các cụm chức năng cụ thể thì tệ hơn - đột nhiên 1 thư mục cần ánh xạ đến n dự án heroku như một yêu cầu khá cơ bản và tất cả cần được tổ chức theo cách nào đó tập lệnh "biết" nguồn nào bạn muốn triển khai ở đâu,
Thứ hai, bạn sẽ muốn chia sẻ mã giữa các dự án - bây giờ đến sync_common
phần, các bí ẩn với các liên kết tượng trưng đang được phát triển được thay thế bằng mã rsynced thực tế trên Heroku vì Heroku yêu cầu một cấu trúc thư mục nhất định và gói và rubyge thực sự thực sự làm mọi thứ trở nên xấu đi rất nhiều nếu bạn muốn trích xuất các chuỗi chung thành một viên ngọc
Thứ 3, bạn sẽ muốn cắm CI và nó sẽ thay đổi một chút cách sắp xếp các thư mục con và git repo, cuối cùng trong trường hợp sử dụng đơn giản nhất có thể, bạn kết thúc với ý chính đã nói ở trên.
Trong các dự án khác, tôi cần cài đặt các bản dựng Java, khi bán phần mềm cho nhiều khách hàng, bạn sẽ cần lọc các mô-đun đã được cài đặt tùy thuộc vào yêu cầu cài đặt và không,
Tôi thực sự nên xem xét việc khám phá gói mọi thứ vào một Rakefile hoặc một cái gì đó và làm mọi thứ theo cách đó ...