Phiên bản dàn dựng trên Heroku


85

Tôi muốn có thể đẩy mã để dev.myapp.comthử nghiệm và sau đó để www.myapp.comsử dụng trong sản xuất. Điều này có khả thi với Heroku không?

Câu trả lời:


142

Giao diện của bạn với Heroku về cơ bản là một nhánh Git. Đá quý Heroku thực hiện một số hoạt động thông qua API của chúng, nhưng trong kho lưu trữ Git của bạn, nó chỉ là một nhánh từ xa mới.

heroku create yourapp # production
git br -D heroku # delete the default branch

heroku create staging-yourapp # staging
git br -D heroku # delete the default branch

Sau khi thiết lập nhiều ứng dụng trên Heroku, bạn sẽ có thể định cấu hình kho lưu trữ Git của mình như sau:

git remote add staging git@heroku.com:staging-yourapp.git
git push origin staging

git remote add production git@heroku.com:yourapp.git
git push origin production

Tôi thường làm việc trong một chi nhánh 'đang làm việc' và sử dụng Github cho chủ của tôi.

Giả sử đó là trường hợp của bạn, quy trình triển khai của bạn có thể trông giống như sau:

git co -b working
# do some work

# push to github:
git co master
git merge working
git push

# push to staging:
git co staging
git merge master
git push origin staging

# push to production
git co production
git merge master
git push origin production

Cảm ơn - điều này có ý nghĩa gì đó (Tôi rất thích git). Câu hỏi: Giả sử tôi đang thực hiện một số thay đổi mới nhất trên nhánh "edge". Làm cách nào để tôi có thể đẩy nhánh đó sang staging-myapp mà không ảnh hưởng đến ứng dụng của tôi (hiện đang chạy trên nhánh chính)? Không git push staging edge work?
Tom Lehman

Vì lợi ích của bạn, bạn chỉ cần hợp nhất cạnh vào nhánh dàn của mình và đẩy nó. Chi nhánh sản xuất của bạn tách biệt và sạch sẽ. Bạn luôn có thể phân nhánh nó và thực hiện các thay đổi chỉ hợp nhất trở lại đó.
Luke Bayes

5
Thay vì tạo ra các ứng dụng với mặc định 'Heroku' chi nhánh từ xa và sau khi xóa nó, bạn có thể sử dụng một giải pháp tốt hơn nhiều như:heroku create yourapp --remote your-remote
dombesz

2
Khi bạn thiết lập điều này, tất cả các herokulệnh của bạn cần phải bao gồm --app staginghoặc --app production. Có cách nào để đặt mặc định không? (Yêu cầu như một lời nhận xét b / c này dường như quá nhắm mục tiêu đến là một câu hỏi chính thức SO.)
Paul A Jungwirth

3
@PaulAJungwirth Để đặt ứng dụng Heroku mặc định, hãy sử dụng một cái gì đó như "git config heroku.remote staging". Thông tin thêm về tài liệu Heroku tại devcenter.heroku.com/articles/multiple-enosystem .
grifaton


10

Phần quan trọng của câu hỏi ban đầu là về việc liên kết ứng dụng dàn dựng với miền phụ (dev.myapp.com) của ứng dụng chính (www.myapp.com). Điều này chưa được đề cập trong bất kỳ câu trả lời nào.

Bước 1: Định cấu hình cả phiên bản sản xuất ('myapp') và phiên bản dàn dựng ('staging-myapp') của ứng dụng của bạn như được chỉ ra trong câu trả lời của Luke Bayes

Bước 2: Trong hệ thống quản lý miền của bạn (ví dụ: GoDaddy):

Create a CNAME record:  dev.myapp.com 
that points to:   proxy.heroku.com

Bước 3: Định cấu hình Heroku để định tuyến dev.myapp.com đến staging-myapp:

heroku domains:add dev.myapp.com --app staging-myapp

Sau khi bản ghi CNAME có thời gian phổ biến, bạn sẽ có thể chạy ứng dụng dàn dựng của mình tại dev.myapp.com.


1
làm thế nào về kiểm soát truy cập để nó không hiển thị trên google, v.v. và mọi người không tình cờ nhìn thấy nó và nghĩ rằng nó là thứ thật? bất kỳ giải pháp tốt đẹp?
brittohalloran

