نمونه ای از پیاده سازی Continuous Integration با BuildBot

نمونه ای از پیاده سازی Continuous Integration با BuildBot
(تصویر توسط کامپیوتر ساز از جانب Pixabay)

سلام!

نام من ... اوگنی چرکین، من یک برنامه نویس در یک تیم توسعه در یک شرکت معدن هستم چند فلزی.

هنگام شروع هر پروژه بزرگ، شروع به فکر کردن می کنید: "از چه نرم افزاری برای نگهداری بهتر است؟" یک پروژه IT قبل از انتشار نسخه بعدی، چندین مرحله را طی می کند. وقتی زنجیره این مراحل خودکار باشد خوب است. فرآیند خودکار انتشار یک نسخه جدید از یک پروژه فناوری اطلاعات خود نامیده می شود ادغام مداوم. BuildBot در اجرای این فرآیند دستیار خوبی برای ما بود.

در این مقاله تصمیم گرفتم یک مرور کلی از احتمالات ارائه کنم BuildBot. این نرم افزار چه توانایی هایی دارد؟ چگونه به او نزدیک شویم و چگونه یک رابطه کاری موثر عادی با او ایجاد کنیم؟ شما می توانید تجربه ما را خودتان با ایجاد یک سرویس کاری برای ساخت و آزمایش پروژه خود بر روی دستگاه خود به کار ببرید.

مقدار

مقدار

1. چرا BuildBot؟
2. مفهومی که توسط BuildMaster رهبری می شود
3. نصب و راه اندازی
4. مراحل اولیه

5. پیکربندی. دستور گام به گام

5.1 BuildmasterConfig
کارگران 5.2
5.3 change_source
5.4 زمانبندی

5.5 BuildFactory
5.6 سازنده

6. نمونه ای از پیکربندی خودتان

6.1 در راه رسیدن به master.cfg
6.2 کار با svn
6.3 نامه به شما: خبرنگاران مجاز به اعلام هستند

ما آن را انجام دادیم! تبریک می گویم

1. چرا BuildBot؟

قبلا در خبر به مقاله هایی در مورد پیاده سازی برخوردم ادغام مداوم با BuildBot. مثلاً این یکی من آن را آموزنده ترین یافتم. مثال دیگری وجود دارد - ساده تر. این مقالات می توانند چاشنی شوند مثال از دفترچه راهنماو این پس از آن به زبان انگلیسی کوپه نقطه شروع خوبی است. پس از خواندن این مقالات، احتمالاً بلافاصله چیزی در مورد آن می خواهید BuildBot انجام

متوقف کردن! آیا کسی واقعاً از آن در پروژه های خود استفاده کرده است؟ معلوم می شود بله زیاد آن را در وظایف خود به کار بردند. را می توان یافت نمونه ها استفاده BuildBot و در آرشیو کد گوگل.

پس منطق استفاده از مردم چیست Buildbot? پس از همه، ابزارهای دیگری نیز وجود دارد: کروز کنترل и جنکینز. اینجوری جواب میدم برای اکثر وظایف جنکینز و حقیقت کافی خواهد بود. در نوبتش، BuildBot - سازگارتر است، در حالی که مشکلات در آنجا به سادگی حل می شوند جنکینز. انتخاب باشماست. اما از آنجایی که ما به دنبال ابزاری برای یک پروژه هدف در حال توسعه هستیم، چرا ابزاری را انتخاب نکنیم که با شروع از مراحل ساده، امکان به دست آوردن یک سیستم ساخت با تعامل و یک رابط منحصر به فرد را فراهم کند.

برای کسانی که پروژه مورد نظرشان با پایتون نوشته شده است، این سوال پیش می آید: "چرا یک سیستم یکپارچه سازی را انتخاب نکنیم که از نظر زبان مورد استفاده در پروژه رابط کاربری واضحی داشته باشد؟" و اکنون زمان ارائه مزایای آن است BuildBot.

بنابراین، "کوارتت ابزاری" ما. برای خودم چهار ویژگی را مشخص کرده ام BuildBot:

  1. این یک چارچوب متن باز تحت مجوز GPL است
  2. این استفاده از پایتون به عنوان ابزار پیکربندی و شرح اقدامات مورد نیاز است
  3. این فرصتی برای دریافت پاسخ از دستگاهی است که مونتاژ در آن انجام می شود
  4. اینها در نهایت حداقل الزامات یک هاست هستند. استقرار به پایتون و پیچ خورده نیاز دارد و نیازی به ماشین مجازی و ماشین جاوا ندارد.

