مثال على تنفيذ التكامل المستمر مع BuildBot

مثال على تنفيذ التكامل المستمر مع BuildBot
(الصورة بواسطة حاسوب تبدأ من بيكس)

مرحبا!

اسمي يفجيني تشيركينانا مبرمج لفريق تطوير في شركة تعدين متعدد المعادن.

عند بدء أي مشروع كبير ، تبدأ في التفكير: "ما هو البرنامج الأفضل لاستخدامه لصيانته؟". يمر مشروع تكنولوجيا المعلومات بسلسلة من المراحل قبل إطلاق الإصدار التالي. إنه لأمر جيد عندما تكون سلسلة هذه المراحل مؤتمتة. في حد ذاته ، تسمى العملية الآلية لإصدار نسخة جديدة من مشروع تكنولوجيا المعلومات التكامل المستمر. بناء الروبوت أصبح مساعدًا جيدًا لنا ، وأدركنا هذه العملية.

في هذه المقالة قررت تقديم لمحة عامة عن الاحتمالات بناء الروبوت. ما هو هذا البرنامج قادر على؟ كيف تقترب منه وكيف تبني معه علاقة عمل طبيعية وفعالة؟ يمكنك تطبيق خبرتنا بنفسك عن طريق إنشاء خدمة تجميع واختبار عاملة لمشروعك على جهازك.

محتوى

محتوى

1. لماذا BuildBot؟
2. المفهوم بقيادة BuildMaster
3. التثبيت
4. الخطوات الأولى

5. التكوين. وصفة خطوة بخطوة

5.1 التكوين الرئيسي
عمال 5.2
5.3 تغيير المصدر
5.4 المجدولين

5.5 بناء المصنع
5.6 بناة

6. مثال على التكوين الخاص

6.1 في الطريق إلى master.cfg الخاص بك
6.2 العمل مع svn
6.3 رسالة لك: يحق للصحفيين الإبلاغ

لقد فعلناها! تهانينا

1. لماذا BuildBot؟

في وقت سابق على habr-e ، قابلت مقالات حول التنفيذ التكامل المستمر مع بناء الروبوت. على سبيل المثال ، هذا واحد بدا لي الأكثر إفادة. هناك مثال آخر - أسهل. يمكن تحرير هذه المقالات مثال من الدليلو هذا بعد ذلك ، باللغة الإنجليزية. تشكل الكوبيه نقطة انطلاق جيدة. بعد قراءة هذه المقالات ، ستحتاج بالتأكيد إلى شيء ما بناء الروبوت يفعل.

قف! هل استخدمه أحد بالفعل في مشاريعه؟ اتضح نعم كثير طبقوه في مهامهم. يمكن ايجاده أمثلة استخدم بناء الروبوت وفي أرشيفات كود جوجل.

إذن ما هو منطق الأشخاص الذين يستخدمون بناء الروبوت؟ بعد كل شيء ، هناك أدوات أخرى: مثبت السرعة и جنكينز. سأجيب هكذا. لمعظم المهام جنكينز وسوف تكون الحقيقة كافية. وبدورها، بناء الروبوت - أكثر تكيفًا ، بينما يتم حل المهام هناك ببساطة كما في جنكينز. اختار أنت. ولكن نظرًا لأننا نبحث عن أداة لتطوير مشروع مستهدف ، فلماذا لا تختار واحدًا يسمح ، بدءًا من الخطوات البسيطة ، بالحصول على نظام بناء يتميز بالتفاعلية وواجهة فريدة.

بالنسبة لأولئك الذين تمت كتابة مشروعهم المستهدف بلغة بيثون ، فإن السؤال الذي يطرح نفسه هو: "لماذا لا تختار نظام تكامل له واجهة واضحة من حيث اللغة المستخدمة في المشروع؟". والآن حان الوقت لتقديم الفوائد بناء الروبوت.

لذا ، لدينا "الرباعية الآلية". بنفسي ، لقد حددت أربع ميزات بناء الروبوت:

  1. إنه إطار عمل مفتوح المصدر بموجب ترخيص GPL.
  2. هذا هو استخدام بيثون كأداة لتكوين ووصف الإجراءات المطلوبة.
  3. هذه هي القدرة على تلقي استجابة من الجهاز الذي يتم التجميع عليه
  4. أخيرًا ، هذه هي المتطلبات الدنيا للمضيف. يتطلب النشر وجود بيثون وملفوف ولا يتطلب جهاز VM وجافا.

2. المفهوم بقيادة BuildMaster

