سؤال

أقوم بنقل الاختبار المستمر إلى خادم مخصص (يبطئ Autotest جهاز الكمبيوتر المحمول المحلي كثيرًا). ما أحبه هو أن يحصل خادم الاختبار الخاص بي (الذي يحدث أنه يعمل على تشغيل Cruisecontrol.rb) باستمرار من آخر تغييرات (ملتزمة) عبر GIT - من الناحية المثالية ، دون أي تغييرات على سير العمل الخاص بي. أنا المطور الوحيد الذي يعمل في هذا المشروع.

قبل الحصول على خادم الاختبار ، كان لدي:

  • جهاز الكمبيوتر المحمول الخاص بي كنظام تطوير رئيسي
  • فروع متعددة في مستودعي المحلي.
  • نسخة عمل محلية ، تشير إلى أحد الفروع. أنا أتبديل بين الفروع بشكل متكرر (عادة لميزات جديدة).
  • حساب github ، الذي أدفع إليه بشكل متكرر الفروع المحلية إلى فروع بعيدة. (هذا في الغالب لاستخدام نسخة احتياطية خارج الموقع ؛ أنا لا أشارك أي رمز لمشروعي الحالي). أحاول الضغط على Github على الأقل في نهاية كل يوم عمل ، على الرغم من أنني أنسى أحيانًا.

أود أن أبقي كل ذلك سليمة. علاوة على ذلك ، لدي الآن:

  • خادم الاختبار
  • ... تشغيل Cruisecontrol.rb
  • استنساخ من مستودع الكمبيوتر المحمول الخاص بي على خادم الاختبار الخاص بي. (حاليا لا يستنسخ جيثب)
  • نسخة عمل محلية على خادم الاختبار ، والتي تقوم منها CC بإنشاء/اختبار.
  • تشير نسخة العمل هذه إلى فرع GIT معين (بالطبع)

لقد كنت أحاول أن أحصل على خادم الاختبار تلقائيًا على أي فرع أعمل عليه على نسخة العمل في الكمبيوتر المحمول وبناء من ذلك. (من شأنه أن يحاكي الاختبار المستمر لـ Autotest دون تناول موارد النظام).

الأشياء التي جربتها دون نجاح:

  • Git Checkout Origin/Head: هذا يحصل على الملفات بشكل جيد ولكنه يكسر Cruisecontrol لأنه لا يحب نسخة العمل "بدون فرع".
  • git headout -track -b a_branch Origin/a_branch: هذا يعمل بشكل جيد للحصول على الملفات ، ويعجب CC ، لكنه يلتزم خادم الاختبار بفرع معين. عند تبديل الفروع على الكمبيوتر المحمول ، سأتوقف بشكل فعال عن اختبار عملي الحالي.
  • GIT Checkout -track -b my_testing_branch Origin/Head: هذا يحصل أيضًا على ملفات قابلة للإنشاء ، ولكنه يعاني من نفس المشكلة مثل الأمر أعلاه. إن إنشاء فرع من Origin/Head فقط يحصل على الرأس للفرع "الافتراضي" ، لذلك فهو أيضًا لزج.

هل هناك أي طريقة يمكنني من خلالها الحصول على نظام اختبار مستمر جيد (مع أو بدون فروع GIT) لا ينطوي على تغييرات كبيرة في سير العمل الخاص بي؟

هل كانت مفيدة؟

المحلول

خيار آخر هو كتابة أ خُطَّاف هذا يخطر خادم الاختبار للرمز الجديد لسحبه. على وجه الخصوص ، أ post-commit ربما يكون الخطاف طريقًا أفضل. بعد ذلك ، في كل مرة تلتزم بها ، يمكنك إبلاغ خادم الاختبار بما يجب سحبه ومن أي فرع.

نصائح أخرى

يمكن أن يكون لديك فرع اختبار مخصص يمكنك دمج عملك الحالي.
يمكنك فرض استبدال محتوى هذا الفرع بالالتزام بفرع العمل الحالي (انظر git دمجنا ، ماذا عن "لهم" سؤال).