2. مفهومی که توسط BuildMaster رهبری می شود

نمونه ای از پیاده سازی Continuous Integration با BuildBot

مرکز معماری توزیع وظیفه است بیلد مستر. خدمتی است که:

  • پیگیری می کند تغییرات در درخت منبع پروژه
  • می فرستد دستوراتی که باید توسط سرویس Worker برای ساخت پروژه و آزمایش آن اجرا شود
  • اطلاع می دهد کاربران در مورد نتایج اقدامات انجام شده

بیلد مستر از طریق فایل پیکربندی شده است master.cfg. این فایل در روت است بیلد مستر. بعداً نحوه ایجاد این ریشه را نشان خواهم داد. خود فایل master.cfg حاوی یک اسکریپت پایتون است که از تماس ها استفاده می کند BuildBot.

مهمترین شی بعدی BuildBot این یک نام کارگر. این سرویس را می توان روی هاست دیگری با سیستم عامل متفاوت یا شاید در جایی راه اندازی کرد بیلد مستر. همچنین می تواند در یک محیط مجازی آماده شده با بسته ها و متغیرهای خاص خود وجود داشته باشد. این محیط های مجازی را می توان با استفاده از ابزارهای پایتون مانند virtualenv، venv.

بیلد مستر دستورات را برای همه پخش می کند کارگر-y، و او نیز به نوبه خود آنها را برآورده می کند. یعنی معلوم می شود که روند ساخت و آزمایش یک پروژه می تواند ادامه یابد کارگر-e ویندوز را اجرا می کند و روی Worker دیگری که لینوکس را اجرا می کند.

تسویه حساب کدهای منبع پروژه در هر کدام وجود دارد کارگر-e.

3. نصب و راه اندازی

پس بزن بریم. من از اوبونتو 18.04 به عنوان میزبان استفاده خواهم کرد. من یکی را روی آن قرار می دهم بیلد مستر-a و one کارگر-آ. اما ابتدا باید python3.7 را نصب کنید:

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

برای کسانی که به جای 3.7.2 به python3.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

مرحله بعدی نصب است توییت کرد и BuildBotو همچنین بسته هایی که به شما امکان می دهد از عملکردهای اضافی استفاده کنید BuildBot-آ.