مثال على تنفيذ التكامل المستمر مع BuildBot

المركزية في هندسة توزيع المهام هي BuildMaster. إنها خدمة:

  • المسارات التغييرات في شجرة مصدر المشروع
  • يرسل أوامر ليتم تنفيذها بواسطة خدمة العامل لبناء المشروع واختباره
  • يخطر المستخدمين حول نتائج أفعالهم

BuildMaster تم تكوينه عبر ملف سيد. cfg. هذا الملف موجود في الجذر BuildMaster. سأوضح لاحقًا كيف يتم إنشاء هذا الجذر. الملف نفسه سيد. cfg يحتوي على python - برنامج نصي يستخدم المكالمات بناء الروبوت.

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

BuildMaster أوامر البث للجميع عامل-y ، وهو ، بدوره ، يؤديها. أي ، اتضح أن عملية بناء واختبار المشروع يمكن أن تستمر عامل-e تحت Windows وعلى عامل آخر تحت لينكس.

الدفع رمز مصدر المشروع يحدث على كل عامل-e.

3. التثبيت

إذا هيا بنا. سأستخدم Ubuntu 18.04 كمضيف. على ذلك سأضع واحدة BuildMaster-أ وواحد عامل-أ. لكن عليك أولاً تثبيت python3.7:

sudo apt-get update
sudo apt-get install python3.7

بالنسبة لأولئك الذين يحتاجون إلى python3.7.2 بدلاً من 3.7.1 ، يمكنك القيام بما يلي:


sudo apt-get update
sudo apt-get software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get install python3.7
sudo ln -fs /usr/bin/python3.7 /usr/bin/python3
pip3 install --upgrade pip

الخطوة التالية هي التعيين غرد и بناء الروبوت، بالإضافة إلى الحزم التي تتيح لك استخدام وظائف إضافية بناء الروبوت-a.


/*Все что под sudo будет установленно для всех пользователей в директорию /usr/local/lib/python3.7/dist-packages*/

#На хосте который производит мониторинг Worker-ов 
sudo pip install twisted #Библиотека twisted
sudo pip install buildbot #BuildMaster
#Дополнительный функционал
pip install pysqlite3 #Устанавливаем базу sqllite в учебных целях
pip install jinja2 #framework наподобие django, для web и для почтовых рассыллок
pip install autobahn #Web cокеты для связи BuildMaster->Worker
pip install sqlalchemy sqlalchemy-migrate #Для отображения схемы базы данных
#Для Web отображения BuildBot-a
pip install buildbot-www buildbot-grid-view buildbot-console-view buildbot-waterfall-view
pip install python-dateutil #Отображение дат в web
#На стороне хоста который непосредственно осуществляет сборку и тестирование 
pip install buildbot-worker #Worker
#Дополнительный функционал
sudo pip install virtualenv #Виртуальная среда 

4. الخطوات الأولى

حان وقت الإنشاء BuildMaster. سيكون في مجلدنا. / home / habr / master.

mkdir master
buildbot create-master master # Собственно сдесь и создаем

الخطوة التالية. دعونا نخلق عامل. سيكون في مجلدنا. / home / habr / worker.

mkdir worker
buildbot-worker create-worker --umask=0o22 --keepalive=60 worker localhost:4000 yourWorkerName password

عندما تركض عامل، ثم سيتم إنشاؤه افتراضيًا بتنسيق / home / habr / worker مجلد باسم المشروع المحدد في سيد. cfg. وفي المجلد الذي يحمل اسم المشروع ، سيقوم بإنشاء دليل نساعدك في بناء، وبعد ذلك ستفعل الخروج. دليل العمل ل عامل-a سيصبح دليلًا / home / habr / yourProject / build.

"مفتاح ذهبي
والآن ما كتبته في الفقرة السابقة: سيناريو ذلك الماجستير سوف يتطلب عامللن يتم تنفيذ -a do remote في هذا الدليل لأن البرنامج النصي ليس لديه إذن للتشغيل. لإصلاح الوضع ، أنت بحاجة إلى مفتاح --umask = 0o22، الذي يحظر الكتابة إلى هذا الدليل ، لكنه يترك حقوق التشغيل. وهذا كل ما نحتاجه.

BuildMaster и عامل إقامة اتصال مع بعضها البعض. يحدث أنه يكسر و عامل في انتظار رد من BuildMaster-أ. إذا لم يكن هناك استجابة ، فسيتم إعادة الاتصال. مفتاح - حفظ الحياة = 60 هناك حاجة فقط للإشارة إلى الوقت بعد ذلك طريقة التنفيذ يعيد التشغيل.

