Monday 15 January 2018

إستراتيجية إصدار البرامج


إستراتيجية إصدار البرامج
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
ما هي إستراتيجية إصدار إصدارات التطبيقات؟ [مكرر]
هذا السؤال له إجابة هنا:
وأود أن تكون مهتمة للحصول على آراء المجتمع سو حول أفضل استراتيجية إصدار الإصدارات التطبيق.
كيف يمكنك تتبع رقم إصدار التطبيق؟ هل لديك تعريف رسمي لما يمثله كل رقم / حرف في هذا الإصدار؟
ماذا تعني الأرقام / السلاسل المختلفة في إصدار التطبيق لتطبيقك؟
هل تستخدم أي نظام تحديث تلقائي في تطبيقاتك (على سبيل المثال، شيء مثل سباركل) ومدى حسن تصرفك من أجلك؟
هل لديك إجراء تحديث منفصل للاختبار بيتا أو اختبار ما قبل النشر من التطبيق الخاص بك؟
تم وضع علامة على أنها مكررة من قبل غنات، ميكلت، كيليان فوث، GlenH7، رين هنريش 29 أبريل '13 في 2:42.
وقد طرح هذا السؤال من قبل، ولديه بالفعل جواب. إذا كانت هذه الإجابات لا تعالج سؤالك بشكل كامل، فيرجى طرح سؤال جديد.
ترحيل من ستاكوفيرفلو 18 مايو 1111 في 13:48.
وجاء هذا السؤال من موقعنا لمبرمجين المحترفين والمتحمسين.
كيف يمكنك تتبع رقم إصدار التطبيق؟ هل لديك تعريف رسمي لما يمثله كل رقم / حرف في هذا الإصدار؟
ماذا تعني الأرقام / السلاسل المختلفة في إصدار التطبيق لتطبيقك؟
أستخدم ما يلي:
الرائد - الإصدار الرئيسي هو الافراج واضح للمنتج. زادت عندما تكون هناك تغييرات كبيرة في الأداء الوظيفي.
طفيفة - يتم زيادة إصدار طفيفة عندما يتم إضافة ميزات جديدة فقط أو إصلاحات الشوائب الرئيسية.
ترقية / تصحيح - ترقية يشير إلى استبدال منتج مع إصدار أحدث من product. It يتزايد فقط عندما يتم توفير الترقية على إصدار رئيسي معين. يبدأ إصدار باتش مع 0 وتزايد فقط عندما تم حل علة.
بناء لا - يتم زيادة رقم البناء عند إنشاء بنية جديدة.
هل تستخدم أي نظام تحديث تلقائي في تطبيقاتك (على سبيل المثال، شيء مثل سباركل) ومدى حسن تصرفك من أجلك؟
نحن نستخدم أداة البناء الذي يبني تلقائيا التطبيق في الليل الذي نسميه بناء ليلا وهذا يزيد بناء عدد في كل مرة يتم إنشاء بناء.
هل لديك إجراء تحديث منفصل للاختبار بيتا أو اختبار ما قبل النشر من التطبيق الخاص بك؟
لا. اختبارات اختبار على بناء ليلا في كل صباح الذي نسميه بات (بناء قبول الاختبار) والتحقق من بناء ليلا.
واسمحوا لي أن ألاحظ أولا أنه لا يوجد اتفاق فيما يبدو بشأن استراتيجية "أفضل". يمكنني فقط مشاركة تجربتي في مشروع الحالي.
يتم تعريف إصدار النظام يدويا في خاصية بناء. يحدث ذلك عندما يوافق الفريق على إصدار جديد. كما فيرسيونينغ إضافية نستخدم رقم البناء الذي يتم إنشاؤه تلقائيا من قبل بناء سي.
نحن نتابع بشكل فضفاض نظام تسمية أوبونتو YY. MM. version. patch_buildNumber كما وجدنا أن إصدار الرائد. مينور يعبر عن توقعات العملاء؛)
لا توجد تحديثات تلقائية كما أن التطبيق يجب أن تدحرجت من قبل المشرفين.
إن الإصدارات التجريبية أكثر تواترا من إصدارات غا، ولكن يجب أن يكون ذلك كله.
اختبرت العديد من أنظمة الإصدار والآن أنا سعيد جدا مع هذا واحد:
يتم تعيين الرائد بشكل يدوي والرجوع إلى إصدار بما في ذلك التحسينات الرئيسية يتم تعيين الصغرى أيضا يدويا وتشير إلى إصدار ترقية / صيانة، بما في ذلك تحسينات طفيفة & أمب؛ الإصلاحات يتم إنشاء المراجعة تلقائيا وتشير إلى مراجعة دقيقة في المستودع.
آخر واحد يسمح لنا أن تكون مرنة جدا مع فيرسيونينغ. يمكننا أن نشحن إصدارات متعددة للعديد من العملاء، ولا تزال قادرة على تصحيح & أمب؛ إصلاح مع سهولة عن طريق الحصول على نسخة محددة من ريبوس، ثم دمج مرة أخرى مع الجذع.
بناء، التعبئة والتغليف & أمب؛ النشر مؤتمتة بالكامل. الإجراء اليدوي الوحيد هو عندما نقوم بنقل الحزمة الأخيرة إلى ملقم الإنتاج بواسطة فتب. نحن نريد للحفاظ على السيطرة على ذلك لضمان أننا لا تسليم حماقة في الإنتاج. يذهب إلى مرحلة أولية حيث الأوائل يمكن قراءة ملاحظات الافراج ثم تقرر تحميل واستخدام النسخة. يمكن للعملاء الذين يواجهون البق محددة الحصول على نسخة ثابتة سريع جدا باستخدام واحد من هذه الإصدارات.
يمكنني استخدام الإصدار الدلالي لمكتباتي مفتوحة المصدر وتجد أنه من الأسهل بكثير للعمل مع المكتبات الأخرى التي تفعل كذلك. وهو يوفر أساسا مشتركا لفهم ما قد يعنيه تغيير الإصدار. هل المكتبة لا تزال في مرحلة تجريبية؟ هو إصدار فقط لإصلاحات الشوائب؟ هل سيكون هناك تغييرات متقطعة في واجهة برمجة التطبيقات؟
وهو في الأساس تدوين لأفضل ممارسات الإصدار التي تستخدمها بالفعل معظم المشاريع المفتوحة المصدر.

