เหตุใด build.number“ การละเมิด” ของการกำหนดเวอร์ชันความหมาย?


35

ผมได้อธิบายที่เสนอสร้างระบบ (Gradle / Artifactory / เจนกินส์ / Chef) ให้เป็นหนึ่งในสถาปนิกอาวุโสของเราและเขาได้แสดงความคิดเห็นกับฉันว่าฉันเรียงลำดับของการไม่เห็นด้วย แต่ผมไม่ได้มีประสบการณ์มากพอที่จะจริงๆชั่งน้ำหนักใน

โครงการนี้สร้างไลบรารี Java (JAR) เป็นสิ่งประดิษฐ์ที่ทีมอื่นนำมาใช้ซ้ำ สำหรับการกำหนดเวอร์ชันฉันต้องการใช้ความหมายของ:

<major>.<minor>.<patch>

โดยที่patchระบุถึงการแก้ไขบั๊ก / ฉุกเฉินminorระบุรีลีสที่เข้ากันได้แบบย้อนหลังและmajorบ่งชี้ถึงการปรับเปลี่ยนขนาดใหญ่ของ API และ / หรือการเปลี่ยนแปลงที่เข้ากันไม่ได้ด้านหลัง

ตราบใดที่การส่งมอบตรงนี้คือสิ่งที่ฉันต้องการ: นักพัฒนาให้รหัสบางส่วน; สิ่งนี้ทริกเกอร์การสร้างสภาพแวดล้อม QA / TEST การทดสอบบางอย่างถูกเรียกใช้ (บางแบบอัตโนมัติและแบบทดสอบด้วยตนเอง) หากการทดสอบทั้งหมดผ่านไปแล้วบิลด์โปรดักชั่นจะเผยแพร่ JAR ไปยัง repo ภายในองค์กรของเรา ณ จุดนี้ JAR ควรได้รับการกำหนดเวอร์ชันอย่างถูกต้องและความคิดของฉันคือการใช้สิ่งbuild.numberที่สร้างขึ้นโดยอัตโนมัติและจัดทำโดยเครื่องมือ CI ของเราเพื่อทำหน้าที่เป็นหมายเลขโปรแกรมแก้ไข

ดังนั้นการกำหนดเวอร์ชันจะเป็น:

<major>.<minor>.<build.number>

อีกครั้งที่build.numberมีให้โดยเครื่องมือ CI

สถาปนิกปฏิเสธสิ่งนี้โดยบอกว่าการใช้หมายเลขการสร้าง CI นั้นเป็น "การละเมิด" ของการกำหนดเวอร์ชันเชิงความหมาย

คำถามของฉันคือ: ถูกต้องและถ้าเป็นเช่นนั้นทำไม? และถ้าไม่ทำไมไม่

คำตอบ:


45

หมายเลขบิลด์ของคุณจะไม่ถูกรีเซ็ตเป็น 0 เมื่อรุ่นรองและรุ่นใหญ่เพิ่มขึ้นนี่เป็นการละเมิดข้อกำหนดส่วนที่ 7 และ 8 ของสเป็ค :

รุ่นรอง Y (xYz | x> 0) จะต้องเพิ่มขึ้นหากมีการแนะนำฟังก์ชั่นใหม่เข้ากันได้กับ API สาธารณะ ต้องเพิ่มขึ้นหากฟังก์ชัน API สาธารณะใด ๆ ถูกทำเครื่องหมายว่าเลิกใช้แล้ว มันอาจจะเพิ่มขึ้นหากมีการใช้งานฟังก์ชั่นใหม่ ๆ หรือการปรับปรุงอย่างมากภายในรหัสส่วนตัว อาจรวมถึงการเปลี่ยนแปลงระดับแพทช์ ต้องแก้ไขเวอร์ชันของตัวแก้ไขเป็น 0 เมื่อมีการเพิ่มรุ่นรอง

รุ่นหลัก X (Xyz | X> 0) จะต้องเพิ่มขึ้นหากมีการแนะนำการเปลี่ยนแปลงย้อนหลังที่เข้ากันไม่ได้กับ API สาธารณะ อาจรวมถึงการเปลี่ยนแปลงเล็กน้อยและระดับแพทช์ ต้องติดตั้ง Patch และเวอร์ชันรองเป็น 0 เมื่อมีการเพิ่มรุ่นหลัก