5. التكوين. وصفة خطوة بخطوة

ترتيب BuildMaster يتم تنفيذها على جانب الجهاز حيث قمنا بتنفيذ الأمر خلق سيد. في حالتنا ، هذا هو الدليل / home / habr / master. ملف الضبط سيد. cfg غير موجود بعد ، ولكن الأمر نفسه أنشأ الملف بالفعل master.cmg.sample. تحتاج إلى إعادة تسميته إلى master.cfg.sample в سيد. cfg

mv master.cfg.sample master.cfg

لنفتح هذا سيد. cfg. ودعونا نرى ما تتكون منه. وبعد ذلك سنحاول إنشاء ملف التكوين الخاص بنا.

سيد. cfg

c['change_source'] = []
c['change_source'].append(changes.GitPoller(
    'git://github.com/buildbot/hello-world.git',
         workdir='gitpoller-workdir', branch='master',
         pollInterval=300))
                        
c['schedulers'] = []
c['schedulers'].append(schedulers.SingleBranchScheduler(
        name="all",
        change_filter=util.ChangeFilter(branch='master'),
        treeStableTimer=None,
        builderNames=["runtests"]))
c['schedulers'].append(schedulers.ForceScheduler(
        name="force",
        builderNames=["runtests"]))
                        
factory = util.BuildFactory()
                        
factory.addStep(steps.Git(repourl='git://github.com/buildbot/hello-world.git', mode='incremental'))
factory.addStep(steps.ShellCommand(command=["trial", "hello"],
                                   env={"PYTHONPATH": "."}))
                        
c['builders'] = []
c['builders'].append(
    util.BuilderConfig(name="runtests",
    workernames=["example-worker"],
    factory=factory))
                         
c['services'] = []
                        
c['title'] = "Hello World CI"
c['titleURL'] = "https://buildbot.github.io/hello-world/"
                        
                        
c['buildbotURL'] = "http://localhost:8010/"
                        
c['www'] = dict(port=8010,
                plugins=dict(waterfall_view={}, console_view={}, grid_view={}))
                        
c['db'] = {
    'db_url' : "sqlite:///state.sqlite",
}

5.1 التكوين الرئيسي

c = BuildmasterConfig = {} 

برنامج BuildmasterConfig - القاموس الأساسي لملف التكوين. يجب تضمينه في ملف التكوين. لسهولة الاستخدام ، تم تقديم الاسم المستعار الخاص به في كود التكوين "ج". الألقاب من المفاتيح в ج ["keyFromDist"] هي عناصر ثابتة للتفاعل معها BuildMaster. تحت كل مفتاح ، يتم استبدال الكائن المقابل كقيمة.

عمال 5.2

c['workers'] = [worker.Worker("example-worker", "pass")]

هذه المرة نشير BuildMasterقائمة من عامل-ov. نفسي عامل السادسة الا خمس فوق، مشيرا اسم العامل и كلمه السر. الآن يجب تحديدها بدلاً من ذلك مثال عامل и pass .

5.3 تغيير المصدر

c['change_source'] = []
c['change_source'].append(changes.GitPoller(
                            'git://github.com/buildbot/hello-world.git',
                             workdir='gitpoller-workdir', branch='master',
                             pollInterval=300))                

بالمفتاح تغيير المصدر القاموس ج نحصل على الوصول إلى القائمة حيث تريد وضع الكائن الذي يستعلم عن المستودع مع الكود المصدري للمشروع. يستخدم المثال مستودع Git الذي يتم استقصائه على فترات منتظمة.

الوسيطة الأولى هي المسار إلى المستودع الخاص بك.

عمل يمثل المسار إلى المجلد حيث على الجانب عامل- نسبة إلى المسار / home / habr / worker / yourProject / build سيقوم git بتخزين الإصدار المحلي من المستودع.

خيران يحتوي على فرع معين في المستودع لمتابعة.

فاصل الاستقصاء يحتوي على عدد الثواني التي بعدها BuildMaster سيستقصي المستودع عن التغييرات.

هناك عدة طرق لتتبع التغييرات في مستودع المشروع.

أبسط طريقة هي الاقتراع، مما يعني أن BuildMaster يستقصي بشكل دوري الخادم مع المستودع. لو ارتكاب يعكس التغييرات في المستودع ، إذن BuildMaster مع بعض التأخير سيخلق الكائن الداخلي التغيير وإرساله إلى معالج الأحداث جدولة، والتي ستطلق خطوات بناء واختبار المشروع على عامل-e. ستشمل هذه الخطوات تحديث مخزن. بالضبط في عامل-نقوم بإنشاء نسخة محلية من المستودع. سيتم تغطية تفاصيل هذه العملية أدناه في القسمين التاليين. (5.4 и 5.5).