Có, cách dễ nhất là bỏ qua bước GoDaddy và truy cập phiên bản "nhà phát triển" của ứng dụng của bạn trực tiếp từ miền Heroku bằng URL Heroku. (ví dụ: Stormy-lake-5483.heroku.com. ) Tuy nhiên, nếu bạn muốn loại bỏ 'nhà phát triển' khỏi miền của mình như được mô tả ở đây, bạn luôn có thể cài đặt tệp robots.txt để cho google, bing, et. al. để không lập chỉ mục trang web nhà phát triển của bạn. Điều đó sẽ giúp ngăn chặn nó khỏi các công cụ tìm kiếm.
Don Leatham

Tôi đã kết thúc việc thêm một before_filterhook vào của mình application_controllerđể nắm bắt MỌI THỨ trong quá trình dàn dựng và buộc người dùng đăng nhập với tư cách quản trị viên, sau đó đặt cookie quản trị để tôi vẫn có thể xem ứng dụng từ quan điểm của một 'người không phải quản trị viên'. Làm việc khá tốt cho tôi.
brittohalloran

8

Bạn nên kiểm tra heroku_san

Nó hoạt động khá tốt khi tung hứng với các môi trường trên heroku.


7

Mọi thứ dễ dàng hơn bây giờ. Đây là cách bạn làm điều đó ...

Tạo ứng dụng cho từng môi trường

$ heroku create myapp --remote production
$ heroku create myapp-staging --remote staging

Thao tác này sẽ tạo các kho lưu trữ từ xa được đặt tên cho từng ứng dụng mà bạn có thể thấy trong đó .git/config.

Giờ đây, bạn có thể sử dụng các công tắc --app hoặc --remote để nhắm mục tiêu một ứng dụng cụ thể:

$ heroku info --app myapp-staging
$ heroku info --remote staging

Đặt môi trường Rails

Đối với các ứng dụng Rails, Heroku mặc định là môi trường "sản xuất" . Nếu bạn muốn ứng dụng dàn của mình chạy trong môi trường dàn, hãy tạo môi trường trong dự án của bạn và đặt các biến môi trường RAILS_ENVRAKE_ENV tương ứng trên ứng dụng:

$ heroku config:set RACK_ENV=staging RAILS_ENV=staging --remote staging

Định cấu hình môi trường

Nếu bạn có các biến cấu hình khác, bạn cũng cần phải chuyển chúng vào cho từng môi trường.

$ heroku config:set AWS_KEY=abc --remote staging
$ heroku config:set AWD_SECRET=123 --remote staging
...etc

Đó là một nỗi đau lớn, vì vậy tôi chỉ sử dụng đá quý snappconfig của mình và chạy

$ rake heroku:config:load[myapp-staging]

để tải các tệp cấu hình YAML của dự án của tôi vào Heroku.

Triển khai

Bây giờ bạn chỉ cần đẩy đến Heroku như thế này:

$ git push staging master
$ git push production master

và di chuyển như thế này:

$ heroku run rake db:migrate --remote staging
$ heroku run rake db:migrate --remote production

(Xem Quản lý nhiều môi trường cho một ứng dụng | Trung tâm nhà phát triển Heroku để biết thêm thông tin và các phím tắt.)


Thiết RAILS_ENVRACK_ENVđể stagingkhông được khuyến khích bởi Heroku: "Nó có thể được hấp dẫn để tạo ra một môi trường tùy chỉnh như‘dàn’và tạo một config / môi trường / staging.rb và triển khai một ứng dụng với RAILS_ENV = dàn Heroku Đây không phải là một thói quen tốt. . Thay vào đó, chúng tôi khuyên bạn nên luôn chạy ở chế độ sản xuất và sửa đổi bất kỳ hành vi nào bằng cách đặt các vars cấu hình của bạn. " Thông tin thêm về điều này tại đây: devcenter.heroku.com/articles/…
Koen.

@ Koen- Cố gắng quản lý các cấu hình Rails phức tạp mà không có bối cảnh môi trường là hoàn toàn không thực tế theo kinh nghiệm của tôi, cho dù trên Heroku hay cách khác. Nếu bạn có một tập hợp toàn bộ các chuỗi kết nối, khóa API, v.v. cho ứng dụng dàn dựng của mình và một tập hợp khác cho ứng dụng sản xuất của bạn, bạn có thực sự định đặt các vars cấu hình đó riêng lẻ cho từng loại không? Đó chỉ là rắc rối thôi- Heroku đang đưa ra lời khuyên tồi tệ ở đây.
Yarin

Cảm ơn. Tôi đang tìm cách thực sự nhận được URL thực, có thể là với commithash. Tôi nghĩ đây là điều mà Zeit Now hoặc Netlify đã thực hiện dễ dàng.
Polv
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.