/*Все что под 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. مراحل اولیه

زمان ایجاد بیلد مستر. در پوشه ما خواهد بود /home/habr/master.

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

گام بعدی. بیایید ایجاد کنیم کارگر. در پوشه ما خواهد بود /خانه/هبر/کارگر.

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

وقتی می دوی کارگر، سپس به طور پیش فرض در ایجاد می شود /خانه/هبر/کارگر پوشه ای با نام پروژه که در آن مشخص شده است master.cfg. و در پوشه با نام پروژه یک دایرکتوری ایجاد می کند ساختن، و به انجام آن ادامه خواهد داد وارسی. دایرکتوری کار برای کارگر-و تبدیل به دایرکتوری می شود /home/habr/yourProject/build.

"کلید طلایی
و حالا چیزی که پاراگراف قبلی را برای آن نوشتم: فیلمنامه ای که استاد مطالبه خواهد کرد از کارگر-و از راه دور در این دایرکتوری انجام می شود، اجرا نمی شود زیرا اسکریپت مجوز اجرا را ندارد. برای اصلاح وضعیت، به یک کلید نیاز دارید --umask=0o22، که نوشتن در این فهرست را ممنوع می کند، اما حقوق راه اندازی را حفظ می کند. و این تمام چیزی است که ما نیاز داریم.

بیلد مستر и کارگر با یکدیگر ارتباط برقرار کنند. اتفاق می افتد که می شکند و کارگر منتظر مدتی برای پاسخ از بیلد مستر-آ. در صورت عدم پاسخگویی، اتصال مجدداً راه اندازی می شود. کلید --keepalive=60 فقط باید زمان پس از آن را نشان دهد اتصال راه اندازی مجدد

5. پیکربندی. دستور گام به گام

پیکربندی بیلد مستر در سمت دستگاهی که دستور را اجرا کردیم انجام می شود ایجاد-استاد. در مورد ما، این یک دایرکتوری است /home/habr/master. فایل پیکربندی master.cfg هنوز وجود ندارد، اما خود دستور قبلاً فایل را ایجاد کرده است master.cmg.sample. شما باید نام آن را تغییر دهید master.cfg.sample в master.cfg

mv master.cfg.sample master.cfg

بیایید این یکی را باز کنیم master.cfg. و بیایید ببینیم از چه چیزی تشکیل شده است. و بعد از آن، بیایید سعی کنیم فایل پیکربندی خود را بسازیم.

master.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 BuildmasterConfig

c = BuildmasterConfig = {} 

BuildmasterConfig - فرهنگ لغت اصلی فایل پیکربندی. باید در فایل تنظیمات موجود باشد. برای سهولت استفاده، یک نام مستعار در کد پیکربندی معرفی شده است "ج". نامگذاری کلیدها в c["keyFromDist"] عناصر ثابت برای تعامل با بیلد مستر. برای هر کلید، شی مربوطه به عنوان یک مقدار جایگزین می شود.

کارگران 5.2

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

این بار اشاره می کنیم بیلد مستر-y لیست از کارگر-s. خودم کارگر ما ایجاد کردیم بالاتر، نشان می دهد نام شما کارگر и کلمه عبور. اکنون آنها باید به جای آن مشخص شوند کارگر نمونه и عبور .

5.3 change_source

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

با کلید تغییر_منبع فرهنگ لغت c ما به لیستی دسترسی پیدا می کنیم که می خواهیم شی ای را قرار دهیم که مخزن را با کد منبع پروژه نظرسنجی می کند. مثال از یک مخزن Git استفاده می کند که در فواصل زمانی معینی نظرسنجی می شود.

اولین آرگومان مسیر مخزن شما است.

راهنمای کار نشان دهنده مسیر پوشه در کنار آن است کارگرنسبت به مسیر /home/habr/worker/yourProject/build git نسخه محلی مخزن را ذخیره می کند.

شاخه شامل یک شاخه خاص در مخزن است که باید دنبال شود.

فاصله نظرسنجی شامل تعداد ثانیه های بعد از آن است بیلد مستر از مخزن برای تغییرات نظرسنجی خواهد کرد.

چندین روش برای ردیابی تغییرات مخزن پروژه وجود دارد.

ساده ترین روش این است رای گیری، که دلالت بر آن دارد بیلد مستر به صورت دوره ای از سرور با مخزن نظرسنجی می کند. اگر مرتکب شدن منعکس کننده تغییرات در مخزن، سپس بیلد مستر با کمی تاخیر یک شی داخلی ایجاد می کند تغییر دادن و آن را برای مدیریت رویداد ارسال کنید زمان بند، که مراحل ساخت و آزمایش پروژه را آغاز می کند کارگر-e. از جمله این مراحل مشخص خواهد شد به روز رسانی مخزن دقیقا روی کارگراین یک کپی محلی از مخزن ایجاد می کند. جزئیات این فرآیند در زیر در دو بخش بعدی پوشش داده خواهد شد. (5.4 и 5.5).

یک روش حتی زیباتر برای ردیابی تغییرات در یک مخزن، ارسال مستقیم پیام از سرور میزبان آن به بیلد مستر- در مورد تغییر کدهای منبع پروژه. در این حالت، به محض اینکه توسعه دهنده می سازد مرتکب شدن، سرور دارای مخزن پروژه پیامی ارسال می کند بیلد مستر-y. و او نیز به نوبه خود با ایجاد یک شی آن را رهگیری می کند منبع PBCchange. بعد، این شی به منتقل می شود زمان بند، که مراحل ساخت پروژه و تست آن را فعال می کند. بخش مهمی از این روش کار با قلاباسکریپت های سرور در مخزن. در فیلمنامه قلاب-a، مسئول پردازش اقدامات زمانی که مرتکب شدن-e، باید با ابزار تماس بگیرید ارسال تغییر و آدرس شبکه را مشخص کنید بیلد مستر-آ. همچنین باید پورت شبکه ای را که گوش می دهد مشخص کنید منبع PBCchange. منبع PBCchangeبه هر حال، بخشی است بیلد مستر-آ. این روش نیاز به مجوز دارد مدیر سایت-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"]))

زمانبندها - این عنصری است که به عنوان یک ماشه عمل می کند که کل زنجیره مونتاژ و آزمایش پروژه را شروع می کند.
نمونه ای از پیاده سازی Continuous Integration با BuildBot

آن تغییراتی که ثبت شد تغییر_منبع، در روند کار متحول شد BuildBot-a اعتراض کردن تغییر دادن و اکنون هر شیدولر بر اساس آنها، درخواست هایی را برای شروع فرآیند ساخت پروژه ایجاد می کند. با این حال، همچنین تعیین می کند که این درخواست ها چه زمانی بیشتر به صف منتقل شوند. یک شی سازنده صفی از درخواست‌ها را ذخیره می‌کند و وضعیت اسمبلی فعلی را در یک جداگانه ردیابی می‌کند کارگرسازنده وجود دارد در بیلد مستر-e و در کارگر-e. او با بیلد مستر-a در کارگر-و قبلاً مشخص است ساختن - یک سری مراحل که باید طی شود.
ما می بینیم که در مثال فعلی چنین است زمانبندها 2 قطعه ایجاد می شود. علاوه بر این، هر کدام نوع خاص خود را دارند.

SingleBranchScheduler - یکی از محبوب ترین کلاس ها در برنامه. یک شاخه را تماشا می کند و با تغییر ثبت شده در آن تحریک می شود. وقتی تغییراتی را می بیند، می تواند ارسال درخواست ساخت را به تاخیر بیاندازد (مدت مشخص شده در پارامتر ویژه را به تعویق بیندازید. treeStableTimer) که در نام نام برنامه زمانی را که در آن نمایش داده می شود را تنظیم می کند BuildBot-رابط وب که در تغییر فیلتر یک فیلتر تنظیم می شود که پس از عبور از آن، تغییرات در شعبه برنامه را برای ارسال درخواست ساخت و ساز تحریک می کند. که در buildernames نام مشخص شده است سازنده-a که کمی بعد تنظیم می کنیم. نام در مورد ما مانند نام پروژه خواهد بود: پروژه شما.

ForceScheduler یک چیز بسیار ساده این نوع برنامه زمانی با کلیک ماوس شروع می شود BuildBot-رابط وب پارامترها ماهیت مشابهی دارند 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 BuildFactory


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": "."}))

periodicBuildTimer زمان این تناوب را بر حسب ثانیه مشخص می کند.

BuildFactory خاص ایجاد می کند ساختن، که سپس سازنده می فرستد به کارگراست. به BuildFactory مراحلی که باید طی شود را نشان می دهد کارگر-y. مراحل با فراخوانی متد اضافه می شوند addStep

اولین مرحله اضافه شده در این مثال است git clean -d -f -f –x، پس از آن گیت تسویه حساب. این اقدامات در پارامتر گنجانده شده است روش، که به وضوح بیان نشده است اما به معنای یک مقدار پیش فرض است تازه. پارامتر حالت = 'افزایشی' نشان می دهد که فایل ها از دایرکتوری هستند که در آن پول فروش، در حالی که در مخزن وجود ندارد، دست نخورده باقی می ماند.

دومین مرحله اضافه شده فراخوانی اسکریپت است محاکمه با پارامتر سلام در کنار کارگر-a از دایرکتوری /home/habr/worker/yourProject/build با متغیر محیطی PATHONPATH=... بنابراین می توانید اسکریپت های خود را بنویسید و در کنار آن اجرا کنید. کارگرهر قدم util.ShellCommand. این اسکریپت ها را می توان مستقیماً در مخزن قرار داد. سپس در پول فروش-e آنها سقوط خواهند کرد /home/habr/worker/yourProject/build. با این حال، دو "اما" وجود دارد:

  1. کارگر باید با یک کلید ایجاد شود --umask به طوری که بعد از آن حقوق اجرا را مسدود نکند وارسی-آ.
  2. در فشار دادن-e از این اسکریپت ها باید ویژگی را مشخص کنید قابل اجرابه طوری که بعدا پول فروش-e حق اجرای اسکریپت Git را از دست نداد.

5.6 سازنده


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

در مورد آنچه هست سازنده گفته شد اینجا. اکنون در مورد نحوه ایجاد آن با جزئیات بیشتری به شما خواهم گفت. BuilderConfig سازنده است سازنده. چنین طراحانی در c['builders'] می توانید چندین مورد را مشخص کنید، زیرا این یک صفحه از اشیاء است سازنده نوع حالا بیایید مثال را از نو بنویسیم BuildBot، آن را به وظیفه ما نزدیکتر می کند.


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

اکنون در مورد پارامترها به شما می گویم BuilderConfig.

نام نام را مشخص می کند سازنده-آ. در اینجا نام آن را گذاشتیم پروژه شما... این بدان معنی است که در کارگر- همین مسیر ایجاد خواهد شد /home/habr/worker/yourProject/build. شیدولر به دنبال سازنده فقط با این نام

نام های کارگر حاوی ورق کارگر-s. که باید به هر کدام اضافه شود ج['کارگران'].

کارخانه - خاص ساختن، که با آن مرتبط است سازنده. او شی را ارسال خواهد کرد ساختن بر کارگر برای تکمیل تمام مراحل موجود در این ساختن-آ.

6. نمونه ای از پیکربندی خودتان

در اینجا نمونه معماری پروژه است که پیشنهاد می کنم از طریق آن پیاده سازی شود BuildBot
.

ما به عنوان یک سیستم کنترل نسخه استفاده خواهیم کرد svn. خود مخزن در نوعی ابر قرار خواهد گرفت. اینم آدرس این ابر svn.host/svn/yourProject/trunk. در ابر زیر svn یک نام کاربری حساب وجود دارد: کاربر، passwd: کلمه عبور. اسکریپت هایی که مراحل را نشان می دهند ساختن-a نیز در شعبه خواهد بود svn، در یک پوشه جداگانه buildbot/worker_linux. این اسکریپت ها در مخزن با ویژگی ذخیره شده قرار دارند قابل اجرا.

بیلد مستر и کارگر روی همان هاست اجرا شود پروژه. میزبان .بیلد مستر فایل های خود را در یک پوشه ذخیره می کند /home/habr/master. کارگر در مسیر زیر ذخیره می شود /خانه/هبر/کارگر. ارتباطات فرآیندی بیلد مستر-a و کارگر-a طبق پروتکل از طریق پورت 4000 انجام می شود BuildBot-a، یعنی 'pb' پروتکل

پروژه هدف به طور کامل در پایتون نوشته شده است. وظیفه ردیابی تغییرات آن، ایجاد یک فایل اجرایی، تولید اسناد و انجام آزمایش است. در صورت عدم موفقیت، همه توسعه دهندگان باید پیامی مبنی بر ناموفق بودن یک اقدام از طریق ایمیل ارسال کنند.

نمایش وب BuildBot ما به پورت 80 وصل خواهیم شد پروژه. میزبان. نیازی به نصب آپاچ نیست. به عنوان بخشی از کتابخانه پیچیده در حال حاضر یک وب سرور وجود دارد، BuildBot از آن استفاده می کند.

برای ذخیره اطلاعات داخلی برای BuildBot کامل شود sqlite.

یک میزبان برای ارسال پستی مورد نیاز است smtp.your.domain - امکان ارسال نامه از پست را فراهم می کند [ایمیل محافظت شده] بدون احراز هویت همچنین در میزبان 'SMTP صورتجلسه در پست 1025 شنیده می شود.

دو نفر در این فرآیند دخیل هستند: مدیر سایت и کاربر. ادمین مدیریت می کند BuildBot. کاربر شخصی است که متعهد می شود مرتکب شدن-s.

فایل اجرایی از طریق pyinstaller. مستندات از طریق ایجاد می شود داکسیژن.

برای این معماری این را نوشتم: master.cfg:

master.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"
}

اول شما نیاز دارید ایجاد کنید بیلد مستر-a و کارگر-آ. سپس این فایل را Paste کنید master.cfg в /home/habr/master.

مرحله بعدی شروع سرویس است بیلد مستر-a


sudo buildbot start /home/habr/master

سپس سرویس را شروع کنید کارگر-a


buildbot-worker start /home/habr/worker

آماده! اکنون Buildbot تغییرات را ردیابی و راه اندازی می کند مرتکب شدن-y در svn، انجام مراحل ساخت و تست پروژه با معماری فوق.

در زیر برخی از ویژگی های فوق را شرح خواهم داد master.cfg.

6.1 در راه رسیدن به master.cfg


در حین نوشتن من master.cfg خطاهای زیادی ایجاد خواهد شد، بنابراین خواندن فایل گزارش مورد نیاز است. به عنوان ذخیره می شود بیلد مستر-ec مسیر مطلق /home/habr/master/twistd.log، و در کنار کارگر-a با مسیر مطلق /home/habr/worker/twistd.log. با خواندن خطا و رفع آن، باید سرویس را مجددا راه اندازی کنید بیلد مستر-آ. در اینجا نحوه انجام آن آمده است:


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 قوانین را تعیین می کند: چگونه ساختار پوشه را تجزیه کنیم svn روی شاخه ها او همچنین مسیرهای نسبی را به آنها پیشنهاد می کند. در نوبتش split_file_alwaystrunk با گفتن اینکه مخزن فقط شامل است، فرآیند را ساده می کند تنه.

В زمانبندها نشان داد تغییر فیلترکه می بیند هیچ و شاخه ای را با آن مرتبط می کند تنه با توجه به یک انجمن داده شده از طریق split_file_alwaystrunk. پاسخ به تغییرات در تنه، راه اندازی می کند سازنده با نام پروژه شما.

املاک در اینجا لازم است تا مدیر لیست های پستی نتایج ساخت و آزمایش را به عنوان مالک فرآیند دریافت کند.

گام ساختن-a وارسی قادر به حذف کامل فایل های موجود در نسخه محلی مخزن است کارگر-آ. و سپس کامل را انجام دهید به روز رسانی svn. حالت از طریق پارامتر پیکربندی می شود حالت=پر, روش = تازه. پارامتر haltOnTailure می گوید که اگر به روز رسانی 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 برای ایجاد نشانه گذاری استفاده می شود. توسط موتور اصلاح شده است jinja2 (قابل مقایسه با جنگو). BuildBot دارای مجموعه ای از متغیرها است که مقادیر آنها در طول فرآیند تولید متن پیام در قالب جایگزین می شود. این متغیرها در {{ پرانتز دوتایی }} قرار می‌گیرند. مثلا، خلاصه وضعیت عملیات تکمیل شده، یعنی موفقیت یا شکست را نشان می دهد. آ پروژه ها خروجی خواهد شد پروژه شما. بنابراین، با استفاده از دستورات کنترل در jinja2، متغیرها BuildBot-a و ابزارهای قالب بندی رشته پایتون، می توانید یک پیام کاملاً آموزنده ایجاد کنید.

MailNotifier شامل استدلال های زیر است.

fromaddr – آدرسی که همه خبرنامه را از آن دریافت خواهند کرد.

sendTo InterestedUsers=True یک پیام به مالک و کاربری که ساخته است ارسال می کند مرتکب شدن.

مراجعه - پسوندی که باید به نام کاربران دریافت کننده خبرنامه اضافه شود. بنابراین مدیر سایت چگونه کاربر خبرنامه را در آدرس دریافت می کند [ایمیل محافظت شده].

relayhost نام میزبانی که سرور روی آن باز می شود را مشخص می کند SMTP، یک smptPort شماره پورتی که گوش می دهد را مشخص می کند SMTP سرور

حالت = "هشدار" می گوید که ارسال پستی تنها در صورتی باید انجام شود که حداقل یک مرحله وجود داشته باشد ساختن-a، که با شکست وضعیت یا هشدار به پایان رسید. در صورت موفقیت، نیازی به ارسال خبرنامه نیست.

دریافت کنندگان اضافی شامل فهرستی از افرادی است که علاوه بر مالک و شخصی که این نامه را انجام داده است، باید برای آنها ارسال شود. مرتکب شدن.

messageFormatter یک شی است که قالب پیام، الگوی آن و مجموعه ای از متغیرهای موجود را مشخص می کند jinja2. گزینه هایی مانند wantProperties=درست است и wantSteps=درست است این مجموعه از متغیرهای موجود را تعریف کنید.

with['services']=[sendMessageToAll] لیستی از خدمات را ارائه می دهد که در میان آنها خدمات ما وجود خواهد داشت خبرنگار.

ما آن را انجام دادیم! تبریک می گویم

ما پیکربندی خودمان را ایجاد کردیم و عملکردی را دیدیم که قادر به انجام آن است. BuildBot. من فکر می کنم این برای درک اینکه آیا این ابزار برای ایجاد پروژه شما مورد نیاز است یا خیر کافی است. آیا به او علاقه دارید؟ آیا برای شما مفید خواهد بود؟ آیا کار کردن با او راحت است؟ پس من این مقاله را بیهوده نمی نویسم.

و بیشتر. من دوست دارم جامعه حرفه ای استفاده کنند BuildBot، گسترده تر شد، کتابچه های راهنما ترجمه شدند و حتی نمونه های بیشتری وجود داشت.

از توجه همه شما متشکرم. موفق باشید.

منبع: www.habr.com

اضافه کردن نظر