هناك طريقة أكثر أناقة لتتبع التغييرات على المستودع وهي إرسال الرسائل مباشرة من الخادم الذي يستضيفها إليه BuildMaster- حول تغيير الكود المصدري للمشروع. في هذه الحالة ، بمجرد قيام المطور ارتكاب، سيرسل الخادم مع مستودع المشروع رسالة BuildMaster-ص. وهذا بدوره سيعترضه عن طريق إنشاء كائن المصدر. سيتم بعد ذلك تمرير هذا الكائن إلى جدولةالذي ينشط خطوات بناء المشروع واختباره. جزء مهم من هذه الطريقة هو هذا العمل مع صنارة صيد- نصوص الخادم في المستودع. في النص صنارة صيد-a ، مسؤول عن معالجة الإجراءات عندما ارتكاب-E ، تحتاج إلى استدعاء الأداة المساعدة إرسال التغيير وحدد عنوان الشبكة BuildMaster-أ. تحتاج إلى تحديد منفذ الشبكة الذي سيستمع المصدر. المصدربالمناسبة ، هو جزء من BuildMaster-أ. هذه الطريقة سوف تتطلب الحق مشرف-a على الخادم حيث يوجد مستودع المشروع. تحتاج أولاً إلى عمل نسخة احتياطية من المستودع.

5.4 المجدولين


c['schedulers'] = []
c['schedulers'].append(schedulers.SingleBranchScheduler(
        name="all",
        change_filter=util.ChangeFilter(branch='master'),
        treeStableTimer=None,
        builderNames=["runtests"]))
c['schedulers'].append(schedulers.ForceScheduler(
        name="force",
        builderNames=["runtests"]))

المجدولين - هذا عنصر يعمل كمحفز يبدأ سلسلة التجميع والاختبار الكاملة للمشروع.
مثال على تنفيذ التكامل المستمر مع BuildBot

التغييرات التي تم ارتكابها تغيير المصدر، تحول في سياق العمل بناء الروبوت-a للاعتراض التغيير والآن كل شيدولر بناءً عليها ، فإنه يبني طلبات لبدء عملية بناء المشروع. ومع ذلك ، فإنه يحدد أيضًا متى يتم تمرير هذه الطلبات إلى قائمة الانتظار. شيء منشئ يحتفظ بقائمة انتظار من الطلبات ويتتبع حالة التجميع الحالي في ملف منفصل عامل-و. منشئ موجود أيضًا في BuildMaster-E و on عامل-e. يرسل من BuildMaster-و على عامل- محددة بالفعل نساعدك في بناء - سلسلة من الخطوات الواجب اتباعها.
نرى ذلك في المثال الحالي من هذا القبيل المجدولين 2 تم إنشاؤها. علاوة على ذلك ، لكل منها نوعه الخاص.

SingleBranchScheduler هي واحدة من أكثر فصول الجدولة شيوعًا. يراقب فرعًا واحدًا ويؤدي إلى تغيير ملتزم فيه. عندما يرى التغييرات ، يمكنه تأجيل إرسال طلب البناء (التأجيل للمدة المحددة في المعامل الخاص الشجرة). ال الاسم يحدد اسم الجدول الذي سيتم عرضه في بناء الروبوت-واجهة ويب. في تغيير عامل التصفية يتم تعيين عامل التصفية، وبعد اجتياز التغييرات في الفرع يدفع الجدول الزمني لإرسال طلب للبناء. في الأسماء يشار إلى الاسم باني-a ، والتي سنحددها بعد قليل. سيكون الاسم في حالتنا هو نفسه اسم المشروع: مشروعك.

ForceScheduler شيء بسيط للغاية. يتم تشغيل هذا النوع من الجدول عن طريق النقر بالماوس بناء الروبوت-واجهة ويب. المعلمات هي نفسها كما في SingleBranchScheduler.

PS # 3. فجأة أصبح في متناول يديك
دوري - هذا جدول يعمل على فترات زمنية محددة. المكالمة تبدو مثل هذا


from buildbot.plugins import schedulers
nightly = schedulers.Periodic(name="daily",
                              builderNames=["full-solaris"],
                              periodicBuildTimer=24*60*60)
c['schedulers'] = [nightly]                    

