หลังจากแบ่งรหัสของเราเป็นบิตที่ใช้ซ้ำได้เราจะทดสอบและปรับใช้อย่างไร


9

เราเริ่มต้นจากนักพัฒนาหนึ่งรายและ repo svn หนึ่งตัวมีรหัสของเราทั้งหมด:

^/foo/trunk/module-a
^/foo/trunk/module-b
^/foo/trunk/module-b/submodule-b1
^/foo/trunk/website1

(ในเวลานี้เป็นการปรับปรุงครั้งใหญ่) หลังจากนี้มีโอกาสเติบโตขึ้นเล็กน้อยเราเริ่มมีปัญหากับการพึ่งพาแบบวนรอบการทดสอบช้าและปัญหาทั่วไปในการใช้รหัสอีกครั้ง (เนื่องจากชุดคุณลักษณะของเว็บไซต์ 1 มีอยู่ในโมดูลทั่วไป)

ต้องการทำให้โมดูลโค้ดเป็นโมดูลและคาดว่าเราจะย้ายไปที่คอมไพล์ในไม่ช้า (และเมื่ออ่านที่คอมไพล์ไม่ชอบ svn mega-repos) เราได้เปลี่ยนไปใช้โครงสร้างที่ละเอียดยิ่งขึ้น:

^/module-a/trunk/
^/module-b/trunk/
^/module-b/trunk/sumbmodule-b1
^/earlier-sub-sub-sub-module-c/trunk
etc. (about 120 such modules)

นี่เป็นแนวคิดที่ยอดเยี่ยม รหัสแบบแยกส่วนเพิ่มเติมชุดทดสอบที่เร็วกว่ามากง่ายต่อเอกสารและอื่น ๆ เราเปิดแหล่งที่มาของส่วนประกอบทั่วไปเพิ่มเติมและทำให้โมดูลทั้งหมดสามารถติดตั้งได้ (ใช้pip install -e .เพื่อติดตั้งในdevelopmentvirtualenv)

เราสร้าง^/srv/trunkพื้นที่เก็บข้อมูลที่มีโครงสร้างโฟลเดอร์ของสภาพแวดล้อมรันไทม์เช่น ^/srv/trunk/libสำหรับโมดูล/srv/trunk/srcสำหรับซากของ^/foo/trunk, ^/srv/trunk/wwwเว็บไซต์ ฯลฯ