ثم على خادم CI ، تقوم بتهيئته بـ:

 $ git fetch laptopRepo
 $ git checkout -b testingBranch laptopRepo/testingBranch

إنه يعني خطوة أولى على جانب الكمبيوتر المحمول لنشر بعض الأعمال الحالية للاختبار.

هذا ليس الحل الأعظم ولكنه شيء ...

يمكن تشغيل خادم الاختبار git remote show origin لمعرفة أي فرع نشط حاليًا على الكمبيوتر المحمول. على سبيل المثال ،

$ git remote show origin
* remote origin
  Fetch URL: blade:/var/scratch/code
  Push  URL: blade:/var/scratch/code
  HEAD branch: foo
  Remote branches:
    foo tracked
    bar tracked
    qux tracked

لذلك ، فإن مستودع الأصل موجود حاليًا foo فرع.

لم أر أمرًا منخفض المستوى سيعطيك ذلك مباشرة حتى تضطر إلى تحليله من هذا (ربما سيكون لدى شخص ما طريقة أفضل). مثال،

$ b=$(git remote show origin | grep "HEAD branch" | awk -F: '{print $2}')
$ echo $b
foo

الآن ، منذ ذلك الحين origin/foo سوف يتصرف مماثلة ل origin/HEAD (لا يوجد فرع محلي) ولا يعجبك مونسكونيترول الخاص بك أنه من المحتمل أن تنشئ فرعًا محليًا على جهاز الاختبار وببساطة إعادة تعيينه إلى آخر موقع:

$ b=$(git remote show origin | grep "HEAD branch" | awk -F: '{print $2}')
$ git reset --hard origin/$b

لاحظ أن هذا هش قليلاً منذ ذلك الحين HEAD لا أكون دائمًا ما تعتقد أنه. على سبيل المثال ، خلال Rebase HEAD سوف تتحرك للخلف وإلى الأمام. إذا فحص خادم الاختبار الخاص بك HEAD على جهاز الكمبيوتر المحمول الخاص بك أثناء Rebase ، يمكن أن تحصل على بعض الموقع غير صالح أو غير مرغوب فيه.

أعتقد أن حل حل جيد عن طريق قلب العلاقة بين النظامين. بدلاً من الحصول على خادم الاختبار من مستودع الكمبيوتر المحمول ، يمكن أن يكون لديّ تغييرات دفع الكمبيوتر المحمول إلى الخادم للاختبار.

أولاً أضيف جهاز تحكم عن بعد على ريبو الكمبيوتر المحمول:

git remote add testing <url of testing server>

ثم ، كلما كان لدي رمز للاختبار ، أقوم بدفع:

git push -f testing HEAD:master

سيعمل هذا من أي فرع أنا حاليًا. يضمن -F أنني سأفجر كل ما هو موجود بالفعل في هذا الفرع ؛ لن داعي للقلق بشأن أي أسلاف.

لن يضع هذا في الواقع أحدث الكود في نسخة عمل ، لكن استطلاع Cruisecontrol يمكن أن يحل ذلك. يمكن أن يكون لديّ خطاف من جانب الخادم يقوم بتحديث نسخة عمل و يدير مجموعة الاختبار (لن أحتاج حتى CC في تلك المرحلة).

ربما أرغب في إضافة أمر مشترك لالتزام+دفع إلى برنامج نصي أو الاسم المستعار ؛ هذا سوف يعطيني التزام واختبار واحد. إذا كنت أرغب لسبب ما في التزام بدون اختبار اختبار (أو العكس) ، فأنا لدي هذه الخيارات أيضًا.

يستضيف على جيثب واستخدمهم السنانير بعد الاسترداد. هكذا مثل الخدمات منح و RunCoderun افعلها.

لقد فكرت في تخطي GIT والذهاب إلى حل مشترك/NFS/RSYNC ، لكن هذا لديه مشكلة رئيسية واحدة: لا يتم تشغيله بواسطة/يقتصر على الالتزامات ، لذلك سأنتهي في نهاية المطاف الحصول على تصميمات مكسورة إيجابية كاذبة أثناء وجودي ". م في منتصف كتابة شيء ما.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top