การแสดงละครใน Heroku


85

ฉันต้องการที่จะสามารถพุชโค้ดเพื่อdev.myapp.comทดสอบและจากนั้นไปที่www.myapp.comสำหรับการใช้งานจริง เป็นไปได้กับ Heroku หรือไม่?

คำตอบ:


142

ส่วนต่อประสานกับ Heroku เป็นสาขา Git เป็นหลัก Heroku gem ทำงานบางอย่างผ่าน API ของพวกเขา แต่ภายในที่เก็บ Git ของคุณเป็นเพียงสาขาระยะไกลใหม่

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

เมื่อคุณตั้งค่าหลายแอปพลิเคชันบน Heroku คุณควรจะสามารถกำหนดค่าที่เก็บ Git ของคุณได้ดังนี้:

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

ฉันมักจะทำงานในสาขา 'ที่ทำงาน' และใช้ Github สำหรับเจ้านายของฉัน

สมมติว่าเป็นกรณีของคุณขั้นตอนการปรับใช้ของคุณอาจมีลักษณะดังนี้:

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

ขอบคุณ - สิ่งนี้สมเหตุสมผล (ฉันดูดที่คอมไพล์) คำถาม: สมมติว่าฉันกำลังดำเนินการกับการเปลี่ยนแปลงที่ล้ำสมัยใน "edge" ของสาขา ฉันจะส่งสาขานั้นไปยัง staging-myapp โดยไม่ส่งผลกระทบต่อ myapp ได้อย่างไร (ซึ่งกำลังทำงานอยู่ในสาขาหลัก) ไม่git push staging edge work?
Tom Lehman

เพื่อที่จะพาคุณไปคุณก็แค่ผสานขอบเข้ากับสาขาการแสดงละครของคุณและผลักดันมัน สาขาการผลิตของคุณแยกจากกันและสะอาด คุณสามารถแยกสาขาและทำการเปลี่ยนแปลงได้ตลอดเวลาโดยรวมกลับไปที่นั่นเท่านั้น
Luke Bayes

5
แทนที่จะสร้างแอปด้วยสาขาระยะไกล 'heroku' เริ่มต้นและหลังจากลบแล้วคุณสามารถใช้โซลูชันที่ดีกว่านี้ได้เช่น:heroku create yourapp --remote your-remote
dombesz

2
เมื่อคุณตั้งค่านี้ของคุณทุกherokuคำสั่งต้องรวมหรือ--app staging --app productionมีวิธีใดบ้างในการตั้งค่าเริ่มต้น? (การถามเป็นความคิดเห็น b / c สิ่งนี้ดูเหมือนจะเป็นเป้าหมายมากเกินไปที่จะเป็นคำถาม SO เต็มรูปแบบ)
Paul A Jungwirth

3
@PaulAJungwirth หากต้องการตั้งค่าแอป Heroku เริ่มต้นให้ใช้ "git config heroku.remote staging" อื่น ๆ ในเอกสารที่ Heroku devcenter.heroku.com/articles/multiple-environments
grifaton


10

ส่วนสำคัญของคำถามเดิมคือการเชื่อมโยงแอป staging กับโดเมนย่อย (dev.myapp.com) ของแอปหลัก (www.myapp.com) สิ่งนี้ยังไม่ได้รับการกล่าวถึงในคำตอบใด ๆ

ขั้นตอนที่ 1: กำหนดค่าเวอร์ชันการผลิต ('myapp') และการจัดเตรียม ('staging-myapp') ของแอปของคุณตามที่ Luke Bayes ระบุไว้ในคำตอบ

ขั้นตอนที่ 2: ในระบบจัดการโดเมนของคุณ (เช่น GoDaddy):

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

ขั้นตอนที่ 3: กำหนดค่า Heroku เพื่อกำหนดเส้นทาง dev.myapp.com ไปยัง staging-myapp:

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

หลังจากที่ระเบียน CNAME มีเวลาเผยแพร่คุณจะสามารถเรียกใช้แอปการแสดงละครได้ที่ dev.myapp.com


1
วิธีการควบคุมการเข้าถึงเพื่อไม่ให้ปรากฏใน Google ฯลฯ และผู้คนไม่สะดุดกับมันและคิดว่ามันเป็นของจริง? วิธีแก้ปัญหาที่ดี?
brittohalloran

ใช่วิธีที่ง่ายที่สุดคือข้ามขั้นตอน GoDaddy และเข้าถึงเวอร์ชัน "dev" ของแอปของคุณโดยตรงจากโดเมน Heroku โดยใช้ Heroku URL (เช่นstormy-lake-5483.heroku.com ) อย่างไรก็ตามหากคุณต้องการให้ "dev" ปิดโดเมนของคุณตามที่อธิบายไว้ที่นี่คุณสามารถติดตั้งไฟล์ robots.txt เพื่อแจ้งให้ Google, bing, et อัล เพื่อไม่จัดทำดัชนีไซต์ dev ของคุณ ที่จะช่วยให้ไม่อยู่ในเครื่องมือค้นหา
Don Leatham