ดังนั้นต้องมีการจัดเตรียมหมายเลขรุ่น (หลัก, รองลงมา, แพตช์) ด้วยตนเองเนื่องจากจะใช้เพื่อบอกผู้ใช้ของคุณเกี่ยวกับการเปลี่ยนแปลงในที่เดียวโดยไม่ต้องดูการเปลี่ยนแปลงหรือเอกสารอื่น ๆ ของคุณ

หากคุณต้องการรวมหมายเลขบิลด์ของคุณคุณสามารถต่อท้ายหมายเลข+(ส่วนที่ 10):

Build metadata MAY สามารถแสดงได้โดยผนวกเครื่องหมายบวกและชุดของตัวระบุจุดที่คั่นด้วยจุดต่อจากแพทช์หรือเวอร์ชั่นก่อนวางจำหน่าย ตัวระบุต้องประกอบด้วยตัวอักษรและตัวเลข ASCII เท่านั้น [0-9A-Za-z-] ตัวระบุต้องไม่เว้นว่าง Build metadata SHOULD จะถูกละเว้นเมื่อพิจารณาถึงความสำคัญของเวอร์ชัน ดังนั้นสองเวอร์ชันที่แตกต่างกันเฉพาะในข้อมูลเมตาของบิลด์มีความสำคัญเท่ากัน ตัวอย่าง: 1.0.0-alpha + 001, 1.0.0 + 20130313144700, 1.0.0-beta + exp.sha.5114f85


ติดตามด่วน @Residuum (และ BTW +1 สำหรับคำตอบ): ควรหมายเลขรุ่นมักจะมาด้วยตนเองแล้ว? ถ้าไม่สามารถใช้เครื่องมืออะไรแทน CI / หมายเลขบิลด์?
herpylderp

1
@ herpylderp ไม่เลย Tom speceston-Werner's 'spec' เป็นเพียงความเห็นของเขาเท่านั้น บริษัท อื่น ๆ มีมาตรฐานที่แตกต่างกัน (โดยทั่วไปคล้ายกันมาก) ในส่วนใหญ่หมายเลขที่สร้างขึ้นโดยอัตโนมัติเป็นส่วนหนึ่งของเวอร์ชัน ใช้หมายเลขบิลด์ CI เป็นสิ่งที่สมเหตุสมผลที่ต้องทำ
gbjbaanb

คุณยังสามารถใช้เครื่องมือ CI ได้หากเครื่องมืออนุญาตให้คุณทำเลขคณิตกับหมายเลขบิลด์ ไม่ว่าบิลด์ของคุณจะเป็นรุ่นหลักหรือรุ่นรองก็ตามให้เสียบหมายเลขบิลด์นั้นลงในนิพจน์สำหรับสตริงเวอร์ชันที่จะลบออกจากหมายเลขบิลด์ CI ปัจจุบัน ใน Voila คุณเพิ่งรีเซ็ตหมายเลขบิลด์เป็นศูนย์สำหรับเวอร์ชันใหม่โดยไม่ต้องรีเซ็ตหมายเลขบิลด์ของคุณ
KeithS

2
สำหรับฉันฉันใช้ [สำคัญ]. [เล็กน้อย]. [แก้ไข]. [SVN-Version] สำหรับ DLLs และ [สำคัญ]. [เล็กน้อย]. [รอง]. [SVN-Version] สำหรับตัวติดตั้ง หมายเลขบิลด์ CI สำหรับใช้ภายในเท่านั้นเพื่อแสดงว่าบิลด์ที่ล้มเหลวอาจถูกเรียกใช้ซ้ำกับ codebase เดียวกันหลังจากการเปลี่ยนแปลงสภาพแวดล้อม CI (ติดตั้งใบรับรองกุญแจเพิ่มไลบรารีทั่วไปลงใน GAC ฯลฯ )
KeithS

1
@gbjbaanb et al .: ในการสนทนาทุกครั้งเกี่ยวกับ "semantic versioning" ที่ฉันเป็นส่วนหนึ่งคำจำกัดความจากsemver.orgเป็นหัวข้อ ค้นหาเว็บสำหรับ "ความหมายเวอร์ชัน" และอย่างน้อยในหน้าแรกมากับข้อดี / ข้อเสียเกี่ยวกับความหมายจากsemver.org คุณมีอิสระที่จะใช้โครงร่างการกำหนดรุ่นของคุณเอง แต่อย่าเรียกว่าการกำหนดเวอร์ชันเชิงความหมายเนื่องจากคำนี้มีการกำหนดไว้อย่างชัดเจน
Residuum

