หลังจากพยายามทำสิ่งต่างๆมานานและยากลำบากและถูกกัดทุกครั้งที่ฉันรู้
เพียงเพราะ Heroku ใช้ที่เก็บ git เป็นกลไกการปรับใช้คุณไม่ควรถือว่าเป็นที่เก็บ git
มันอาจจะเป็น rsync ก็ได้เช่นกันพวกเขาใช้คอมไพล์อย่าวอกแวกเพราะสิ่งนี้
ถ้าคุณทำเช่นนั้นคุณจะเปิดใจรับความเจ็บปวดทุกรูปแบบ วิธีแก้ปัญหาที่กล่าวมาทั้งหมดล้มเหลวอย่างน่าสังเวช:
- จำเป็นต้องทำบางสิ่งบางอย่างทุกครั้งหรือเป็นระยะ ๆ หรือสิ่งที่ไม่คาดคิดเกิดขึ้น (การผลักดันโมดูลย่อยการซิงค์ต้นไม้ย่อย ... )
- ตัวอย่างเช่นหากคุณใช้เอ็นจิ้นในการโมดูลาร์โค้ดของคุณ Bundler จะกินคุณทั้งชีวิตมันเป็นไปไม่ได้ที่จะอธิบายถึงความไม่พอใจที่ฉันมีกับโปรเจ็กต์นั้นในระหว่างการสืบเสาะหาทางออกที่ดีสำหรับสิ่งนี้
- คุณพยายามเพิ่มเอ็นจิ้นเป็น git repo link +
bundle deploy
- ล้มเหลวคุณต้องรวมการอัปเดตทุกครั้ง
- คุณพยายามเพิ่มเอ็นจิ้นเป็น
:path
+ bundle deploy
- ล้มเหลวทีม dev จะพิจารณา:path
ตัวเลือกว่า "คุณไม่ได้ใช้ Bundler กับตัวเลือกอัญมณีนี้" ดังนั้นมันจะไม่รวมกลุ่มสำหรับการผลิต
- นอกจากนี้การรีเฟรชเครื่องยนต์ทุกครั้งต้องการอัปเดตรางของคุณ stack -_-
- ทางออกเดียวที่ฉันพบคือใช้เอ็น
/vendor
จิ้นเป็นsymlink ในการพัฒนาและคัดลอกไฟล์สำหรับการผลิตจริง
การแก้ไขปัญหา
แอปที่เป็นปัญหามี 4 โครงการใน git root:
- api - ขึ้นอยู่กับโปรไฟล์จะทำงานบนโฮสต์ heroku 2 ตัวที่แตกต่างกัน - อัปโหลดและ api
- เว็บ - เว็บไซต์
- เว็บเก่า - เว็บไซต์เก่ายังคงอยู่ในการย้ายข้อมูล
- common - ส่วนประกอบทั่วไปที่สกัดในเครื่องยนต์
โครงการทั้งหมดมีvendor/common
symlink ที่มองไปที่รากของcommon
เครื่องยนต์ เมื่อรวบรวมซอร์สโค้ดสำหรับการปรับใช้กับ heroku เราจำเป็นต้องลบ symlink และ rsync ซึ่งเป็นโค้ดที่จะอยู่ในโฟลเดอร์ผู้ขายของแต่ละโฮสต์ที่แยกกัน
- ยอมรับรายชื่อโฮสต์เป็นอาร์กิวเมนต์
- เรียกใช้ git push ใน repo การพัฒนาของคุณจากนั้นเรียกใช้ clean git pull ในโฟลเดอร์แยกต่างหากตรวจสอบให้แน่ใจว่าไม่มีการพุชการเปลี่ยนแปลงที่สกปรก (ไม่ได้รับคำแนะนำ) ไปยังโฮสต์โดยอัตโนมัติ
- ปรับใช้โฮสต์ในแบบคู่ขนาน - ทุก repo ของ heroku git จะถูกดึงออกรหัสใหม่จะถูก rsynced ในตำแหน่งที่ถูกต้องมุ่งมั่นกับข้อมูลพุชพื้นฐานในคอมเมนต์คอมมิตคอมมิต
- ในตอนท้ายเราส่งปิงพร้อม curl เพื่อบอกให้โฮสต์งานอดิเรกตื่นขึ้นมาและหางท่อนซุงเพื่อดูว่าทั้งหมดไปไวน์หรือไม่
- เล่นได้ดีกับเจนกินส์ด้วย: D (กดรหัสอัตโนมัติเพื่อทดสอบเซิร์ฟเวอร์หลังจากการทดสอบสำเร็จ)
ใช้งานได้ดีมากในป่าโดยมีปัญหาน้อยที่สุด (ไม่?) 6 เดือนแล้ว
นี่คือสคริปต์https://gist.github.com/bbozo/fafa2bbbf8c7b12d923f
อัปเดต 1
@AdamBuczynski ไม่เคยตรงไปตรงมาขนาดนี้
อันดับแรกคุณจะต้องมีสภาพแวดล้อมการผลิตและการทดสอบอย่างน้อยที่สุด - และกลุ่มของฟังก์ชันเฉพาะที่แย่กว่านั้น - ทันใดนั้น 1 โฟลเดอร์ต้องแมปกับโปรเจ็กต์ heroku เป็นความต้องการขั้นพื้นฐานที่ค่อนข้างดีและทุกอย่างจะต้องมีการจัดระเบียบอย่างใด สคริปต์ "รู้" ว่าคุณต้องการปรับใช้แหล่งที่มาใด
อันดับที่ 2 คุณจะต้องการแชร์โค้ดระหว่างโปรเจ็กต์ - ตอนนี้มาถึงแล้วsync_common
ส่วน shennanigans ที่มี symlink ในการพัฒนาถูกแทนที่ด้วยโค้ด rsynced จริงบน Heroku เพราะ Heroku ต้องการโครงสร้างโฟลเดอร์และบันเดิลเลอร์และทับทิมจริงๆทำให้สิ่งที่น่าเกลียดแย่มากถ้าคุณ ต้องการแยกเธรดทั่วไปเป็นอัญมณี
อันดับที่ 3 คุณจะต้องเสียบ CI และมันจะเปลี่ยนวิธีการจัดระเบียบโฟลเดอร์ย่อยและ git repo เล็กน้อยในท้ายที่สุดในกรณีการใช้งานที่ง่ายที่สุดที่คุณจะได้รับจากส่วนสำคัญดังกล่าว
ในโปรเจ็กต์อื่น ๆ ฉันต้องเสียบ Java builds เมื่อขายซอฟต์แวร์ให้กับลูกค้าหลายรายคุณจะต้องกรองโมดูลที่ติดตั้งขึ้นอยู่กับข้อกำหนดในการติดตั้งและสิ่งที่ไม่
ฉันควรพิจารณาสำรวจการรวมสิ่งต่าง ๆ ไว้ใน Rakefile หรืออะไรบางอย่างและทำทุกอย่างในลักษณะนั้น ...