2012-06-24 66 views
15

Tôi đang làm việc trên một ứng dụng web, lưu trữ mã nguồn trên Github và chạy ứng dụng trên Heroku. Tất cả mọi thứ hoạt động tốt, nhưng tôi có vấn đề tôi không thể quấn quanh đầu. Trước khi triển khai mã của tôi, tôi chạy một số tập lệnh để tối ưu hóa mã (khai thác, ghép nối các tệp, v.v.). Ứng dụng heroku chỉ sử dụng phiên bản được tối ưu hóa của ứng dụng.Chiến lược triển khai Heroku + Github

Về cơ bản, tôi có hai thư mục: devproduction. Dev chứa mã nguồn tôi viết, production được tạo bởi các tập lệnh xây dựng của tôi (tôi sử dụng lệnh grunt và requirejs). Hiện tại, cả hai thư mục đều nằm trong kho lưu trữ Git của tôi và cả hai đều được đẩy tới Github và Heroku. Điều tôi thích là chỉ có dev trên Github và chỉ production trên Heroku. Tôi đọc một số bài viết về cách thiết lập các nhánh khác nhau cho Heroku, như described in this blog. Tôi có thể thiết lập chi nhánh sản xuất và chỉ có thư mục production trong đó trong khi vẫn giữ thư mục dev với chi nhánh chính của mình không? Hoặc tôi sẽ cần kho riêng biệt?

Có ai đã thử điều gì đó tương tự không? Tôi cho rằng đây không phải là thứ gì đó bình thường.

Trả lời

7