2

เหตุผลหนึ่งก็คือแพตช์อาจต้องมีหลายบิลด์ดังนั้นถ้าคุณมีเวอร์ชัน 5.7 และคุณต้องการแพตช์เป็น 5.7.1 แต่การแก้ไขข้อบกพร่อง 2 ครั้งแรกของคุณล้มเหลวในการสร้างเมื่อพวกเขาถูกส่งไปยังระบบ CI แล้วคุณจะ ที่ 5.7.3 ก่อนที่คุณจะเปิดตัวแพตช์แรก!

คำตอบก็คือใช้ตัวเลข 4 หลัก (เนื่องจากระบบของ Microsoft มีแนวโน้ม) ที่ 4 คือหมายเลขบิลด์และใช้ "สำหรับข้อมูลเท่านั้น" โดยทั่วไปแล้วคนใส่หมายเลขรุ่นที่เก็บไว้ในนั้น (ถ้าพวกเขาใช้ SVN หรือ TFS หรือคล้ายกัน) ซึ่งเป็นเรื่องที่ดีมากในขณะที่คุณสามารถตรวจสอบว่าการกระทำที่แน่นอนถูกนำมาใช้ในการสร้างไบนารี หากคุณไม่มีสิ่งนั้นหมายเลขการสร้าง CI นั้นเป็นการประมาณที่สมเหตุสมผล (เนื่องจากคุณหวังว่าระบบ CI ของคุณสามารถจดจำหมายเลขการสร้างและผูกเข้ากับประวัติ repo ได้ แต่คุณไม่ได้พึ่งพา CI ระบบจดจำพวกเขา - คุณไม่สามารถลบงานสร้างเก่าได้)

สิ่งหนึ่งที่ควรทราบ Microsoft schema สำหรับการกำหนดเวอร์ชันใช้ตำแหน่งที่ 3 สำหรับหมายเลขบิลด์ Chrome ใช้หมายเลขเพียง 1 หมายเลข Ubuntu ใช้วันที่ ไม่มี "มาตรฐาน" ให้ใช้ยกเว้นว่าตัวเลขทั้งหมดจะต้องเพิ่มขึ้น


5
แม้ว่าจะไม่มีมาตรฐานที่ใช้ในระดับสากลหรือบังคับใช้ แต่คำถามดูเหมือนจะเฉพาะเจาะจงเกี่ยวกับการกำหนดเวอร์ชันทางความหมายซึ่งมีข้อกำหนด
Doval

แม้ที่เสียในสนามเช่นไมโครซอฟท์NuGet เวอร์ชันใช้ semver ในทางเสีย (โดยใช้รูปแบบก่อนวางจำหน่ายสำหรับการสร้างตัวเลข) และทับทิมใช้major.minor.teeny.patch อย่างไรก็ตามเนื่องจากหมายเลขการสร้างสามารถเป็นส่วนหนึ่งของ semver ได้สถาปนิกกำลังพูดคุยกับ tosh (แม้ว่าเป็นที่ยอมรับควรเป็น + build ไม่ใช่ตำแหน่งที่ 3)
gbjbaanb

2
สเป็ค SemVer 2.0 มาจากปี 2013 และ 1.0 สเป็คมาจาก 2012 เท่าที่ฉันสามารถบอกได้ ดูเหมือนว่า NuGet และ Ruby จะทำสิ่งของตัวเองก่อนที่ spec จะปรากฏ มันไม่เหมือนข้อมูลจำเพาะของ SemVer ที่เป็นนวนิยาย มันแค่ทำให้สิ่งที่ผู้คนทำไปแล้วเป็นทางการเพื่อให้เราทุกคนสามารถตกลงกันได้ในที่สุดวิธีหนึ่งที่จะทำได้แทนที่จะทำหลายรูปแบบ
Doval

"คุณมีเวอร์ชัน 5.7 และคุณต้องการแก้ไขเป็น 5.7.1 แต่การแก้ไขข้อบกพร่อง 2 รายการแรกของคุณล้มเหลวในการสร้างเมื่อส่งไปยังระบบ CI จากนั้นคุณจะอยู่ที่ 5.7.3 ก่อนที่คุณจะวางจำหน่ายแพตช์แรก !" โอเค แต่อะไรนะ? ฉันไม่จำสิ่งใดใน semver ที่บอกว่าตัวเลขจะต้องไม่ข้าม
Andy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.