إستراتيجية إصدار البرامج
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
أفضل الممارسات: إصدار البرامج [كلوسيد]
هل هناك أي دليل أو معيار أفضل الممارسات كيفية إصدار البرامج التي تتطور في وقت فراغك للمتعة، ولكن مع ذلك سوف تستخدم من قبل بعض الناس؟ أعتقد أنه من الضروري إصدار مثل هذه البرامج بحيث تعرف عن الإصدار الأول الذي تتحدث عنه (على سبيل المثال لإصلاح الأخطاء والدعم وما إلى ذلك).
ولكن أين يمكنني بدء الإصدار؟ 0.0.0؟ أو 0.0؟ ثم كيف يمكنني زيادة الأرقام؟ تغيير الإصدار الرئيسي. مينور؟ ولا ينبغي أن أي التزام لنظام مراقبة الإصدار يكون نسخة أخرى؟ أو هل هذا فقط للإصدارات التي تستخدم بطريقة منتجة؟
مغلقة في المقام الأول على أساس الرأي من قبل البومى، أنيموسون & # 9830؛ 2 أغسطس 1313 في 15:43.
العديد من الأسئلة الجيدة تولد قدرا من الرأي استنادا إلى خبرة الخبراء، ولكن الإجابات على هذا السؤال سوف تميل إلى أن تستند بشكل كامل تقريبا إلى الآراء، بدلا من الحقائق أو المراجع أو الخبرة المحددة. إذا كان يمكن إعادة صياغة هذا السؤال لتناسب القواعد في مركز المساعدة، يرجى تعديل السؤال.
مقفل بواسطة فليكسو & # 9830؛ مار 21 في 21:32.
هذا السؤال موجود لأنه ذو أهمية تاريخية، ولكنه لا يعتبر سؤالا جيدا حول الموضوع لهذا الموقع، لذا يرجى عدم استخدامه كدليل على أنه يمكنك طرح أسئلة مشابهة هنا. يتم تجميد هذا السؤال وإجاباته ولا يمكن تغييره. مزيد من المعلومات: مركز المساعدة.
12 أجوبة.
يجب أن تبدأ مع الإصدار 1، إلا إذا كنت تعرف أن النسخة الأولى التي "الإفراج" غير مكتملة بطريقة أو بأخرى.
أما بالنسبة لك كيفية زيادة الإصدارات، وهذا متروك لكم، ولكن استخدام الرئيسية، طفيفة، بناء الترقيم كدليل.
ليس من الضروري أن يكون لديك كل إصدار تلتزم التحكم المصدر كإصدار آخر - سيكون لديك قريبا عدد كبير جدا نسخة في الواقع. تحتاج فقط إلى زيادة رقم الإصدار (في بعض الطريق) عند إصدار نسخة جديدة إلى العالم الخارجي.
حتى إذا قمت بإجراء خطوة تغيير كبير من الإصدار 1.0.0.0 إلى الإصدار 2.0.0.0 (قمت بتغيير من وينفورمز إلى وف على سبيل المثال). إذا قمت بإجراء خطوة تغيير أصغر من 1.0.0.0 إلى 1.1.0.0 (قمت بإضافة دعم لملفات بابوا نيو غينيا). إذا قمت بإجراء تغيير طفيف ثم انتقل من 1.0.0.0 إلى 1.0.1.0 (قمت بإصلاح بعض الخلل).
إذا كنت تريد حقا الحصول على استخدام مفصل العدد النهائي كرقم البناء الذي من شأنه أن يزيد لكل تشيكين / ارتكاب (ولكن أعتقد أن هذا الذهاب بعيدا جدا).
وأود أن استخدام x. y.z نوع من الإصدار.
x - الإصدار الرئيسي.
ذ - الإفراج الطفيفة.
z - رقم البناء.
أنا أساسا اتبع هذا النمط:
عندما يكون جاهزا أنا فرع رمز في الريبو المصدر، علامة 0.1.0 وإنشاء فرع 0.1.0، يصبح الرأس / الجذع 0.2.0 لقطة أو شيء مماثل.
أنا أضيف ميزات جديدة فقط إلى الجذع، ولكن باكبورت إصلاحات للفرع وفي الوقت الذي صدر منه 0.1.1، 0.1.2،.
أعلن الإصدار 1.0.0 عندما يعتبر المنتج ميزة كاملة وليس لديها أوجه القصور الرئيسية.
من ثم على - يمكن للجميع أن يقرر متى لزيادة النسخة الرئيسية.
أستخدم هذه القاعدة لتطبيقاتي:
. y = فيتور نومبر، 0-9. زيادة هذا الرقم إذا كان التغيير يحتوي على ميزات جديدة مع أو بدون إصلاحات الشوائب. z = رقم الإصلاح العاجل، 0-
. زيادة هذا الرقم إذا كان التغيير يحتوي فقط على إصلاحات الأخطاء.
بالنسبة للتطبيق الجديد، يبدأ رقم الإصدار 1.0.0. إذا كان الإصدار الجديد يحتوي على إصلاحات الأخطاء فقط، قم بزيادة رقم الإصلاح العاجل بحيث يكون رقم الإصدار 1.0.1. إذا كان الإصدار الجديد يحتوي على ميزات جديدة مع أو بدون إصلاحات الأخطاء، قم بزيادة رقم الميزة وإعادة تعيين رقم الإصلاح العاجل إلى الصفر بحيث يكون رقم الإصدار 1.1.0. إذا وصل رقم الميزة إلى 9، فقم بزيادة رقم الإصدار الرئيسي وإعادة تعيين العنصر ورقم الإصلاح العاجل إلى الصفر (2.0.0 وما إلى ذلك)
نستخدم a. b.c. d حيث.
(أ) - زيادة كبيرة (زيادة على التسليم إلى العميل) ب - طفيفة (زيادة على التسليم إلى العميل) ج - مراجعة (زيادة على الإصدارات الداخلية) د - بناء (زيادة بواسطة التحكم في الرحلات البحرية)
وهناك مثال آخر لنهج A. B.C هو إصدار إكليبس باندل. حزم الكسوف بدلا من أن يكون الجزء الرابع:
في الكسوف، وتتكون أرقام الإصدار من أربعة (4) شرائح: 3 الأعداد الصحيحة وسلسلة على التوالي اسمه main. minor. service. qualifier. يلتقط كل شريحة نية مختلفة:
يشير الجزء الرئيسي إلى الكسر في أبي يشير الجزء الصغير إلى تغييرات "مرئية من الخارج" يشير قطاع الخدمة إلى إصلاحات الأخطاء وتغيير مسار التطوير يشير الجزء المؤهل إلى بنية معينة.
هناك أيضا مخطط إصدار التاريخ، على سبيل المثال: YYYY. MM، YY. MM، يمد.
انها مفيدة للغاية لأن نظرة أولى يعطي انطباعا عن تاريخ الافراج عنه. ولكن أنا أفضل مخطط x. y.z، لأنني أريد دائما أن تعرف نقطة المنتج بالضبط في دورة حياتها (الرائد. مينور. ريليس)
الجواب الأساسي هو "ذلك يعتمد".
ما هو هدفك في فيرسيونينغ؟ يستخدم العديد من الأشخاص version. revision. build ويعلنون فقط version. revision إلى العالم على أنه إصدار إصدار بدلا من إصدار ديف. إذا كنت تستخدم تسجيل الوصول "الإصدار" ثم عليك أن تجد بسرعة أن أرقام الإصدار الخاص بك تصبح كبيرة.
إذا كنت تخطط لمشروعك ثم كنت زيادة مراجعة الإصدارات مع تغييرات طفيفة وإصدار الزيادة للإصدارات مع تغييرات كبيرة، وإصلاح الأخطاء أو وظيفة / الميزات. إذا كنت تقدم الإصدار بيتا أو ليلا بناء الإصدارات ثم تمديد الإصدار لتشمل بناء وزيادة مع كل إصدار.
ومع ذلك، في نهاية اليوم، والامر متروك لكم ولها أن يكون معنى بالنسبة لك.
كما يقول ماهيش: أود استخدام x. y.z نوع من الإصدار.
x - الإصدار الرئيسي y - الإصدار الصغير z - رقم البناء.
قد ترغب في إضافة داتيتيم، ربما بدلا من z.
يمكنك زيادة الإفراج الطفيفة عندما يكون لديك إصدار آخر. من المحتمل أن يبقى الإصدار الرئيسي 0 أو 1، وتغيير ذلك عندما كنت حقا إجراء تغييرات كبيرة (في كثير من الأحيان عندما يكون البرنامج الخاص بك في نقطة حيث أنها لا تتراجع إلى الوراء مع الإصدارات السابقة، أو قمت بتغيير الإطار بأكمله)
كنت أعلم أنك يمكن أن تحقق دائما لمعرفة ما يفعله الآخرون. وتميل برمجيات المصدر المفتوح إلى السماح بالوصول إلى مستودعاتها. على سبيل المثال يمكنك توجيه متصفح سفن إلى svn. doctrine-project. org وإلقاء نظرة على نظام الإصدار الذي يستخدمه مشروع حقيقي.
أرقام الإصدار، والعلامات، كل شيء هناك.
نحن نتبع نهج a. b.c مثل:
زيادة "أ" إذا كان هناك بعض التغييرات الرئيسية حدث في التطبيق. مثل نحن ترقية 1.1 تطبيق إلى 3.5.
"b" إذا كان هناك بعض التغييرات الطفيفة مثل أي كر الجديد أو تعزيز يتم تنفيذها.
"c" إذا كان هناك بعض العيوب إصلاحات في التعليمات البرمجية.
أبدأ الإصدار في أدنى (غير الإصلاح العاجل) سيجيمنت. أنا لا أقصر هذا الجزء إلى 10. ما لم تكن تتبع يبني عليك فقط أن تقرر متى تريد تطبيق زيادة. إذا كان لديك مرحلة ضمان الجودة ثم قد يكون حيث يمكنك تطبيق زيادة إلى أدنى شريحة ثم سيجيمنت المقبل عندما يمر كا ويتم تحريرها. اترك الجزء العلوي لتغييرات السلوك / واجهة المستخدم الرئيسية.
إذا كنت مثلي سوف تجعل من هجين من الأساليب وذلك لتتناسب مع وتيرة تقدم البرنامج الخاص بك.
أعتقد أن النمط الأكثر قبولا a. b.c. أو a. bc. cd خاصة إذا كان لديك كا / الامتثال في المزيج. لقد كان الكثير من فلاك حول تاريخ كونها جزءا عاديا من الإصدارات التي أعطيته ل السائدة.
أنا لا تتبع يبني لذلك أود استخدام نمط a. b.c إلا إذا كان هناك إصلاح عاجل. عندما يكون علي تطبيق إصلاح عاجل ثم تطبيق المعلمة د كتاريخ مع مرور الوقت. واعتمدت المعلمة الوقت كما د لأن هناك دائما إمكانات عدة في يوم عندما تفجر الأمور حقا في الإنتاج. أنا فقط تطبيق د قطاع (يمدن) عندما أنا المتباعدة لإصلاح الإنتاج.
أنا شخصيا لن يعارض مخطط البرمجيات من va. b ريفك حيث c هو ييدمد أو يمد.
كل ما قال. إذا كنت تستطيع مجرد عطل أداة لتكوين وتشغيل معها سوف تبقى لكم من الصداع الحاجة إلى مارشال وجوه الرأي من الإصدار ويمكنك أن تقول فقط "استخدام الأداة". لأن الجميع في عملية التنمية عادة ما تكون متوافقة جدا.