ฉันลงเอยด้วยการเพิ่มbefore_filterเบ็ดเพื่อapplication_controllerจับทุกอย่างในการจัดเตรียมและบังคับให้ผู้ใช้เข้าสู่ระบบในฐานะผู้ดูแลระบบจากนั้นตั้งค่าคุกกี้ผู้ดูแลระบบเพื่อให้ฉันยังสามารถเห็นแอปจากมุมมองของ 'ไม่ใช่ผู้ดูแลระบบ' ทำงานได้ดีสำหรับฉัน
brittohalloran


7

ตอนนี้สิ่งต่างๆง่ายขึ้น นี่คือวิธีการทำ ...

สร้างแอปสำหรับแต่ละสภาพแวดล้อม

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

สิ่งนี้จะสร้างชื่อ repos ระยะไกลสำหรับแต่ละแอปซึ่งคุณสามารถดู.git/configได้

ตอนนี้คุณสามารถใช้ทั้ง--appหรือ--remoteสวิทช์ที่จะกำหนดเป้าหมายโดยเฉพาะอย่างยิ่งแอป:

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

ตั้งค่าสภาพแวดล้อม Rails

สำหรับแอพพลิเค Rails, Heroku ค่าเริ่มต้นที่ "การผลิต" สภาพแวดล้อม หากคุณต้องการแอปการแสดงละครของคุณจะทำงานในสภาพแวดล้อมการเตรียมการสร้างสภาพแวดล้อมในโครงการของคุณและการตั้งค่าที่สอดคล้องRAILS_ENVและRAKE_ENVตัวแปรสภาพแวดล้อมใน app:

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

กำหนดค่าสภาพแวดล้อม

หากคุณมีตัวแปรการกำหนดค่าอื่น ๆ คุณจะต้องส่งผ่านตัวแปรเหล่านี้สำหรับแต่ละสภาพแวดล้อมด้วย

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

นั่นเป็นความเจ็บปวดอย่างมาก แต่ฉันก็แค่ใช้snappconfig gem แล้ววิ่ง

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

เพื่อโหลดไฟล์กำหนดค่า YAML ของโปรเจ็กต์ของฉันลงใน Heroku

ปรับใช้

ตอนนี้คุณแค่กดไปที่ Heroku ดังนี้:

$ git push staging master
$ git push production master

และโยกย้ายเช่นนี้:

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

(ดูการจัดการหลายสภาพแวดล้อมสำหรับแอป | Heroku Dev Centerสำหรับข้อมูลเพิ่มเติมและทางลัด)


Heroku ไม่สนับสนุนการตั้งค่าRAILS_ENVและสิ่งที่RACK_ENVต้องทำstaging: "อาจเป็นเรื่องยากที่จะสร้างสภาพแวดล้อมที่กำหนดเองอื่นเช่น" การจัดเตรียม "และสร้าง config / environment / staging.rb และปรับใช้กับแอป Heroku ด้วย RAILS_ENV = staging นี่ไม่ใช่แนวทางปฏิบัติที่ดี แต่เราขอแนะนำให้ทำงานในโหมดการใช้งานจริงเสมอและแก้ไขพฤติกรรมโดยการตั้งค่า config vars ของคุณ " เพิ่มเติมได้ที่นี่: devcenter.heroku.com/articles/…
Koen.

@ Koen- การพยายามจัดการการกำหนดค่า Rails ที่ซับซ้อนโดยไม่มีบริบทของสภาพแวดล้อมเป็นสิ่งที่ไม่สามารถทำได้โดยสิ้นเชิงจากประสบการณ์ของฉันไม่ว่าจะใน Heroku หรืออย่างอื่น หากคุณมีสตริงการเชื่อมต่อทั้งชุดคีย์ API และอื่น ๆ สำหรับแอปการจัดเตรียมและอีกชุดสำหรับแอปที่ใช้งานจริงคุณจะตั้งค่าตัวแปรเหล่านั้นแยกกันสำหรับแต่ละรายการหรือไม่ นั่นเป็นเพียงการขอปัญหา - Heroku ให้คำแนะนำที่ไม่ดีที่นี่
Yarin

ขอบคุณ. ฉันกำลังมองหาการจัดเตรียมที่ได้รับ URL ที่แท้จริงอาจเป็นด้วยการกระทำ ฉันคิดว่านี่เป็นสิ่งที่ Zeit Now หรือ Netlify ทำให้มันง่าย
Polv
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.