และสุดท้าย (รับความคิดจากผู้ที่ฉันเคยทำงานมานานแล้ว [ https://www.perforce.com/perforce/r12.1/manuals/cmdref/client.html] ) เราได้สร้าง "vcs-" ดึง "ไฟล์ข้อความที่แสดงรายการ repos ที่เกี่ยวข้องทั้งหมดและสถานที่ที่ควรเช็คเอาท์ในสภาพแวดล้อม dev และคำสั่งที่เกี่ยวข้องให้ทำ เช่นสาย vcs-fetc:

svn srv/lib/module-a ^/module-a/trunk

จะทำให้ทั้ง (ครั้งแรก)

cd /srv/lib && svn co ^/module-a/trunk module-a

หรือ (หลังจากนั้น)

cd /srv/lib/module-a && svn up

และคล้ายกันสำหรับ repos GitHub (ทั้งแพคเกจผู้ขายของเราเองและเปลี่ยนแปลง / ไม่เปลี่ยนแปลง)

เราใช้กระบวนการ vcs-fetch แบบเดียวกันสำหรับการสร้างสภาพแวดล้อมการผลิต แต่เราพบว่าเราไม่มีทางรู้ได้ว่าเวอร์ชันใดที่ใช้ในการทำงานในการผลิตหลังจากทำการ vcs-fetch

ด้วย mega-repo เราสามารถบันทึกหมายเลขการแก้ไขก่อนที่จะอัพเดทกระทุ้งจากลำตัวและการย้อนกลับนั้นง่ายsvn -r nnn up .มาก ด้วยรหัสทั้ง svn และ git (และหนึ่งโมดูลใน hg) - และ ~ 120 repos จึงไม่ชัดเจนว่าจะทำอย่างไร ..

ฉันอ่านhttp://12factor.net/วันนี้และปัจจัยแรกคือ "รหัสฐานเดียว" ดังนั้นฉันจึงสงสัยว่าถ้าฉันออกจากเส้นทางที่ถูกต้องที่นี่หรือไม่

หนึ่งความคิดที่ฉันมีคือการสร้างสคริปต์การปรับใช้ที่จะสร้าง pip-installable "การปรับใช้" - ล้อและ "มัด" พวกเขาด้วยกันในrequirements.txtไฟล์ จากนั้นการปรับใช้จะเกี่ยวข้องกับการสร้าง virtualenv ใหม่การติดตั้งไฟล์ requirements.txt ที่แสดงรายการล้อการปรับใช้และการสลับ virtualenv ที่ใช้งานอยู่ การย้อนกลับไปสู่ก่อนหน้าจะเป็นการเปลี่ยน virtualenv ย้อนกลับ (แต่ถ้าเราไม่ต้องการเก็บ virtualenv ไว้ตลอดไปมันจะไม่ยอมให้เราย้อนกลับไปที่จุดใดเวลาหนึ่ง - ในประสบการณ์ของฉันที่ไม่เคยต้องการ)

เมื่อมาถึงจุดนี้ฉันสงสัยว่าฉันกำลังเดินไปในทิศทางที่ผิดหรือถ้าฉันไม่ได้เดินไกลพอบนเส้นทางที่ถูกต้อง .. ? (ทุกสิ่งที่ฉันกำลังอ่านจะพูดถึง "แอปของคุณ" และฉันไม่รู้ว่าสิ่งนั้นแปลไปยังเว็บไซต์ 14 แห่งจากฐานรหัสเดียวกัน ... )


ฉันขอสมมติว่าแต่ละองค์ประกอบได้รับการพัฒนาโดยทีมต่าง ๆ ที่มีวัฏจักรการพัฒนาที่แตกต่างกันหรือไม่? ถ้าเป็นเช่นนั้นการแยกที่เก็บออกจากกันนั้นไม่สามารถหลีกเลี่ยงได้ด้วยวิธีใดวิธีหนึ่ง แม้ว่าจะมีคอมไพล์คุณก็จะวางแท็กปล่อยซิงโครไนซ์สำหรับการกำหนดค่าที่สำคัญและมีเสถียรภาพ ดูเครื่องมือซื้อคืนของ Google ความพยายามในการจับคู่เวอร์ชันการพัฒนาโดยข้อมูลเมตาในตัวนั้นค่อนข้างไร้ประโยชน์ การเชื่อมโยงแอปพลิเคชันเข้าด้วยกันผ่านทาง pip นั้นเป็นสิ่งที่ถูกต้องเช่นกัน
Ext3h

หากคุณโปรดระบุ KLOC โดยประมาณ (1,000 บรรทัดของโค้ด) และการวัดไบต์ของโค้ดเราสามารถเข้าใจขนาดได้ง่ายเช่น "รหัส 2,000 บรรทัดรหัสที่มา 50 กิโลไบต์" หรือ "40 KLOC, 2 GB XML" . ดูเหมือนว่าสิ่งที่คุณต้องการเพียงแค่โยกย้ายไปยัง git และ git มีฟังก์ชั่นการนำเข้า คุณสามารถเริ่มต้นโดยการอ่านหนังสือคอมไพล์
Niklas

1
@ Programmer400 โค้ดเบสคือ: .py 670 kloc, .js: 135kloc, .less: 25kloc, .html: 130kloc ใหญ่ แต่ก็ไม่ใหญ่มาก จากสิ่งที่ฉันได้อ่าน git ไม่ชอบ repos ขนาดนี้ดังนั้นฉันคิดว่าเราจะต้องแบ่งเป็น repos ที่เล็กกว่าก่อนที่จะเปลี่ยนเป็น git .. ?
thebjorn

คำตอบ:


2

ดูเหมือนว่าคุณขาดสาขา (หรือมากกว่า 'แท็ก' หรือ 'ปล่อย' สาขา)

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

มันจะทำให้สาขาง่ายขึ้นแม้ว่าจะไม่มีการเปลี่ยนแปลงดังนั้นทุกโมดูลจะเก็บหมายเลขรีลีสไว้เหมือนกันอย่างไรก็ตามแพ็คเกจ OSS ของคุณอาจไม่ชอบที่จะแตกสาขาดังนั้นสิ่งที่ดีที่สุดถัดไปคือการรักษาสคริปต์การพึ่งพา - ดังนั้นเวอร์ชัน 5 ของผลิตภัณฑ์ของคุณต้องการโมดูล OSS X v2 และอื่น ๆ

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

คำแนะนำอีกอย่างคือการรักษาไฟล์ด้วยแต่ละโมดูลที่อธิบายถึงเวอร์ชันปัจจุบันคุณสามารถสร้างสิ่งเหล่านี้โดยอัตโนมัติหากจำเป็นและอาจรวมถึงการเปลี่ยนแปลงแบบเต็มเช่นกัน แต่มันหมายความว่าทุกคนสามารถเห็นว่ามีการปรับใช้รุ่นใด


1

ฉันคิดว่าคุณมีความคิดที่ดีอยู่แล้วฉันได้ใช้ความคิดเหล่านี้เป็นส่วนใหญ่ในโครงการต่างๆตลอดหลายปีที่ผ่านมาและความกังวลหลักของคุณดูเหมือนจะไม่สามารถบอกได้ว่าโมดูลทุกรุ่นที่รวมอยู่ในแพ็คเกจใด พวกเขาขึ้น

ฉันทุกคนต่างแยกพวกมันออกเป็นระดับย่อยโดยเฉพาะอย่างยิ่งถ้าคุณมีหลายทีมและรอบการปล่อยที่แตกต่างกันตามที่ @ Ext3h กล่าว

เนื่องจากฉันไม่แน่ใจว่าแยกโมดูลของคุณออกมาเป็นอย่างไรหรือรายละเอียดที่คุณต้องการให้เป็นแบบจำลองฉันจะแนะนำตัวเลือกบางอย่าง


ใช้ submodules คอมไพล์ ด้วย submodules คุณสามารถจัดเก็บแต่ละโมดูลใน repo git ที่แยกจากกันคล้ายกับการตั้งค่า svn ของคุณและสิ่งที่คุณคิด จากนั้นคุณลิงก์โมดูลเหล่านั้นกับโครงการรูทซึ่งจะมีการอ้างอิงถึงการกระทำที่เกี่ยวข้องของแต่ละ submodule สำหรับแต่ละคอมมิทเอง

IMO นี่เป็นการตั้งค่าที่ดีในทางทฤษฎีและเรียบง่ายพอสมควร ข้อเสียเปรียบหลักคือเวิร์กโฟลว์สำหรับ submodules ค่อนข้างกระอักกระอ่วนนิดหน่อย แต่ดูเหมือนว่าคุณจะได้แก้ไขสิ่งต่าง ๆ ด้วยสคริปต์ก่อนหน้านี้ดังนั้นมันอาจไม่ใช่ปัญหาจริง

ข้อแม้อื่น ๆ คือ submodule ที่กระทำการอ้างอิงจะเป็น SHA1 ไม่มีรายละเอียดใด ๆ ที่มนุษย์สามารถอ่านได้ในสาขาที่คุณเป็นและคุณอาจต้องเช็คเอาต์สาขาที่ถูกต้องด้วยตนเองเมื่อคุณต้องการทำงานโดยตรงใน submodule

อย่างไรก็ตามฉันไม่ได้ใช้รูปแบบนี้อย่างกว้างขวางดังนั้นฉันจึงไม่ทราบว่าปัญหาอาจเกิดขึ้นสำหรับโครงการขนาดใหญ่เช่นของคุณ


อีกทางเลือกหนึ่งคือการใช้ตัวจัดการการพึ่งพาบางประเภท สิ่งนี้ต้องการให้แต่ละโมดูลหรือชุดของโมดูลสามารถเป็นรุ่นบรรจุและเผยแพร่แยกกันและคุณมีระบบที่สามารถดึงแพ็คเกจเหล่านั้นเข้าด้วยกันในแบบที่คุณต้องการเมื่อคุณต้องการ

คุณกำลังแนะนำ pip อยู่แล้วและสิ่งที่ดูเหมือนว่าขาดหายไปจากคำแนะนำของคุณคือการจัดเก็บความต้องการที่เป็นผลลัพธ์ txt พร้อมกับบิลด์หรือใน repo โครงการรากเพื่อให้คุณสามารถสร้าง virtualenv ใหม่ได้ในภายหลังแทนที่จะต้องบันทึก มันบนดิสก์

มีระบบอื่น ๆ เช่นกัน; ฉันตั้งค่าโครงการที่ค่อนข้างใหญ่โดยใช้ Apache Ivy รุ่นที่ปรับแต่งเล็กน้อยซึ่งเป็นทั้งเครื่องมือในการทำแพ็กเกจและเผยแพร่แต่ละโมดูลรวมทั้งดึงพวกเขาเข้าด้วยกันสำหรับโครงการสุดท้าย Ivy ยังเก็บรายการรายการทุกรุ่นของโมดูลทั้งหมดที่คุณอ้างอิงถ้าคุณต้องการสร้างการตั้งค่าในภายหลัง

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