استراتيجيات إصدار البرامج.
عالقة الكمال في العالم الحقيقي.
إصدار البرمجيات يمكن أن تكون واحدة من تلك المناطق حيث كنت لا تشعر وكأنك حصلت عليه بالضبط الحق. ليس هناك توجيه محدد هناك مع حل من شأنه أن يرضي الجميع. معظم فرق البرمجيات إما الخلط حول هذا الموضوع، أو يختارون تجاهل ذلك. ويهدف هذا الدليل إلى سد الفجوة، وتقديم نظرة عملية على مختلف الاستراتيجيات الشعبية والمفاضلة.
بعض التقنيات سوف تكون موجهة نحو ميكروسوفت كومة (ويندوز،)، كما هو ما أنا الأكثر خبرة مع، ولكن المبادئ تنطبق بشكل عام. لينكس، Node. js، بيثون & أمب؛ كما تم تطرق روبي قليلا.
إصدارات في كل مكان.
نحن جميعا جميلة تستخدم لمصطلح "نسخة" في الوقت الحاضر. الأكثر شيوعا في العالم البرمجيات، فقد تسربت إلى وسائل الإعلام وغيرها من الصناعات. ويجري حاليا إصدار إصدارات الفيلم - "فاست & أمب؛ فوريوس 7" (7!؟)، ويجري الآن إصدار الأحذية - "إير جوردان XX8"، والأكثر شعبية، يتم حاليا إصدار الكتب - "مدير دقيقة واحدة، طبعة 1984". في الواقع، بالنظر إلى الكتب، والناس قد تم إصدار بعض الوقت الآن - "موسوعة بريتانيكا"، منذ 1768!
الفرضية بسيطة - حيث أن المنتجات تعيش على ومواصلة تحسين، الإصدارات الجديدة يجب أن تكون متميزة عن الإصدارات السابقة. اسم المنتج لا يتغير، لأن السوق أصبحت بالفعل مألوفة معها، لذلك يتم إلحاق شيء في النهاية للإشارة إلى أنه هو أحدث (أو مختلفة).
في حين أن الإصدارات موجودة منذ فترة طويلة من العصر الرقمي، والبرمجيات دفعت حقا القضية إلى الأمام. يعد تعديل نسخة جديدة من البرمجيات وإصدارها عملية سريعة جدا، أسرع بكثير من تغيير خط الإنتاج الصناعي لإنتاج قطعة جديدة من الملابس أو طباعة طبعة جديدة للكتاب. وهكذا دورات التكرار البرمجيات هي أقصر بكثير، وإمكانية للكثير من الطبعات المتزامنة هو أكبر من ذلك بكثير.
ببساطة استخدام سنوات (أو حتى أشهر)، كما هو الحال في طبعات الكتاب، ليست كافية. ويمكن إنتاج إصدارات جديدة من البرنامج في غضون دقائق. وبالإضافة إلى ذلك، والبرمجيات لديها جانب مواز هائل لذلك - تيارات البرمجيات - حيث يمكن أن توجد العديد من الإصدارات الرئيسية، وكلها يمكن تحديثها باستمرار في نفس الوقت. هذا نادرا ما يحدث مع حذائك. (أتمنى لو فعلت ذلك، وأحيانا أنا فقط لا أريد أن الترقية إلى نموذج كتالوج هذا العام، أريد تحسين زوجي القديم!)
لماذا الإصدار؟
قبل الغوص في كيفية تنفيذ الإصدار، دعونا نتوقف وننظر لماذا نحن نريد أن نفعل ذلك في المقام الأول! بعد كل شيء، إذا كنا نعرف الأسباب الدقيقة لماذا هو مفيد، ثم يمكننا أن نحكم بشكل أفضل ما إذا كانت الحلول المقترحة هي مناسبة.
وقد ألمحنا إلى ذلك في القسم الأخير، مشيرا إلى ما يسمى النسخة العامة. هذا هو الإصدار المرئي بشكل عام، وغالبا ما يحمل وزن التسويق (بمعنى أنه من المرجح أن يتم تعريفه من قبل قسم التسويق / المبيعات). "ويندوز 7" و "إفون 5S" و "أوفيس 2013" - كلها أمثلة على إصدار عام.
ويهدف الإصدار العام لتكون بسيطة ولا تنسى، مشيرا إلى العملاء أنه جديد & أمب؛ لامعة (على افتراض أن الناس يريدون عموما "جديدة وبراقة"). الناس لا يفهمون "10.6.6527.14789" - لكنهم يحصلون على "2013" أو "5". لقد كانت شعبية متزايدة لاستخدام السنة من الإفراج عن عدد الإصدار العام، كما أنها ببساطة وبقوة ينقل ما يصل إلى تاريخ الوضع. كانت شركات صناعة السيارات تفعل ذلك لفترة طويلة.
الإصدار الخاص هو ما كنا عليه في عالم البرمجيات. طابع داخلي (نأمل) يحدد بشكل فريد قطعة معينة من البرمجيات. البرمجيات، مثل سيارة، يمكن أن تكون مصنوعة من أجزاء كثيرة. أخذ قياس السيارة كذلك، السيارة "نسخة خاصة" هو رقم الشاسيه فين. المصنعين الافراج عن والحفاظ على كتالوجات ضخمة من أجزاء، ورسم خرائط لسيارة "أرقام الإصدار". يمكن ميكانيكي ثم أمر جزء بالضبط التي تناسب سيارتك.
بدون "رقم الجزء الخاص"، لن تكون قادرا على خدمة البرنامج الخاص بك في البرية، لأنك لن تعرف بالضبط "الشكل" أن وحدة استبدال يجب أن تكون لتناسب النظام العام. تخيل إذا كنت اضطر لتغيير السيارة بأكملها عندما كسر ضوء الذيل.
لذلك، يتم استخدام رقم الإصدار الخاص تماما مثل معرف الكتالوج. الغرض منه هو أن تستخدم عند استكشاف الأخطاء وإصلاحها أو صيانة البرنامج. (أنا أحب جيف أتوود في "دوغتاغ" قياسا!) يجب أن خريطة إلى وصف ما قطعة البرنامج هو مثل - ما هو شكله وظيفة. وما أفضل "وصف" من شفرة المصدر الأصلي نفسه!
الاستخدام يتلخص أساسا إلى:
تحديد شفرة المصدر الأصلية لجزء من البرنامج، لتمكين التصحيح التدريجي وتأكيد عملية معيبة تحديد ما إذا كان جزء واحد "متوافق" مع آخر، أو ما إذا كان يمكن أن يحل محله.
يتم إنجاز كل هذا مع رقم الإصدار الخاص. الإصدار العام هو مجرد علامة التسويق، ويخطط إلى واحد أو أكثر من أجزاء البرمجيات الداخلية، ولكل منها نسخة خاصة بها. (تماما مثل تويوتا كورولا 2011 يحتوي على إطار ZRE142 وتحويل عزم الدوران 32000-12420)
استخدام الإصدار.
في ويندوز يتم دعم مفهوم رقم الإصدار بواسطة طبقة من نظام التشغيل. يتم تضمين أرقام الإصدار في كافة الملفات الثنائية القابلة للتنفيذ، ويمكن أن ينظر إليها عند تحوم فوق إيكس / دل في مستكشف ويندوز، أو عند عرض خصائص. في الواقع، أي ملف يمكن أن يكون "الموارد" يمكن أن يكون إصدار، لأنه يتم تخزينها في المورد فيرسيونينفو.
ويستخدم التنسيق العام الذي نستخدمه جميعا: main. minor. build. revision (على سبيل المثال "1.2.360.0"). من المهم أن نلاحظ أن كل عدد يقتصر على 16 بت، وحتى لا يمكن أن يتجاوز 65535. وهذا له بعض الآثار على ما يمكن أن تمثل مع هذه الأرقام.
لاحظ أن تسمية لهذه الأرقام ليست محددة بدقة - فهي بسيطة 4 أعداد صحيحة قصيرة. ويشار إلى الأولين باسم الرئيسية والثانوية جميلة بالإجماع. آخر اثنين هو حيث نرى بعض الاختلاف، اعتمادا على نظام الإصدار.
يستخدم هذا الإصدار بشكل بارز أثناء عملية تحديث ويندوز، والذي يستخدم تقنية ويندوز إنزتالر (مسي) لتحديث أجزاء مختلفة من النظام. بشكل أساسي، يتبع ويندوز إنزتالر قواعد معينة لتحديد ما إذا كان التحديث الذي يتم تثبيته أحدث من ما تم تثبيته بالفعل. إذا كان الإصدار أكبر، ثم انها موافق لتحديث.
بطبيعة الحال هذا المفهوم يتدفق إلى الإطار، الذي بني حول العديد من المفاهيم ويندوز القائمة. لدينا فئة الإصدار، الذي يتبع 4 عدد صحيح نموذج. يمكننا أيضا تعريف أسمبليفيرزيوناتريبوت و أسمبليفيليفرزيوناتريبوت، التي تحدد إصدار التجميع ومصدر إصدار ويندوز على التوالي.
في الإصدار التجميعي موجود بشكل منفصل عن الإصدار الأساسي الذي يستند إلى ويندوز فيرسيونينفو، وهو ما تراه في مستكشف ويندوز (أو خصائص الملف). وهو يشكل جزءا من اسم الجمعية قوية، ويستخدم حصرا من قبل الإطار عند حل التجميعات. اثنين - نسخة التجميع وإصدار ملف ويندوز - يمكن أن تكون مختلفة، ولكن في كثير من الأحيان أنها هي نفسها لتجنب الارتباك.
يستخدم إصدار تتبع التبعية، بمعنى الإشارة إلى نسخ التجميعات المشار إليها، مما يجعلها واضحة عندما يكسر التحديث التوافق للتطبيق الذي يعتمد على مكتبة معينة. هذه خطوة إلى الأمام من إصدار ملف ويندوز الأصلي، والذي كان يستخدم فقط أثناء عملية التحديث، وليس عند الرجوع إلى مكتبة، مما يؤدي إلى سيئة السمعة "الجحيم دل".
ومن الجدير بالذكر أن النسخة ق يسمح 4 أعداد صحيحة 32 بت، في حين أن أسمبليفيليفرزيوناتريبوت يقتصر على 16 بت، كما أنها خرائط مباشرة إلى الموارد فيرسيونينفو. وهكذا، إذا أردنا أسمبليفيرزيوناتريبوت و أسمبليفيليفرزيوناتريبوت أن تكون هي نفسها، وهذا يضع بشكل فعال حد على مكونات الإصدار التجمع كذلك.
لينكس، بشكل عام، يستخدم طريقة مختلفة لمعالجة الإصدار. لا تحتوي الملفات الثنائية على طابع إصدار مضمن، مثل معظم ويندوز الثنائيات القيام به. وبدلا من ذلك، يشير اسم ملف المكتبة المشتركة إلى إصداره، على سبيل المثال. /usr/local/lib/mylib. so.1.5.
يتم إنشاء عدد من الروابط الرمزية، على سبيل المثال. mylib. so - & غ؛ mylib. so.1 و mylib. so.1 - & غ؛ mylib. so.1.5. يمكن تطبيق مرجع مكتبة عن طريق رابط رمزي، مثل mylib. so.1، والحصول على أحدث نسخة متوافقة 1.x مثبتة.
هذا يعمل بشكل جيد إلى حد ما، طالما الجميع يتبع هذه الاتفاقية. كل مكتبة يمكن ثم، بدوره، تحميل المكتبات يعتمد على بطريقة مماثلة.
كما سيكون مستخدمو لينوكس على دراية ب "أداة الحزمة المتقدمة" الشهيرة، أبت-جيت، التي تستخدم بشكل واسع على الأنظمة المستمدة من دبيان مثل أوبونتو. كونه مدير حزمة صحيح أنه يدعم تثبيت جنبا إلى جنب الإصدارات وتتبع تبعيات بين الحزم. نلقي نظرة فاحصة على مزايا مديري الحزم في الأقسام التالية.
مخططات أرقام الإصدار.
هناك العديد من برامج الترقيم نسخة شعبية للبرامج، ولكن كل منهم هو الاختلاف من نفس الموضوع وتبادل الصفات المشتركة. وجود مكونات النسخة الرئيسية والثانوية هو نفسه في جميع المجالات. إن ما يمثلونه متسق إلى حد ما:
زيادة عدد كبير: يمثل تغيرات كبيرة في نظام البرمجيات، في كثير من الأحيان غير متوافقة مع الوراء، أو إضافة كمية كبيرة من وظائف جديدة زيادة عدد أقل: يمثل تغييرات تطورية أقل جوهرية، وذلك أساسا التحديثات أو التحسينات في الوظائف الموجودة، أو إضافة جديد أصغر مجموعة الميزات.
أعلاه هو دليل واحد فقط - لا توجد قواعد محددة حول ما هي الإصدارات الرئيسية والثانوية من المفترض أن تمثل. فقط أن من المفترض أن تزيد كما يتم إضافة المزيد من الميزات إلى البرنامج مع مرور الوقت.
ويندوز وثنائيات تحديد مخطط إصدار 4-جزء: الرئيسية. تحت السن القانوني . بناء. مراجعة . والمكونان الأخيران هما شكلان حران إلى حد ما، وهناك العديد من الاختلافات في ما يمثلونه، فبعضها يستخدم عدادات بناء تدريجية، وبعض تاريخ / وقت استخدام المبنى، وبعضها يستمدها من أرقام المراجعة الداخلية لمراقبة المصدر.
يتجاهل الكثيرون رقم المراجعة، والتركيز فقط على البناء. مثبت ويندوز، على سبيل المثال، يحتوي فقط على 3 مكونات. إذا كنت تريد الإصدار الخاص بك لتمتد على كل من الثنائيات والحزمة التي تحتوي على، فمن الأفضل للحد من نفسك إلى ثلاثة أرقام فقط: الرئيسية. تحت السن القانوني . بناء.
في أي حال، فإن النمط العام: كلما زاد عدد الإصدار، وأكثر حداثة البرنامج.
وقد أطلق على نظام إصدار شعبية في السنوات الأخيرة (وخاصة بين المشاريع مفتوحة المصدر) النسخة الدلالية (الملقب سيمفر)، وتوثيقها في semver. org. فإنه يقدم بضعة مكونات أخرى، ويجعل نسخة سلسلة أبجدية رقمية، بدلا من رقم نقي - فتح بعض الاحتمالات مثيرة للاهتمام.
المكونات الثلاثة الأولى هي نفس ما ناقشنا بالفعل، مع التصحيح يجري اختياري. التصحيح هو إلى حد كبير يعادل عنصر بناء، ولكن الدلالات يمكن أن تكون مختلفة. إصدار الدلالي في الواقع يصف عند كل عنصر يجب أن تكون متزايدة (على أساس "أبي العامة" التغييرات).
التجريبي، إذا كان محددا، عبارة عن سلسلة أبجدية رقمية تستخدم لوضع علامة على إصدار كتلك التي تسبق الإصدار النهائي. على سبيل المثال، 1.3.567-rc1 سيسبق 1.3.567. هذا مفيد لإرفاق معنى أكثر إلى تسمية الإصدار من ببساطة عن طريق استخدام الأرقام.
تعد البيانات الوصفية عنصرا اختياريا آخر، مما يسمح بوضع علامات إضافية على تسمية الإصدار (عادة باستخدام طابع زمني للبناء)، إلا أنه لا يشارك في ترتيب الإصدار، أي الإصدارات التي تختلف فقط في البيانات الوصفية تعتبر نفسها.
بريليليس مفيد مع مديري حزمة مثل نوجيت، التي تعاملهم بشكل مختلف - أنها تعتبر غير مستقرة وغير مرئية لعامة الناس، إلا إذا طلب صراحة. وهذا يسمح بالإفراج عن إصدارات ألفا / بيتا دون التأثير على تلك التي تعتمد على الإصدارات المستقرة.
يمكن أن تكون علامات التجريبي مفيدة أيضا في تدفق الإصدار الداخلي عند التعامل مع الإصلاحات العاجلة المتوازية والبنيات الخاصة، كما تمت مناقشته لاحقا في هذه المقالة.
إصدار الملفات غير الثنائية.
لذلك نحن نعرف كيفية ختم نسخة على الملفات الثنائية. ولكن ماذا عن الملفات الأخرى التي تتألف من نظام البرمجيات - ملفات التكوين والصور والوثائق والخطوط، وما إلى ذلك؟ كيف يمكنك ختم نسخة عليها؟
ماذا عن أطر الويب مثل أسب (أو روبي، Node. js، بيثون، الخ) حيث يمكن تعديل ملفات المصدر والصفحات في مكانها، وتحديثها تلقائيا؟ كيف يمكننا تصحيح نظام ويب، بمعنى تحديث بعض الملفات المستهدفة، وما زلنا نحتفظ بها في الإصدار؟
الجواب هو - لا تحديث الملفات الفردية! لا توجد طريقة بالنسبة لك للحفاظ على رقم إصدار مفيد لتطبيق البرنامج الخاص بك، إذا كان يمكن تحديث الملفات غير الثنائية الفردية المخصصة كإصلاحات عاجلة.
تحديث باستخدام حزمة بدلا من ذلك.
أهمية البناء والحزمة.
عندما تسمع مصطلح "بناء"، عادة ما يتبادر إلى الذهن تجميع - معظم اللغات المترجمة، مثل C #، C ++ أو جافا، يجب أن يتم تجميعها في ثنائي قبل أن تكون قادرة على تنفيذها. وهكذا يرتبط البناء عادة بعملية التجميع.
ولكن هذه ليست صورة كاملة. بعض اللغات أو الأطر، مثل بيثون أو أسب، لا تتطلب تجميعا صارما. ويمكن تفسيرها إما في حالة بايثون أو تجميعها على ذبابة في حالة أسب. ما الذي ينبغي القيام به لهذه الأنظمة؟ كيف يمكنك "بناء" تطبيق بايثون؟
هذا هو السبب في أنه من المفيد التفكير في بناء عملية التجميع، أو ببساطة التعبئة والتغليف. تماما مثل خط السلع الاستهلاكية، على سبيل المثال. والأحذية، يحصل تعبئتها قبل الشحن إلى المخازن، لذلك لا نظام البرمجيات، قبل أن يطلق سراحه.
مفهوم الحزمة هو ضروري لإصدار، لأن الحزمة هي مجموعة واحدة من القطع التي تتألف من نظام البرمجيات، أو جزء منه، وبالتالي يمكن تحديدها، وختم مع نسخة. مع نظام إدارة حزمة الحق (الذي ننظر في القسم التالي)، يمكن نشرها وتحديثها، وتحديد التبعيات على حزم أخرى.
البرمجيات اليوم هو أبدا ملف تنفيذي ثنائي واحد - هو عبارة عن مجموعة من الثنائيات المختلفة والمكتبات والوثائق وملفات التكوين والصور وغيرها من الموارد. حزمة ما يساعدنا على تجميعها معا، الإصدار والافراج عن العالم الخارجي.
ولا يلزم أن تكون الحزمة متطورة، على الرغم من أنها تساعد في بعض الحالات (مثل قواعد البيانات). يمكن أن يكون حتى ملف مضغوط بسيط، التي يمكن أن تحتوي على نسخة في اسم الملف، أو جزءا لا يتجزأ من ملف نصي. في الواقع، العديد من المشاريع مفتوحة المصدر تفعل ذلك - الإفراج هو زيب أو أرشيف. tar. gz.
الشيء المهم هو أن الحزمة هي وحدة واحدة، التي يتم تحريرها وتحديثها في نفس الوقت، مما يؤدي إلى الاتساق. من الشائع وجود عدة حزم، على سبيل المثال، تمثل مكونات "العميل" و "الخادم"، أو أي تجميع منطقي آخر ينطبق على نظام البرامج. ويمكن بعد ذلك يتم تحديث كل حزمة من تلقاء نفسها.
دعونا نلقي نظرة على بعض طرق التعبئة والتغليف المشتركة، ونهج الإصدار، والتطبيق الذي هي الأنسب ل.
مثبت الويندوز.
أفضل مناسبة: تطبيقات ويندوز غوي كاملة أو خدمات ويندوز أو برامج تشغيل.
أقدم، وطويلة الوقت الطريقة الوحيدة الموصى بها، لتثبيت التطبيقات على منصة ويندوز. أنه يحتوي على دعم الإصدار المدمج في ومتطورة (البعض يقول "معقدة") مجموعة من القواعد لتحديد متى لتحديث المكونات. في حين أن حزمة ويندوز إنزتالر (.msi) هو ملف واحد، في جوهره، هو عبارة عن مجموعة من المكونات المنطقية الصغيرة (وصولا إلى ملفات واحدة) التي يمكن تحديثها بشكل مستقل.
سيقوم ويندوز إنزتالر بالتحقق من كل ملف فردي يتم تثبيته، سواء كان لديه إصدار وما إذا كان الإصدار أكبر من ملف بنفس الاسم المثبت مسبقا. وهذا يعني أنه من المهم إصدار ليس فقط حزمة المثبت، ولكن كل ملف الواردة فيه. ولكن هذا يعني أيضا أنه من الصعب بشكل لا يصدق للقيام تخفيضات (أي التراجع) مع ويندوز إنزتالر.
هو الأنسب لتطبيقات ويندوز التقليدية (واجهة المستخدم الرسومية، والخدمات، والسائقين) التي يتم إصدارها للجمهور. ومع ذلك، فإنه ليس أفضل خيار للداخلية & أمب؛ والتطبيقات الموزعة، وأي نوع من تطبيقات الويب، أو أنظمة قواعد البيانات.
كما كان يستخدم لنشر المكتبات القابلة للتوزيع (دلز الأصلي) وكائنات كوم، ولكن مع التركيز اليوم على، فإنه ليس هو الآلية الصحيحة لتوزيع المكتبات.
نشر الويب.
الأفضل: تطبيقات الويب (إيس، أسب)
تم تصميم تقنية نشر الويب خصيصا لنشر التطبيقات ومزامنتها على خوادم ويب ميكروسوفت إيس. يستخدم النسخ المتماثل إيس ويب فارم ويب نشر الأوامر والحزم وراء الكواليس لمزامنة المواقع عبر مجموعة من الملقمات. يحتوي إيس ماناجر على إضافة (تمكين عن طريق تثبيت ويب ديبلوي) إلى "استيراد التطبيق"، والتي يمكن تثبيت أو تحديث تطبيق ويب باستخدام حزمة نشر ويب زيب.
أكبر عيب هو أنه لا يمكن إلا أن تستخدم لتطبيقات الويب على منصة مايكروسوفت إيس، وآلية محدودة لتخصيص التثبيت. في حين أنه يمكن أن تكون مناسبة لتطبيقات الويب البسيطة، فإنه يمكن أن تصبح محبطة بسرعة لأي شيء أكثر تطورا، أي المتغيرات والمنطق الشرطي وقواعد البيانات، وما إلى ذلك.
وبالإضافة إلى ذلك، فإنه لا يوجد لديه الدعم المتأصل للإصدار.
مدراء الحزم.
أفضل مناسبة: المكتبات المشتركة، التبعيات، سطر الأوامر المرافق.
مدراء حزمة كبيرة لإطلاق وإصدار المكونات المشتركة، وتتبع التبعيات بينهما. على سبيل المثال، إذا كان لديك مكتبة مشتركة تريد أن يستخدمها الآخرون، فإن مدير الحزم يسمح لك بنشر إصدارات متعددة جنبا إلى جنب، وبالنسبة لمستهلكي المكتبة للإشارة إلى الإصدار الذي يعتمدون عليه. يمكن لمديري الحزمة حل كافة التبعيات بين الحزمة، واسترداد الإصدارات التي من المتوقع فقط. في الواقع، مديري الحزمة حل مشكلة "الجحيم دل".
أفضل استخدامها أثناء التنمية، لحل التبعيات المكتبة. ومع ذلك، بعض إدارة الحزم، مثل شوكولاتي ويندوز أو أبت-جيت ل أوبونتو، موجهة نحو تثبيت البرنامج الكامل.
الأهم من ذلك، تم تصميم مديري حزمة حول مفهوم الإصدار. لذلك فهي آلية مثالية لتوزيع مكتبات البرامج المصورة.
لدينا لدينا نوجيت. وقد تم نشر الكثير من المكتبات المفتوحة المصدر في مستودعها على الإنترنت، وهي الآن المعيار الفعلي لتوزيع مكونات الطرف الثالث. ومن المشجع أن كل فريق يضع مستودع نوجيت الخاصة بهم لتبادل ونشر المكتبات وضعت داخليا بطريقة الإصدار.
نوجيت يمكن أن تستخدم حتى لاطلاق سراح أنظمة البرمجيات كاملة - انظر القسم التالي.
بيئات التنمية الأخرى لها الخاصة - نبم ل Node. js، نقطة ل بيثون، الأحجار الكريمة ل روبي، أبت-الحصول على لينكس. وقد ثبت مدراء حزمة لتكون مفيدة للغاية، وانفجرت في شعبيتها.
نشر الأخطبوط.
أفضل تناسب: إنترنالي ديفيلوبيد & أمب؛ البرامج التي تم نشرها.
يستخدم الأخطبوط نوجيت كما التعبئة والتغليف والإصدار قذيفة. وهو مشابه لمثبت، مدفوعة فقط بويرشيل، وهذا يعني المرونة لانهائية في كيفية البرنامج هو أن يتم نشرها. لدى بويرشيل بالفعل دعما كبيرا لتكوين خدمات ويندوز، تطبيقات ويب إيس، المهام المجدولة، سكل سيرفر، وأكثر من ذلك.
أما بالنسبة للبرامجيات الموزعة داخليا والموزعة (أي شركة تعمل في مجال حلول البرمجيات المحلية)، فهي مركبة مثالية لإدارة الإصدار. يتم إصدار الحزم ودفعها إلى تغذية نوجيت المشتركة (مثل مشاركة الشبكة)، حيث يمكن نشر الأخطبوط ونشر كل حزمة في البيئة المناسبة.
نوجيت هنا يلعب دور حزمة التطبيق / حاوية، مع نسخة ختمها على ذلك. حزمة يمكن أن يبنى مرة واحدة، ومن ثم نشر عدة مرات حسب الحاجة إلى أي بيئة.
الإصدار & أمب؛ قواعد بيانات التعبئة والتغليف.
إصدار قاعدة البيانات هو واحد من أكبر التحديات في مشاريع البرمجيات. تقريبا كل فريق واجهته، إما تجاهل تماما أو كان شيئا غير كاف في المكان. It certainly presents a challenge - database systems mix schema definition with actual live data , and there is no single "file" that can be effectively versioned.
We have to recognize the database as an integral part of the software system. One that executes on a proprietary 3rd-party platform (SQL Server, Oracle, PostgreSQL, etc), but the source of which is part of the software definition. It can be compared to script-based systems, such as Node. js or Python, only the scripts are written in a SQL dialect.
There are essentially three popular approaches to database versioning, that support automated deployments (I am not considering manual approaches, because they are error-prone, and have nothing to do with real versioning!).
DB - Migrations.
"Migrations" is a concept where developers keep a set of organized SQL script files, numbered sequentially, where each script applies modifications to the target DB to bring it to the expected state. Whenever a change is needed to the application database, a developer creates a new migration script that applies the delta changes.
All of the scripts are kept as part of the source control, and are packaged with the application (either embedded into the executable binary, or installed along-side). A migrations library then checks the target database for a dedicated table which holds the last "migration script number" applied, and then runs all the scripts with a number greater than that in order, effectively applying all of the changes in turn.
While this approach is simple to implement, and is favored among several popular frameworks (Ruby Rails, Entity Framework), it has a number of significant short-comings . Firstly, there is no single source view of all database objects (i. e. tables, stored procedures, etc), they are sprinkled through the multiple migration scripts. It is not clear which of the scripts contains which of the modifications. One has to "replay" them all to generate a database, and then look directly in the database (rather than source code).
Secondly, the migration scripts number becomes the "version" of the database, which is different from the software package version number for the rest of the application. This is somewhat confusing. In addition, this "version" does not really identify the state of the database, since a database can be changed outside an application without updating the "version". This may potentially break future installs, because migration scripts expect the database to be in a certain state to work.
Thirdly, developers have to be disciplined enough to follow the structure and apply ALL changes through migration scripts . Furthermore, when developing and debugging locally, one often has to go through several iterations before getting that table or store procedure change right. Yet only the final changes should make it into the migration script , meaning they have to be remembered and written manually. Otherwise, migration scripts would contain all of the intermediate changes made by all developers on the project. It is easy to see how that can grow out of proportion quickly.
Finally, there is an argument that migration scripts are a "history of changes", and it is a bit of a redundancy to store them in source control, which already is a "history" of code changes. We would be storing a history of a history . There's something philosophical about that.
Supported by some frameworks and libraries (Rails, DbUp, RoundHousE, EF Code First) Can work with any database Potentially high degree of control over SQL scripts.
Have to manually maintain all migration scripts Tracking changes through source control is difficult Not robust against target database out-of-band changes.
DB - SQL Compare.
Most often this is used in a manual approach, comparing a database between two environments (e. g. development vs test) to copy over the changes. We are considering an automated approach, suitable for the packaging and versioning strategies being discussed.
In source control, database is represent by a series of creation scripts (e. g. to create tables, stored procedures, triggers, etc), such that a new database with the right schema can be created from scratch. Usually each script file logically represents a corresponding object in the database, e. g. Table1.sql would be the create script for Table1 table. All of the scripts are included in the released package (sometimes even combined into a large single create script, by concatenating them).
The idea is that during automated package deployment a temporary fresh database copy is created, by running all of the creation scripts , and then a SQL Compare tool is executed to compare the pristine copy with the target database to generate a migration delta script on the fly.
The advantage of this approach is that it is robust against the target database out-of-band changes, since delta script is generated during deployment , rather than during development. SQL Compare tools (such a RedGate's SQLCompare or XSQL Compare) are sophisticated and mature enough tools that we can have some confidence in the generate SQL code. Each can be controlled by a multitude of options to fine-tune behavior with respect to renames, reordering columns, avoiding drops, etc.
In this case, target database is considered as a runtime environment , and we avoid having the issue of versioning it . Instead we version the package that contains all of the creation scripts , which is much easier, and use it to synchronize target database with what's expected in each version.
The big disadvantage of this approach is the difficulty of getting it right - there is no off-the-shelf framework that would support it, and it has to be developed. For SQL Server, read the next section for a better approach. For others, some day I may put together the set of scripts and logic necessary to achieve this, based on some of my prior work (unless someone else beats me to it).
Automatically detect and migrate changes, regardless of target DB state Only maintaining DDL (i. e. create) scripts in source control, meaning easy change tracking.
More difficult to setup, especially to be automated Having to create a temporary database during each deployment (need " create database " permission)
DB - DACPAC (SQL Server)
For SQL Server there is now a new recommended approach - DACPAC, and it can be produced by Visual Studio 2012 and above, if using the SQL Server database project. Really, this is a slick variation of the "SQL Compare" method above, just that Microsoft has done all the heavy lifting for you!
Essentially, DACPAC is a zip package which contains an XML schema model of what the target database should look like. It is compiled by Visual Studio based on the creation scripts in your project. In fact, it represents that temporary pristine database that we would have had to create manually. Only it is done automatically and the schema represented in an XML format. The real bonus is that a DACPAC can be versioned , i. e. its metadata supports storing a version number.
SQL Server Data Tools can be used to deploy a DACPAC package, which really performs a SQL Compare operation between the in-memory database model loaded from DACPAC and the target database. It does the same thing as SQL Compare, but avoids having to create the extra temporary database copy to do the comparison.
For applications having SQL Server as a back-end, a DACPAC can be included as one of the deployable packages, stamped with appropriate version generated during the build. Starting with SQL Server 2008 R2, database can be registered as a Data-Tier Application, and the latest DAC version is tracked in a system view that can be queried.
Can package the whole DB definition into a single package (or several packages) Can apply the same version to the package as the rest of the software system Same advantages as the SQL Compare method.
SQL Server only Need to treat lookup data in a special way (post-deploy MERGE script)
Build Auto-versioning.
Given the importance of consistent versioning discussed above, it makes sense to implement a strategy for automatically generating and stamping a version number during the software automated build process. We want the version number to be applied to the produced packages, and also applied to all the binaries generated through compilation.
There are several well-known and not so well-known ways of achieving this. We look at pros and cons of each.
Applying Build Number.
There are some who prefer to update the version number manually just before a release. I will argue that this is a bad practice. Firstly, it is easy to forget to do it, if you don't have an automated system for incrementing the version build number. And, if it is easy to forget, it will be forgotten at some point.
Secondly, without automatically updating build number, there will be multiple packages produced from the source code that have the same version number, but different functionality (as more commits are made to the source control). This will be confusing to say the least.
It is better to have a process, like ones described below, where version number build component is automatically updated whenever a non-local build is made.
Multiple Versions for Multiple Components.
If there are multiple software components, where each needs to have its own version number, then it is best to split them each into its own separate build. Don't mix multiple version numbers in the same build, as it unnecessarily increases the complexity, and raises a question about which of the build numbers should be used to label the build itself (in addition to having to tag each source sub-tree separately).
Developer vs Continuous vs Release Builds.
Release build is the one that will potentially be released to public or a particular environment - test, staging, production, etc. That's the build that needs to be consistently versioned to keep track of changes that are included and to link back to the source code at the time of compilation.
Note that the Release build can scheduled - it is popular to have a Daily or Nightly build. In most situations it should be the Release build, i. e. it should be versioned and packaged ready to be released.
Continuous Integration builds run whenever someone commits to the repository and are used to validate that the code compiles, and passes unit tests. There is no need to version this build, as it is not intended to be released.
Developers must also be able to do a Developer build , whether it is to test/fix the build process itself, or to generate shared software components to be used in development. Such builds are intended to be run locally only and should never be publicly released.
You can default the build part of the version number to "0". This will identify Developer builds, i. e. ones that are not supposed to be released. For Release builds pass the build number to your build scripts as a property. Have MSBuild stamp a version number on all generated assemblies and packages.
Tagging Source Control.
Since one of the primary reasons for having a version number is to be able to link back to source code used to build the software (see beginning of the article), it is important to create tags/labels in source control that identify the state of source code at the time that version was built.
Various systems call it differently - TFS has "Labels", Git has "tags". Tag should include the full version (including the build number) of the build, so that it can later be found, if needed.
Build Number - Version File Auto Increment.
Common technique is to record version number together with source code, usually in a separate file (e. g. "version. txt"). The build process then finds the file, reads the version, increments the build number portion, and commits the file back to repository.
If the commit message also includes the version number, e. g "Auto-increment: 1.3.156.0" , then it comes in handy when viewing commit history. You can see the changes that occurred between versions clearly by seeing the commits between the two "Auto-increment: . " messages.
This works fairly well, but has a few drawbacks. Mainly due to the fact that "version" becomes part of the source code. When merging changes between say release branch and main, you have to resort to "cherry-picking" (i. e. selecting just the code changesets) to avoid merging the modified version number. That requires being always careful, because you can accidentally change the versioning sequence of another branch just by merging the "version file" into it.
Control over the build number sequence (i. e. sequential) Can make it easy to see changes between versions in source control history.
Difficult to control merging between code branches in source control.
Build Number - External.
Overcoming the drawbacks of the auto increment approach, it is possible to track the build number outside of the source tree. Build server software such as CruiseControl or TFS Builds can do that - they track a build number internally for each "project" and are able to pass it as a parameter to MSBuild.
Version file is still used, but it records major and minor versions only, and doesn't have to change between each build. This makes it easier to merge changes from release branches back to main and others, since they will contain only code changes, without being intermingled with version increments. Major/minor version changes would occur early in the development cycle, when starting work on the next update, and are already set by the time release branch is created.
Not modifying source tree on every build makes merging between branches easier Versioned builds are forced to be built by a dedicated build server.
Relies on a build system that can supply a build number (e. g. CruiseControl, TFS Builds) Changing build number sequence can be difficult (e. g. TFS Builds)
Build Number - Derived from Date/Time.
A popular alternative is to derive build number for the date/time of the build. The advantage being that it carries more meaning (useful in diagnosis), and each build inherently should get a different build number (with later builds getting a higher number).
The trick, of course, is fitting all this into a 16-bit number, if using the standard 4-part Windows version number. While some solve it by using both, the build and revision components, I cannot recommend it, because revision cannot always be applied to external packages (like Windows Installer, or NuGet), which use only a 3-part version number.
This only allows only 4 unique builds per day, which is not a lot, unless all you want is a daily build .
Not depending on keeping track of the last build number Build number can be given more meaning, if it derives from a date.
Build number is not sequential (but it increases nevertheless) Limited to 16-bit (maximum 65535), so some overflow into revision (4th) number.
Build Number - Derived from Source Control.
A variation of the previous technique is to derive build number from a unique property in source control. With a centralized SCM like Subversion or TFS, a revision or changeset number is an ever increasing number that is tied directly to the source code. The big problem with it is that it can quickly overflow the 16-bit limit, meaning you may have to accept build numbers looping back to zero.
An alternative in distributed SCM, like Git, is to use the size of the commit history log as the build number. This will monotonously increase for any single branch, as new commits are made. It too can overflow the 16-bit limit, but goes a lot further than the global revision number.
Example: git rev-list HEAD --count.
Not depending on keeping track of the last build number No possibility of "forgetting" to update version file, or accidentally merge it to/from another branch.
Commit history size will grow beyond 65,535 at some point, overflowing the 16-bit build number.
Parallel Branches.
It's no secret that developing for multiple versions requires multiple branches in source control, each representing a "version" stream for the software. They can be roughly divided into:
Development branches - where unstable code for the next version lives, and where developers commit daily work Feature branches - veering off from development branches, encorporating larger feature development, that would otherwise disrupt other team members Release branches - representing versions of released software, or a release undergoing stabilization.
Each release branch needs to have an identifying version, and is usually named after it, e. g. "1.7" . A decision of whether to create a new release branch depends on how long it is expected that it will be in stabilization mode before releasing, and whether concurrent live versions are permitted (i. e. for packaged software). If you need to be able to maintain & hotfix the current released version, while a new version is being tested & stabilized, then create a new branch.
Development and feature branches need to have a version number that is above any of the existing release branches to avoid confusion. For example, if a 1.7 release branch is created, for the upcoming 1.7 release, then immediately update development branch version sequence to 1.8 .
Versioning feature branches is more difficult, since you don't want to start a new versioning sequence for every feature . Nothing should be "released" from feature branches, so this version is for internal purposes only. If using Semantic Versioning, attach a prerelease tag to clearly indicate this is a version for a feature branch, e. g. 1.8.781-dev-feature-x .
In any case, you wouldn't deploy anything built from a feature branch to the shared testing or production environment, or release a package from it. So it is acceptable to have version sequence overlap with that of development branch.
Finally, in the next section we look at how to version patches & hotfixes that are applied to release branches.
Handling Patches / Hotfixes.
Devising a system to handle patches depends heavily on the rest of the software development cycle, which is what many teams forget when searching for the "one, true way" of handling concurrent patching of the released/production software in parallel with working on the new version.
For example, having a short QA/test cycle, where most of the tests are automated, results in a more simplified and robust system, which does not have to deal with multiple parallel hotfixes "in test".
Overlapping hotfixes.
One difficulty that comes with managing parallel development is consistent versioning and deployment strategy that would overcome inherent conflicts. Consider following scenario: you have recently released a software package 1.5.167. Two urgent show-stopping issues have slipped past your QA process and now require a quick fix. You assign two developers to work on each one in parallel. How would they commit their fixes to minimize conflicts? How do you test each fix? How do you release one independent of the other?
This is a good example of the complexity of software release processes that can be encountered in real-world teams. It applies both to internal software and packaged software, but distribution of the hotfix might be slightly different for each one.
First, let's consider what happens if we remove concurrency . In the case where the two issues are worked one after the other , the solution becomes simple. The first fix gets committed into the maintenance/hotfix branch for 1.5 release stream, a new build is generated, with an incremented build number. Build goes through a quick QA cycle to make sure there is no regression, and then it is ready to be deployed. Same process repeats for the second fix.
The problem with concurrent approach is the time when development is in parallel, creating the entangled case where there is no build/package that contains only one of the fixes , i. e. independent of the other. This problem is magnified by a slow QA cycle , usually meaning there are no automated tests. While one fix is in test, if a commit for a second fix is made to the same branch, and a problem is discovered with the first one, it becomes very difficult to separate the two now.
The culprit here is, of course, the concept of a partial fix - the state where the fix is not complete. It has been committed, but has a problem with it, requiring further commits . This can easily create the case of a hotfix branch where the two fixes are "entangled" (quantum physics on the code level!).
Solution is to remove possibility of a partial hotfix .
This means that each hotfix has to be coded and tested in a separate code stream, independent of the other. Once tested, and ready for release, it is merged into the main hotfix release branch, where the automated build can create a new package and apply versioning (i. e. increment build number, for example, to 1.5.168).
Second hotfix, once tested, also has to be merged into the main hotfix release branch. But, because during the work on this second hotfix, the first hotfix got released, we first merge the first hotfix into the second hotfix's branch ! This ensures that we can test how the second hotfix operates, when applied on top of the first hotfix, and merge any code conflicts, if any.
In the end, you want a system with both hotfixes applied - that is the "next" version. So it makes sense that whatever hotfix is "second", it is applied on top of the "first" one. And creating a packaged release from the single hotfix release branch ensures that the version number is consistently incremented for the whole system.
Of course, above means that we must create a separate branch for each hotfix. Some version control systems, namely Git, make this very easy and part of the expected developer workflow. If you are using a version control system like TFS, then creating new branches for each hotfix is a bit more painful. In TFS, I suggest using named Shelvesets feature to emulate Git's process, and perform initial QA tests for a hotfix from a Shelveset-branch build. Then commit Shelveset into the hotfix branch to build the official hotfix package (and perform necessary merging).
What about the versioning of the interim hotfix builds ? The main hotfix release branch would have a standard versioning scheme applied (as discussed above), either incrementing a build number, or using a timestamp. Each new hotfix, applied on top of all previous hotfixes, gets an increased build number , and the software version keeps moving forward.
However, when building from the developer hotfix branch (or Shelveset in TFS), we also need to apply a version to distinguish it from other builds, and be able to deploy it into QA/test environment. We want to be able to test each hotfix in isolation, applied on top of an existing released version of the software system. This becomes problematic, if you have a single test environment .
You do not want to apply both hotfixes into one test environment, because there is no guarantee that they won't conflict or affect each other. If you are able to quickly spin up a test environment for a hotfix development branch, then you can truly parallelize team efforts. For a shared test environment, they have to be applied one at a time :
Force install latest release version (e. g. 1.5.168) to bring environment to a known state Install the hotfix version to be tested Perform the tests (preferably automated) For shared test environnments this is the bottleneck, since no other hotfixes can be tested at the same time (automation can help minimize the time spent in this step) Repeat 1-3, until tests are satisfactory.
What this means is that each hotfix has to have its build version number greater than the latest released version, the one it is being applied on top of. There are several ways to achieve that. If using a derived build number , this should just work out of the box. If incrementing or using external build numbers, then the easiest option is to simply force the build for hotfix development branch (or Shelveset) to use a number greater than latest released version (i. e. .168).
With Semantic Versioning, we can setup hotfix builds to use a "prerelease" tag that clearly marks it as a hotfix-test build. For example - 1.5.169-check14761 , where the trailing number could be a reference to the issue tracking system. This works especially well when using NuGet as the packaging mechanism.
Once tested, the changes can be merged into hotfix release branch, and an official build generated, with incremented build version number.
NOTE: Above process to resolve concurrent hotfixes is undoubtedly complicated. It is intended to solve a particular real-world scenario, but one that does not happen too often. If there are no concurrent fixes expected, you can simplify your life by applying fixes directly to the hotfix release branch.
Patching a large system.
If applying hotfixes to a large system, we don't want to upgrade the whole thing, which may involve a lot of different components - services, GUI applications, scheduled jobs, databases, etc. Instead, we want to apply the fix only to affected parts.
This is where splitting the system into multiple packages helps. Each corresponds to a logically contained piece of the system - for example, each service, application, database, etc is its own package. That means they can be patched independently by applying just that package .
Care must be taken about dependencies, if hotfix affects multiple packages at once. Although, in that case, ask yourself is it really a hotfix or a new minor version?
Patching for specific installation.
Some software shops may have developed the practice of patching the software for individual customers (for packaged software), in other words creating a "custom" version for just that installation, without including this fix in the rest of released software streams. This is one of the worst situations to be in, with regards to versioning, since it creates a large number of variations that have to be maintained separately.
Instead, release a general update , moving the overall software version forward for that release stream. Adopt a "feature" system , where parts of the software can be turned on & off based on configuration. If a specific fix is needed for a particular installation, then that code can be encapsulated behind a configuration switch which turns this section of the code on or off. That particular customer can turn it on , while the rest can have it off!
This is also a popular technique in web applications, of which only one installation exists (on the server), where various "features" can be enabled based on "configuration" for each user , or a set of users.
Patching the changes only.
There is often the temptation to simply patch in the changes to the live/production system by editing/replacing one file, or updating one table or stored procedure. The change is small, and it seems like the fastest way to solve the imminent issue, without changing anything else in the system.
While it seems like a smaller risk to make only the necessary updates directly, it makes it a whole lot harder to know the state of the system in the future. As more and more such "small" patches get applied, there is no longer any reliable way to link the running system back to the original source code, making further maintenance exponentially more complicated (and, ironically, increasing the risk).
Updating individual non-binary (e. g. config files) or altering database objects does not update any version number . That means it is difficult to tell which changes have been made to the system, leading to "maintenance hell" (a variation of the infamous "DLL Hell").
Rule of thumb: Any change to the system should change the version number.
NOTE : Windows Installer allows a so called "small update", where product version number does not have to change, used for small hotfix patches. I believe this creates too much confusion, and so I do not recommend it. Windows Installer does track each patch, through package code, so you always know which patches have been applied. But it means now having to track and remove patches on subsequent product updates, which complicates the process. It may work for Microsoft Windows and Microsoft Office, but I wouldn't recommend using it for any system.
الكلمات الأخيرة.
This turned out to be a much longer article than I originally anticipated when I sat down to write about versioning . I am hoping it proves useful for software engineers out there looking for some guidance on how to apply these concepts in their own projects.
Still this seems like only a partial treatment of the topic.
Everything I wrote above has been learned through the painful process of trial & error over the years. If just a few readers have an "aha!" moment while reading this, then I have achieved my goal!

Software versioning strategy


الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
استراتيجية جيدة لتنفيذ نظام إصدار.
I have been struggling with versioning software for a while now. أنا لا أتحدث عن اصطلاح تسمية، أنا أتحدث عن كيفية تطبيق نسخة في الواقع في نظام بناء على طول الطريق حتى إلى إصدار.
أنا عموما استخدام main. minor. maintenance - [نوع الإصدار] أي 1.0.2-rc1.
المشكلة هي إدارة رقم الإصدار. لقد حاولت العديد من الطرق (التمسك بها في ملف بناء، ملف خصائص، قاعدة بيانات، الخ، الخ) ولكن لم أجد أي شيء يعمل حقا بشكل جيد.
أنا أتساءل عما إذا كان أي شخص لديه أي أفكار جيدة حول هذا الموضوع. أيضا، يتساءل كيف يتعامل الناس الإفراج عن نسخة. أي إذا كنت الافراج عن / نشر الإصدار 1.0.0-rc1 القيام البق وجدت في هذا الإصدار ثم الحصول على تسجيل الدخول إلى 1.0.0 (المقبل / الافراج عن الإنتاج).
تستخدم ميكروسوفت & لوت؛ ماجور & غ؛. & لوت؛ مينور & غ؛. & لوت؛ باتش & غ؛ - & لوت؛ بيلد نومبر & غ؛ (أو الاختلاف).
أحب استخدام & لوت؛ ماجور & غ؛. & لوت؛ مينور & غ؛. & لوت؛ بيلدنومبر & غ؛
حيث أعمل نحن نستخدم نظام مافين: قطعة أثرية [-major-مينور-ريفيسيون] [- سنافشوت] التي تسمح لنا لتطوير "قيد التقدم" الإصدارات التي تتغير في إشعار لحظات (سنافشوت) وتلك التي تم إصدارها رسميا . وفيما يلي بعض الأمثلة:
-services-1.0.0-SNAPSHOT. jar - web-2.3.11.war crm-2.5.0.ear.
إذا كان لديها سنافشوت فيه فإنه لم يمر مجموعة كاملة من الاختبارات أو مجرد تجربة المطور. إذا لم يكن لديك سنافشوت ثم هو مرشح الإصدار. نحافظ على مستودع للمرشحين الإفراج وآخر يتم إرسالها لنشر مرة واحدة واختبار سعيدة معها.
كل هذا يمكن أن تدار مع بضع إدخالات بسيطة في ملف بناء تحت مافين. انظر Maven2 البرنامج التعليمي.
وربما يكون هذا هو وظيفة ميتة الآن، ولكن أنا إضافة بلدي سنتين على أي حال. أنا من رأي أن بناء الأرقام ينبغي أن يعني شيئا لكل من يرى ذلك. لذلك أنا شخصيا أعتقد أن هذا هو وسيلة جيدة لتسمية الإصدارات:
main. minor. patch. revision - e. g. 1.1.4.2342.
Major/minor numbers are pretty self-explanatory. ولكن من وجهة نظر العدد 3، فإنه لا يزال يحتاج إلى يعني شيئا للعميل. I've released this new version to you, Mr. Customer, but it wasn't worth a new minor number since we just fixed some bugs. لذلك قمنا بزيادة رقم التصحيح.
الرقم الرابع عادة ما يعني لا شيء على الاطلاق للعميل، لذلك قد تجعل كذلك من المفيد لك ولأي شخص آخر في الشركة التي ترى ذلك. لذا بالنسبة لنا، هذا الرقم هو رقم مراجعة سفن. وهو يخبرنا بالضبط أي مراجعة كانت مسؤولة عن هذا الإصدار حتى نتمكن من سحب بها في أي وقت لإعادة إنشائه. Branching code obviously achieves this too, but not to 100% certainty.
أيضا، ميزة أخرى مع عدد رقمي العدد هو أنه يتكامل بسهولة إلى ما يقرب من كل نظام البناء المستمر.
على أي حال، هذا هو بلدي سنتان.
+1 على حل جيرا / بامبو. المعلومات الإضافية الوحيدة حول بناء وأود أن تشمل (لأغراضي) هو الإصدار التخريب، على الرغم من أن عملية وضع العلامات هو 80٪ من ما أريد.
الحفاظ يدويا على معلومات الإصدار / الإصدار هو الألم الملكي. Letting JIRA drive it is a great idea.
على السؤال الأخير، حول حيث البق / العيوب الحصول على تسجيل والإفراج عن نسخة:
Defect/Issue is logged against the release where it appears. عيب في 1.0.0-rc1 يحصل على تسجيل ضد 1.0.0-rc1 جيرا قد (أو ربما أضفنا) حقل "فيكس فور" التي من شأنها أن يكون الإفراج المخطط لها، في هذه الحالة 1.0.0 إذا كان العيب / القضية هو شديدة بما فيه الكفاية، قد يكون من الضروري إضافة آخر "أرسي" الإفراج. يتم اإلفراج عندما ال تكون هناك أية عيوب / مشاكل حرجة، ويوافق العميل) أو اإلدارة (على إمكانية تأجيل أي قضايا متبقية.
جمال إدارة هذا من خلال جيرا هو أن إضافة الإصدارات، وتوليد سجلات التغيير، وما إلى ذلك الآلي بشكل جيد إلى حد ما.
كما نستخدم & لوت؛ ماجور & غ؛. & لوت؛ مينور & غ؛. & لوت؛ بيلدنومبر & غ؛ ونحن ندير هذا مع كروزيكونترول / () على خادم بناء لدينا. واستخدام ويكس و كرويسيكونترول تكوين لإدارة الأرقام الرئيسية الرئيسية - لا تزال زيادة تلك باليد - ولكن عدد بناء يحدث تلقائيا عندما على خادم البناء. هل يمكن إنشاء قاعدة زيادة الرئيسية / ثانوية تلقائيا أيضا أعتقد - لدينا فقط ترغب في القيام بذلك يدويا بحيث يأخذ التفكير الكنسي من قبل ديف عندما حان الوقت لتسمية مستوى إطلاق معين.
يتم تعيين الكبرى و الصغرى من قبلنا، يدويا زيادة لهم كما نراه مناسبا.
بيلداتينومبر هو عدد الأشهر منذ بدء تشغيل المشروع مضروبا في 100، بالإضافة إلى عدد أيام الشهر الحالي.
يتم زيادة دايليبيلدنومبر لكل بناء بعد منتصف الليل كل يوم، بدءا من الصفر.
مثلا بناء الإصدار الرابع 5.2 في 10 يوليو، حيث بدأ المشروع 1 يناير من ذلك العام، سيكون لها رقم الإصدار.
يتم حساب كل هذا بالنسبة لنا من قبل مهمة الإصدار في نانت.
This keeps the version numbers unique and also allows us to quickly calculate when an installation was built.

No comments:

Post a Comment