5.5 بناء المصنع


factory = util.BuildFactory()
                        
factory.addStep(steps.Git(repourl='git://github.com/buildbot/hello-world.git', mode='incremental'))
factory.addStep(steps.ShellCommand(command=["trial", "hello"],
                                   env={"PYTHONPATH": "."}))

دورية يحدد وقت هذه الدورية بالثواني.

بناء مصنع يخلق محدد نساعدك في بناء، اي واحد اذن باني يعود الى عامل. في بناء مصنع يشير إلى الخطوات الواجب اتخاذها عامل-ص. يتم إضافة الخطوات عن طريق استدعاء طريقة addStep

الخطوة الأولى المضافة في هذا المثال هي بوابة نظيفة-د -f -f –xثم بوابة الخروج. يتم تضمين هذه الإجراءات في المعلمة طريقة، والتي لم يتم تحديدها صراحة ولكنها تتضمن قيمة افتراضية جديد. معامل الوضع = 'تزايدي' يقول أن الملفات من الدليل حيث ملف chechout، في حين أن أولئك المفقودين في المستودع يظلون على حالهم.

الخطوة الثانية المضافة هي استدعاء البرنامج النصي محاكمة مع المعلمة مرحبا على الجانب عامل-a من الدليل / home / habr / worker / yourProject / build مع متغير البيئة PATHONPATH = ... وهكذا ، يمكنك كتابة البرامج النصية الخاصة بك وتنفيذها على الجانب عاملمن خلال خطوة use.ShellCommand. يمكن وضع هذه البرامج النصية مباشرة في المستودع. ثم في chechout، سوف يسقطون فيه / home / habr / worker / yourProject / build. ومع ذلك ، هناك نوعان من "التحفظات":

  1. عامل يجب أن يتم إنشاؤه بمفتاح --وماسك بحيث لا يمنع حقوق التنفيذ بعد الخروج-a.
  2. في دفعة غيت-e من هذه البرامج النصية يجب أن تحدد خاصية شديدلذلك في وقت لاحق chechoutلم تفقد -e الإذن بتنفيذ نص Git.

5.6 بناة


c['builders'] = []
c['builders'].append(util.BuilderConfig(name="runtests",
                                        workernames=["example-worker"],
                                        factory=factory))

حول ما هو عليه منشئ قيل هنا. الآن سأخبرك بمزيد من التفاصيل حول كيفية إنشائه. تكوين البناء هو منشئ باني. مثل هؤلاء الصانعين في ج ["بناة"] يمكن تحديد أكثر من واحد لأن هذه قائمة من الكائنات باني يكتب. الآن دعنا نعيد كتابة المثال من بناء الروبوتلتقريبها من مشكلتنا.


c['builders'] = []
c['builders'].append(util.BuilderConfig(name="yourProject",
                                            workernames=["yourWorkerName"],
                                            factory=factory))

الآن دعنا نتحدث عن الإعدادات. تكوين البناء.

الاسم يحدد الاسم باني-أ. هنا قمنا بتسميته مشروعك. وهذا يعني أن على عامل-ه سيتم إنشاء هذا المسار / home / habr / worker / yourProject / build. شيدولر يبحث عن باني فقط بهذا الاسم.

أسماء العمل يحتوي على ورقة عامل-ov. يجب إضافة كل منها إلى ج ["عمال"].

مصنع - محدد نساعدك في بناءالذي يرتبط به باني. سوف ترسل شيئا نساعدك في بناء في عامل لإكمال جميع الخطوات المدرجة في هذا نساعدك في بناء-a.

6. مثال على التكوين الخاص

إليك نموذج هندسة المشروع الذي أقترح تنفيذه عبر بناء الروبوت
.

كنظام للتحكم في الإصدار ، سوف نستخدم إس. سيكون المستودع نفسه موجودًا في بعض السحابة. هنا عنوان هذه السحابة svn.host/svn/yourProject/trunk. في السحابة تحت إس يوجد اسم مستخدم للحساب: المستخدم، passwd: كلمه السر. البرامج النصية التي هي خطوات نساعدك في بناء- سيكون أيضا في الفرع إس، في مجلد منفصل buildbot / worker_linux. هذه البرامج النصية موجودة في المستودع مع الخاصية المحفوظة تنفيذ.

BuildMaster и عامل تشغيل على نفس المضيف المشروع .BuildMaster يخزن ملفاته في مجلد / home / habr / master. عامل نفس المتاجر في المسار التالي / home / habr / worker. عملية الاتصال BuildMaster-a و عامل-أ يتم إجراؤه عبر المنفذ 4000 وفقًا للبروتوكول بناء الروبوت-أ هذا هو "pb" بروتوكول.