Bạn có thể chỉ đơn giản xem xét sử dụng tệp heroku .slugignore (ref https://devcenter.heroku.com/articles/slug-compiler).

Tệp này sẽ cho phép bạn xóa thư mục dev khỏi gói mà Heroku triển khai cho từng cá thể máy chủ, trong khi cho phép bạn giữ tất cả mã trong cùng một kho lưu trữ.

Gốc của vấn đề đang suy nghĩ về chiến lược triển khai như là nơi bạn tải lên bit cuối cùng cho máy chủ của mình, trong đó các bit là một vật phẩm xây dựng kho lưu trữ của bạn. Trong những trường hợp như vậy, các bản dựng thường được lưu trữ và lưu trữ riêng biệt với nguồn.

Mô hình của Heroku hơi khác với mô hình này giả định kho lưu trữ của bạn là vật phẩm để triển khai. Sự khác biệt là nhẹ, nhưng trong trường hợp của bạn, nó chỉ có nghĩa là bạn cần phải cam kết kho lưu trữ của bạn các bit mà bạn muốn heroku phục vụ.

Một cách khác để suy nghĩ về điều này là bạn có thể thực hiện mà không cần thư mục production và là một phần của việc khởi động máy chủ, tập lệnh sẽ được chạy để tạo các tệp thư mục production. Điều này sẽ cho phép bạn xóa thư mục production và giữ cho kho lưu trữ của bạn luôn sạch sẽ với chi phí chạy quy trình này trên mỗi lần khởi động máy chủ của bạn. Điều này có thể chứng minh là cực kỳ tốn kém và không mong muốn (có giới hạn thời gian Heroku chờ đợi cho một máy chủ khởi động trước khi nó từ bỏ nó), nhưng hy vọng giúp cung cấp một số rõ ràng xung quanh mối quan hệ Heroku và git.

+1

Đây là những gì tôi đang làm bây giờ ... Tôi tạo ra buildpack tùy chỉnh của riêng tôi (xem https://github.com/mbuchetics/heroku-buildpack-nodejs-grunt) sử dụng Grunt để xây dựng thư mục sản xuất trên mọi triển khai. Nó hoạt động tốt và tôi có thể giữ tất cả các công cụ sản xuất ra khỏi repo git. – slurmomatic

+1

Một tính năng khác mà tôi đã sử dụng trong buildpack chuẩn được hỗ trợ thông qua NPM. Bạn có thể thêm một tập lệnh '" postinstall "' vào 'package.json' và chạy mã tùy ý theo cách này. https://npmjs.org/doc/scripts.html – mikegradek

2

Đó là một chút bối rối vì:

  • dev của bạn và đại diện productionmôi trường, và thư mục với tạo nội dung:
    Họ không phải ở trong một VCS, nhưng tự động sản xuất bởi một tập lệnh sẽ nhận ra môi trường mà nó đang chạy và tạo thư mục phù hợp.

  • các devproduction đề cập trong bài viết bạn đang đề cập đến "Deploying multiple environments on Heroku (while still hosting code on Github)" đại diện cho xúc tiến giai đoạn, và là chi nhánh .

Sử dụng nhánh là tốt, chỉ để tách các biến thể mã (trong các nhánh nói), không phải để lưu trữ mã được tạo ra.
Vấn đề quản lý phát hành cụ thể của bạn (tức là tạo phân phối phù hợp) nên được quản lý bởi tập lệnh (có thể được kiểm soát phiên bản cùng với mã của bạn), và sử dụng như móc, chẳng hạn, để tạo và triển khai đúng bộ mã ở đúng nơi.

+0

'dev' không chứa nội dung được tạo, đó là mã nguồn tôi viết trong đó. 'sản xuất' là như nhau nhưng với các tập tin tối ưu hóa. Tôi biết sự khác biệt đối với các chi nhánh. Vấn đề tôi gặp phải là việc triển khai Heroku dựa trên kho Git. Tôi chỉ có thể triển khai những gì trong kho lưu trữ. Tôi không thể tách rời giữa những gì đang được đẩy đến Github và những gì đang được đẩy đến Heroku (nếu không sử dụng các nhánh). – slurmomatic

+0

@slurmomatic trong trường hợp đó, câu trả lời của Kevin (mà tôi đã upvoted) nên phù hợp hơn với quá trình quản lý phát hành Heroku hơn câu trả lời của tôi (tổng quát hơn). – VonC

5

Tình huống này hơi khác thường. Nhưng đây là một số ý tưởng:

  • Tôi sử dụng quy trình tương tự như quy trình bạn đã tham chiếu.
  • Tôi chỉ muốn tạo một ứng dụng duy nhất làm câu nói của bạn. Tôi sẽ tạo nó bắt đầu một kho lưu trữ git mới trong thư mục dev của bạn.
  • Sau đó tôi muốn đề xuất chiến lược triển khai tương tự như chiến lược được mô tả trong câu trả lời này: https://stackoverflow.com/a/8058194/267025. Tôi đã điều chỉnh nó bên dưới:

Tạo một tệp rake với hai tác vụ trong đó: rake deploy:productionrake deploy:postprocess_files.Các tác vụ đó có thể trông giống như sau:

namespace :deploy do 

    task :production do 
    puts "turn on 'maintenance page' on heroku" 
    system "heroku maintenance:on" 

    puts "deploying to production" 
    system "git push heroku-prod master" 

    puts "post processing files..." 
    system "heroku run rake production:postprocess_files" 

    puts "take off maintenance page" 
    system "heroku maintenance:off" 

    puts "done" 
    end 

    task :postprocess_files do 
    puts "run postprocessing of files on heroku" 
    ... add commands here to post process the files. 
    end 
end 

Sau đó triển khai sản xuất bằng cách sử dụng rake deploy:production thay vì đẩy trực tiếp bằng git. Các tập tin cào sẽ sau đó:

  1. thiết lập các trang bảo trì,
  2. đẩy sản xuất,
  3. làm xử lý bài viết của bạn các tập tin,
  4. đi xuống trang bảo trì.

Lưu ý rằng nhiệm vụ cào thứ hai trong tập tin của bạn có các lệnh để thực hiện xử lý bài trên các tập tin của bạn và được viện dẫn để chạy trên Heroku bởi nhiệm vụ cào đầu tiên.

Thay vào đó, có thể bạn có thể mở rộng nội dung: nhiệm vụ biên dịch trước mà Heroku chạy như một phần của từng triển khai. Đó là cơ bản những gì bạn đang làm anyway - chuẩn bị tài sản để triển khai cho sản xuất.

+2

+1: cơ chế triển khai chính xác hơn – VonC

+0

Tôi không nghĩ điều này có hiệu quả. Trong tài liệu về các quy trình Một lần (https://devcenter.heroku.com/articles/oneoff-admin-ps), nó nói "Mỗi dyno có hệ thống tệp tạm thời riêng, không được chia sẻ với bất kỳ dyno nào khác, được loại bỏ ngay sau đó khi bạn ngắt kết nối. Điều này sẽ làm việc tốt cho các kịch bản cơ sở dữ liệu, nhưng không phải cho một cái gì đó mà sửa đổi hệ thống tập tin. Hay tôi đang thiếu một cái gì đó? Ngoài ra, tại sao tình huống của tôi lại không ổn? – slurmomatic

+1

Tôi tin rằng bạn có thể đúng - ngoài ra, tôi nhận ra sau khi tôi đã viết điều này rằng bạn đang triển khai mã node.js và không phải là mã đường ray. –

2

Cá nhân tôi thích giải pháp này: https://github.com/mbuchetics/heroku-buildpack-nodejs-grunt Và hãy nhìn vào này quá: https://medium.com/the-javascript-collection/how-to-deploy-a-grunt-project-on-heroku-c227cb1ddc56

Đó là một cách trung thực một trong những cách sạch nhất.

+0

Tốt! Đây thực sự là dự án của riêng tôi. Thực sự vui mừng những người khác thấy nó hữu ích như tôi. – slurmomatic

Các vấn đề liên quan