المشروع المستهدف مكتوب بالكامل بلغة بيثون. وتتمثل المهمة في تتبع التغييرات وإنشاء ملف قابل للتنفيذ وإنشاء الوثائق وإجراء الاختبار. في حالة الفشل ، يحتاج جميع المطورين إلى إرسال رسالة إلى البريد تفيد بوجود إجراء غير ناجح.

عرض الويب بناء الروبوت سنقوم بالاتصال بالمنفذ 80 من أجل المشروع. Apatch غير مطلوب. كجزء من المكتبة الملتوية يوجد بالفعل خادم ويب ، بناء الروبوت يستخدمه.

لتخزين المعلومات الداخلية لـ بناء الروبوت سوف نستخدم سكليتي.

القائمة البريدية يحتاج إلى مضيف smtp الخاص بك - يسمح بإرسال الرسائل من البريد [البريد الإلكتروني محمي] بدون مصادقة. أيضا على المضيف "SMTP يتم الاستماع إلى البروتوكول في ما بعد 1025.

هناك شخصان مشتركان في العملية: مشرف и المستخدم. يدير المسؤول بناء الروبوت. المستخدم هو الشخص الذي يصنع ارتكاب-س.

يتم إنشاء الملف القابل للتنفيذ عبر Pyinstaller. يتم إنشاء الوثائق عبر دوكسيجن.

لهذه العمارة ، كتبت هذا سيد. cfg:

سيد. cfg


import os, re
from buildbot.plugins import steps, util, schedulers, worker, changes, reporters

c= BuildmasterConfig ={}

c['workers'] = [ worker.Worker('yourWorkerName', 'password') ]
c['protocols'] = {'pb': {'port': 4000}} 


svn_poller = changes.SVNPoller(repourl="https://svn.host/svn/yourProject/trunk",
                                svnuser="user",
                                svnpasswd="password",
                                pollinterval=60,
				split_file=util.svn.split_file_alwaystrunk
                                )

c['change_source'] =  svn_poller

hourlyscheduler = schedulers.SingleBranchScheduler(
                                name="your-project-schedulers",
				change_filter=util.ChangeFilter(branch=None),
                                builderNames=["yourProject"],
				properties = {'owner': 'admin'}
                                )

c['schedulers'] = [hourlyscheduler]

checkout = steps.SVN(repourl='https://svn.host/svn/yourProject/trunk',
                        mode='full',
                        method='fresh',
                        username="user",
                        password="password",
                        haltOnFailure=True)

	
projectHost_build = util.BuildFactory()  


cleanProject = steps.ShellCommand(name="Clean",
                 command=["buildbot/worker_linux/pyinstaller_project", "clean"]
                                )
buildProject = steps.ShellCommand(name="Build",
                 command=["buildbot/worker_linux/pyinstaller_project", "build"]
                                )
doxyProject = steps.ShellCommand(name="Update Docs",
                                command=["buildbot/worker_linux/gendoc", []]
                                )
testProject = steps.ShellCommand(name="Tests",
                                command=["python","tests/utest.py"],
                                env={'PYTHONPATH': '.'}
                                )

projectHost_build.addStep(checkout)
projectHost_build.addStep(cleanProject)
projectHost_build.addStep(buildProject)
projectHost_build.addStep(doxyProject)
projectHost_build.addStep(testProject)


c['builders'] = [
        util.BuilderConfig(name="yourProject", workername='yourWorkerName', factory=projectHost_build)
]


template_html=u'''
<h4>Статус построенного релиза: {{ summary }}</h4>
<p>Используемый сервис для постраения: {{ workername }}</p>
<p>Проект: {{ projects }}</p>
<p>Для того что бы посмотреть интерфейс управления пройдите по ссылке: {{ buildbot_url }}</p>
<p>Для того что бы посмотреть результат сборки пройдите по ссылке: {{ build_url }}</p>
<p>Используя WinSCP можно подключиться к серверу c ip:xxx.xx.xxx.xx. Войдя под habr/password, забрать собранный executable файл с директории ~/worker/yourProject/build/dist.</p>
<p><b>Построение было произведено через Buildbot</b></p>
'''

sendMessageToAll = reporters.MailNotifier(fromaddr="[email protected]",
					sendToInterestedUsers=True,
					lookup="your.domain",
					relayhost="smtp.your.domain",
					smtpPort=1025,
					mode="warnings",
					extraRecipients=['[email protected]'],
              messageFormatter=reporters.MessageFormatter(
						template=template_html,
						template_type='html',
						wantProperties=True, 
                                                wantSteps=True)
					)
c['services'] = [sendMessageToAll]

c['title'] = "The process of bulding"
c['titleURL'] = "http://project.host:80/"

c['buildbotURL'] = "http://project.host"

c['www'] = dict(port=80,
                plugins=dict(waterfall_view={}, console_view={}, grid_view={}))


c['db'] = {
    'db_url' : "sqlite:///state.sqlite"
}

أولا تحتاج خلق BuildMaster-a و عامل-أ. ثم الصق هذا الملف سيد. cfg в / home / habr / master.

الخطوة التالية هي بدء الخدمة BuildMasterالصورة


sudo buildbot start /home/habr/master

ثم ابدأ الخدمة عامل-a


buildbot-worker start /home/habr/worker

مستعد! الآن بناء الروبوت سوف تتبع التغييرات والعمل على ارتكاب-Y في إسباتباع خطوات البناء والاختبار لمشروع بالبنية المذكورة أعلاه.

أدناه سوف أصف بعض الميزات المذكورة أعلاه سيد. cfg.

6.1 في الطريق إلى master.cfg الخاص بك


أثناء كتابة بلدي سيد. cfg سيتم ارتكاب الكثير من الأخطاء ، لذا ستكون قراءة ملف السجل مطلوبة. يتم تخزينه على هيئة ملفات BuildMaster-ec المسار المطلق /home/habr/master/twistd.logوعلى الجانب عامل-أ مع المسار المطلق /home/habr/worker/twistd.log. أثناء قراءة الخطأ وإصلاحه ، ستحتاج إلى إعادة تشغيل الخدمة BuildMaster-أ. إليك كيف يتم ذلك:


sudo buildbot stop /home/habr/master
sudo buildbot upgrade-master /home/habr/master
sudo buildbot start /home/habr/master

6.2 العمل مع svn


svn_poller = changes.SVNPoller(repourl="https://svn.host/svn/yourProject/trunk",
                               svnuser="user",
                               svnpasswd="password",
                               pollinterval=60,
                               split_file=util.svn.split_file_alwaystrunk
                        )

c['change_source'] =  svn_poller

hourlyscheduler = schedulers.SingleBranchScheduler(
                            name="your-project-schedulers",
                            change_filter=util.ChangeFilter(branch=None),
                            builderNames=["yourProject"],
                            properties = {'owner': 'admin'}
                        )

c['schedulers'] = [hourlyscheduler]

checkout = steps.SVN(repourl='https://svn.host/svn/yourProject/trunk',
                     mode='full',
                     method='fresh',
                     username="user",
                     password="password",
                     haltOnFailure=True)

أولا، دعونا نلقي نظرة على svn_poller. لا تزال نفس الواجهة ، حيث تقوم باستقصاء المستودع بانتظام مرة واحدة في الدقيقة. في هذه الحالة svn_poller يشير فقط إلى الفرع جذع. معلمة غامضة Split_file = util.svn.split_file_alwaystrunk يحدد القواعد: كيفية تقسيم بنية المجلد إس على الفروع. كما يقدم لهم مسارات نسبية. بدوره Split_file_alwaystrunk يبسط العملية بالقول أن المستودع فقط جذع.

В المنظمون مبين تغيير عامل التصفيةمن يعلم بدون اضاءة ويرتبط بها فرع جذع من خلال جمعية معينة من خلال Split_file_alwaystrunk. الاستجابة للتغيرات في جذعإطلاق باني بالاسم مشروعك.

HAS هنا يكون ذلك ضروريًا حتى يتلقى المسؤول قوائم بريدية لنتائج البناء والاختبار بصفته مالك العملية.

خطوة نساعدك في بناء-a الخروج قادر على القيام بإزالة كاملة لأي ملفات موجودة في الإصدار المحلي من المستودع عامل-أ. ثم أكمل تحديث svn. ضبط الوضع عبر المعلمة الوضع = ممتلئ, طريقة = طازجة. معامل stopOnTailure يقول أنه إذا تحديث svn سيتم تنفيذه بخطأ ، ثم يجب تعليق عملية البناء والاختبار بأكملها ، لأن الإجراءات الإضافية لا معنى لها.

6.3 رسالة لك: يحق للصحفيين الإبلاغ


للصحفيين هي خدمة إعلام بالبريد الإلكتروني.


template_html=u'''
<h4>Статус построенного релиза: {{ summary }}</h4>
<p>Используемый сервис для постраения: {{ workername }}</p>
<p>Проект: {{ projects }}</p>
<p>Для того что бы посмотреть интерфейс управления пройдите по ссылке: {{ buildbot_url }}</p>
<p>Для того что бы посмотреть результат сборки пройдите по ссылке: {{ build_url }}</p>
<p>Используя WinSCP можно подключиться к серверу c ip:xxx.xx.xxx.xx. Войдя под habr/password, забрать собранный executable файл с директории ~/worker/yourProject/build/dist.</p>
<p><b>Построение было произведено через Buildbot</b></p>
'''
                        
sendMessageToAll = reporters.MailNotifier(fromaddr="[email protected]",
                                          sendToInterestedUsers=True,
                                          lookup="your.domain",
                                          relayhost="smtp.your.domain",
                                          smtpPort=1025,
                                          mode="warnings",
                                          extraRecipients=['[email protected]'],
                                    messageFormatter=reporters.MessageFormatter(
                                                    template=template_html,
                                                    template_type='html',
                                                    wantProperties=True, 
                                                    wantSteps=True)
                                        )
c['services'] = [sendMessageToAll]

يمكنه إرسال الرسائل طرق مختلفة.

MailNotifier يستخدم البريد لإرسال الإخطارات.

template_html يحدد قالب النص للرسائل البريدية. يستخدم HTML لإنشاء العلامات. تم تعديل المحرك جينجا 2 (يمكن مقارنتها بـ جانغو). بناء الروبوت يحتوي على مجموعة من المتغيرات ، يتم استبدال قيمها في القالب أثناء تكوين نص الرسالة. هذه المتغيرات محاطة بـ {{أقواس معقوفة مزدوجة}}. على سبيل المثال، ملخص يعرض حالة العمليات المكتملة ، أي النجاح أو الفشل. أ مشروع ناجح سوف تبرز مشروعك. لذلك ، بمساعدة أوامر التحكم في جينجا 2، المتغيرات بناء الروبوت-a و python ، يمكنك إنشاء رسالة مفيدة للغاية.

MailNotifier يحتوي على الحجج التالية.

fromaddr - العنوان الذي سيتم من خلاله إرسال البريد إلى الجميع.

أرسل إلى المستخدمين المهتمين= True يرسل رسالة إلى المالك والمستخدم الذي قام بعمل ارتكاب.

بحث - لاحقة تضاف إلى أسماء المستخدمين التي تتلقى القائمة البريدية. لذا مشرف كيف سيتلقى المستخدم البريد على العنوان [البريد الإلكتروني محمي].

Relayhost يحدد اسم المضيف حيث يكون الخادم مفتوحًا SMTPأو المعلم smptPort يحدد رقم المنفذ الذي يستمع SMTP الخادم.

الوضع = "تحذير" يقول أن المراسلات يجب أن تتم فقط إذا كانت هناك خطوة واحدة على الأقل نساعدك في بناء- التي انتهت بحالة فشل أو تحذير. في حالة النجاح ، لا يلزم الإرسال بالبريد.

extraRecipients يحتوي على قائمة بالأشخاص الذين يجب إرسال البريد إليهم ، بالإضافة إلى المالك والشخص الذي قام بتنفيذ ارتكاب.

الرسالة هو كائن يحدد تنسيق الرسالة ونموذجها ومجموعة من المتغيرات المتاحة من جينجا 2. خيارات مثل wantProperties = صحيح и wantSteps = صحيح تحديد هذه المجموعة من المتغيرات المتاحة.

مع ['services'] = [sendMessageToAll] يقدم قائمة بالخدمات ، من بينها صحافي.

لقد فعلناها! تهانينا

أنشأنا التكوين الخاص بنا ورأينا الوظيفة التي بناء الروبوت. أعتقد أن هذا كافٍ لفهم ما إذا كانت هذه الأداة ضرورية لإنشاء مشروعك. هل هو مهتم بك؟ هل ستكون مفيدة لك؟ هل هو مريح للعمل معه؟ ثم أكتب هذا المقال لا تذهب سدى.

و أبعد من ذلك. أود أن يستخدم المجتمع المهني بناء الروبوت، أصبحت أوسع ، تمت ترجمة الكتيبات ، وكان هناك المزيد من الأمثلة.

شكرا لكم جميعا على اهتمامكم. حظ سعيد.

المصدر: www.habr.com

إضافة تعليق