BuildBot-ի հետ շարունակական ինտեգրման օրինակ

BuildBot-ի հետ շարունակական ինտեգրման օրինակ
(Պատկերը՝ ըստ Համակարգիչ - ից Pixabay)

Hi!

Իմ անունը Եվգենի ՉերկինԵս ծրագրավորող եմ հանքարդյունաբերական ընկերությունում մշակող թիմում Պոլիմետալ.

Երբ սկսում ես որևէ մեծ նախագիծ, սկսում ես մտածել. «Ի՞նչ ծրագիր է լավագույնս օգտագործել այն պահպանելու համար»: ՏՏ նախագիծն անցնում է մի շարք փուլերով, մինչև հաջորդ տարբերակը թողարկվի: Լավ է, երբ այս փուլերի շղթան ավտոմատացված է։ Ինքնին ՏՏ նախագծի նոր տարբերակի թողարկման ավտոմատացված գործընթացը կոչվում է Շարունակական ինտեգրում. 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 Ձեր վարպետի ճանապարհին.cfg
6.2 Աշխատեք svn-ի հետ
6.3 Նամակ ձեզ. լրագրողներն իրավասու են հայտարարելու

Մենք արեցինք դա! Շնորհավորում եմ

1. Ինչու՞ BuildBot:

Նախկինում habr-e-ում հանդիպել եմ հոդվածների իրականացման մասին Շարունակական ինտեգրում օգտագործելով BuildBot. Օրինակ այս մեկը Ես գտա այն ամենատեղեկատվականը: Կա ևս մեկ օրինակ. ավելի պարզ. Այս հոդվածները կարելի է համեմել օրինակ ձեռնարկիցԻսկ это դրանից հետո՝ անգլերեն։ Կուպեն լավ մեկնարկային կետ է: Այս հոդվածները կարդալուց հետո, հավանաբար, անմիջապես ինչ-որ բան կցանկանաք BuildBot անել.

Կանգ առեք Ինչ-որ մեկը իրականում օգտագործել է այն իր նախագծերում: Պարզվում է՝ այո շատերը կիրառեցին այն իրենց առաջադրանքներում: Հնարավոր է գտնել օրինակներ օգտագործում BuildBot և Google-ի կոդերի արխիվներում։

Ուրեմն ո՞րն է մարդկանց օգտագործման տրամաբանությունը Buildbot? Ի վերջո, կան նաև այլ գործիքներ. CruiseControl и Jenkins. Ես կպատասխանեմ այսպես. Առաջադրանքների մեծ մասի համար Jenkins և ճշմարտությունը բավական կլինի: Իր հերթին, BuildBot - ավելի հարմարվողական, մինչդեռ այնտեղ խնդիրները լուծվում են նույնքան պարզ, որքան ներսում Jenkins. Ընտրությունը քոնն է։ Բայց քանի որ մենք փնտրում ենք գործիք զարգացող թիրախային նախագծի համար, ինչու չընտրել մեկը, որը թույլ կտա, սկսած պարզ քայլերից, ձեռք բերել ինտերակտիվություն և յուրահատուկ ինտերֆեյս ունեցող կառուցման համակարգ:

Նրանց համար, ում թիրախային նախագիծը գրված է python-ով, հարց է առաջանում. «Ինչո՞ւ չընտրել ինտեգրացիոն համակարգ, որն ունի հստակ ինտերֆեյս՝ նախագծում օգտագործվող լեզվի առումով»: Եվ հիմա ժամանակն է ներկայացնելու առավելությունները BuildBot.

Այսպիսով, մեր «գործիքային քառյակը». Ինձ համար ես առանձնացրել եմ չորս առանձնահատկություն BuildBot:

  1. Այն բաց կոդով շրջանակ է GPL լիցենզիայի ներքո
  2. Սա python-ի օգտագործումն է որպես կոնֆիգուրացիայի գործիք և պահանջվող գործողությունների նկարագրություն
  3. Սա հնարավորություն է պատասխան ստանալու մեքենայից, որի վրա տեղի է ունենում հավաքը
  4. Սրանք, վերջապես, նվազագույն պահանջներն են հյուրընկալողի համար: Տեղակայումը պահանջում է python և twisted, և չի պահանջում վիրտուալ մեքենա և java մեքենա:

2. Հայեցակարգ, որը ղեկավարում է BuildMaster-ը

BuildBot-ի հետ շարունակական ինտեգրման օրինակ

Առաջադրանքի բաշխման ճարտարապետության կենտրոնական տեղն է BuildMaster. Դա ծառայություն է, որը.

  • հետևում է փոփոխություններ նախագծի աղբյուրի ծառի մեջ
  • ուղարկում է հրամաններ, որոնք պետք է կատարվեն Worker ծառայության կողմից՝ նախագիծը կառուցելու և այն փորձարկելու համար
  • տեղեկացնում է օգտագործողները ձեռնարկված գործողությունների արդյունքների մասին

BuildMaster կազմաձևված ֆայլի միջոցով master.cfg. Այս ֆայլը գտնվում է արմատում BuildMaster. Ավելի ուշ ես ցույց կտամ, թե ինչպես է ստեղծվում այս արմատը: Ֆայլն ինքնին master.cfg պարունակում է python սցենար, որն օգտագործում է զանգեր BuildBot.

Հաջորդ ամենակարևոր օբյեկտը BuildBot Այն ունի մի անուն Բանվոր. Այս ծառայությունը կարող է գործարկվել այլ OS-ով մեկ այլ հոսթի վրա, կամ գուցե այն, որտեղ BuildMaster. Այն կարող է գոյություն ունենալ նաև հատուկ պատրաստված վիրտուալ միջավայրում՝ իր փաթեթներով և փոփոխականներով: Այս վիրտուալ միջավայրերը կարող են պատրաստվել՝ օգտագործելով python կոմունալ ծառայություններ, ինչպիսիք են virtualenv, venv.

BuildMaster հրամաններ է հաղորդում բոլորին Բանվոր-y, իսկ նա էլ իր հերթին կատարում է դրանք։ Այսինքն՝ ստացվում է, որ նախագծի կառուցման և փորձարկման գործընթացը կարող է շարունակվել Բանվոր-e աշխատում է Windows-ով և մեկ այլ Worker-ով, որն աշխատում է Linux-ով:

Ստուգում Ծրագրի կոդերը հայտնվում են յուրաքանչյուրի վրա Բանվոր-ե.

3. Տեղադրում

Այսպիսով, եկեք գնանք: Ես կօգտագործեմ Ubuntu 18.04-ը որպես հյուրընկալող: Ես դրա վրա կդնեմ մեկը BuildMaster-ա և մեկ Բանվոր-ա. Բայց նախ պետք է տեղադրել 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. Առաջին քայլերը

Ստեղծելու ժամանակը BuildMaster. Այն կլինի մեր թղթապանակում /տուն/հաբր/վարպետ.

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

Հաջորդ քայլը. Եկեք ստեղծենք Բանվոր. Այն կլինի մեր թղթապանակում /տուն/հաբր/աշխատող.

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

Երբ վազում ես Բանվոր, ապա լռելյայն այն կստեղծվի in /տուն/հաբր/աշխատող թղթապանակ՝ նախագծի անվանումով, որը նշված է master.cfg. Իսկ նախագծի անվանումով թղթապանակում այն ​​կստեղծի գրացուցակ կառուցել, և կշարունակի դա անել Checkout. Աշխատանքային գրացուցակ համար Բանվոր-և այն կդառնա գրացուցակ /home/habr/yourProject/build.

«Ոսկե բանալի
Իսկ հիմա ինչի համար գրել էի նախորդ պարբերությունը՝ սցենար, որը վարպետ -ից կպահանջի Բանվոր-և այս գրացուցակում հեռակա կարգով արվածը չի կատարվի, քանի որ սկրիպտը գործարկելու թույլտվություն չունի: Իրավիճակը շտկելու համար ձեզ հարկավոր կլինի բանալի --umask=0o22, որն արգելում է գրել այս գրացուցակում, բայց կպահպանի գործարկման իրավունքները: Եվ դա այն ամենն է, ինչ մեզ պետք է:

BuildMaster и Բանվոր կապ հաստատել միմյանց հետ. Պատահում է, որ այն կոտրվում է և Բանվոր որոշ ժամանակ սպասել պատասխանի BuildMaster-Ա. Եթե ​​պատասխան չկա, կապը վերսկսվում է: Բանալի --keepalive=60 պարզապես անհրաժեշտ էր նշել այն ժամանակը, որից հետո միացնել վերագործարկվում է:

5. Կոնֆիգուրացիա. Քայլ առ քայլ բաղադրատոմս

Տեսիլ BuildMaster իրականացվում է մեքենայի այն կողմում, որտեղ մենք կատարել ենք հրամանը ստեղծել-վարպետ. Մեր դեպքում սա գրացուցակ է /տուն/հաբր/վարպետ. Կազմաձևման ֆայլ 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"] հետ փոխգործակցության ֆիքսված տարրեր են BuildMaster. Յուրաքանչյուր բանալիի համար համապատասխան օբյեկտը փոխարինվում է որպես արժեք:

5.2 աշխատողները

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

Այս անգամ նշում ենք BuildMaster-y ցուցակը Բանվոր-ս. ինքս ինձ Բանվոր մենք ստեղծել ենք վեր, նշելով դու-աշխատող-անուն и Գաղտնաբառ. Այժմ դրանց փոխարեն պետք է հստակեցնել օրինակ-աշխատող и անցնել .

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))                

Բանալով change_source c բառարան, մենք մուտք ենք ստանում այն ​​ցուցակը, որտեղ մենք ցանկանում ենք տեղադրել օբյեկտ, որը հարցումներ է կատարում պահեստում նախագծի սկզբնական կոդով: Օրինակը օգտագործում է Git պահոց, որը հարցում է անցկացվում որոշակի ընդմիջումներով:

Առաջին փաստարկը ձեր պահոց տանող ճանապարհն է:

աշխատանքային դիրեկտորիա ներկայացնում է ուղին դեպի թղթապանակ, որտեղ գտնվում է կողմում Բանվոր- ուղու հարաբերականը /home/habr/worker/yourProject/build git-ը կպահի պահեստի տեղական տարբերակը:

մասնաճյուղ պարունակում է հատուկ ճյուղ պահեստում, որին պետք է հետևել:

հարցման ինտերվալ պարունակում է վայրկյանների քանակը, որից հետո BuildMaster փոփոխությունների համար կպահանջի պահեստում:

Կան մի քանի եղանակներ՝ հետևելու նախագծի պահեստի փոփոխություններին:

Ամենապարզ մեթոդն է քվեարկություն, ինչը ենթադրում է, որ BuildMaster պարբերաբար հարցումներ է կատարում պահոցով սերվերի վրա: Եթե պարտավորություն արտացոլեց շտեմարանի փոփոխությունները, ապա BuildMaster որոշ ուշացումով կստեղծի ներքին օբյեկտ Փոփոխություն և ուղարկեք այն իրադարձությունների մշակողին Scheduler, որը կմեկնարկի նախագիծը կառուցելու և փորձարկելու քայլերը Բանվոր-ե. Այս քայլերի թվում կնշվեն թարմացնել պահոց. Հենց վրա ԲանվորՍա կստեղծի պահեստի տեղական պատճենը: Այս գործընթացի մանրամասները կներկայացվեն ստորև հաջորդ երկու բաժիններում: (5.4 и 5.5).

Պահեստի փոփոխություններին հետևելու էլ ավելի նրբագեղ մեթոդը հաղորդագրություններ ուղարկելն է անմիջապես այն հոսթինգի սերվերից: BuildMaster- նախագծի սկզբնական ծածկագրերը փոխելու մասին: Այս դեպքում, հենց որ մշակողը պատրաստի պարտավորություն, ծրագրի պահոցով սերվերը հաղորդագրություն կուղարկի BuildMaster-y. Եվ նա, իր հերթին, կխոչընդոտի այն՝ ստեղծելով օբյեկտ PBCchangeSource. Հաջորդը, այս օբյեկտը կտեղափոխվի Scheduler, որն ակտիվացնում է նախագիծը կառուցելու և այն փորձարկելու քայլերը։ Այս մեթոդի կարևոր մասը աշխատանքն է մանգաղ- սերվերի սկրիպտները պահեստում: Սցենարի մեջ մանգաղ-ա, պատասխանատու է մշակման գործողությունների համար, երբ պարտավորություն-e, դուք պետք է զանգահարեք կոմունալ ուղարկել փոփոխություն և նշեք ցանցի հասցեն BuildMaster-Ա. Դուք նաև պետք է նշեք ցանցի պորտը, որը կլսի PBCchangeSource. PBCchangeSource, ի դեպ, մաս է BuildMaster-Ա. Այս մեթոդը թույլտվություն կպահանջի admin մասին-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-ի հետ շարունակական ինտեգրման օրինակ

Այդ փոփոխությունները, որոնք արձանագրվել են change_source, վերափոխվել է աշխատանքի ընթացքում BuildBot-a առարկել Փոփոխություն իսկ այժմ ամեն Շեդուլեր դրանց հիման վրա այն ստեղծում է հարցումներ՝ սկսելու նախագծի կառուցման գործընթացը: Այնուամենայնիվ, այն նաև որոշում է, թե երբ են այդ հարցումները փոխանցվում հետագա հերթին: Օբյեկտ Շինարար պահում է հարցումների հերթ և հետևում ընթացիկ հավաքի վիճակին առանձին մեկում Բանվոր-ե. Շինարար գոյություն ունի BuildMaster-ե և շարունակ Բանվոր-ե. Նա ուղարկում է հետ BuildMaster-a on Բանվոր-և արդեն կոնկրետ կառուցել - մի շարք քայլեր, որոնք պետք է կատարվեն:
Մենք տեսնում ենք, որ ներկա օրինակում նման ժամանակացույցներ Ստեղծվում է 2 հատ։ Ընդ որում, յուրաքանչյուրն ունի իր տեսակը։

SingleBranchScheduler – ժամանակացույցի ամենահայտնի դասերից մեկը: Այն դիտում է մեկ ճյուղ և առաջանում է դրա գրանցված փոփոխությամբ: Երբ նա փոփոխություններ է տեսնում, նա կարող է հետաձգել շինարարության հարցումն ուղարկելը (հետաձգել հատուկ պարամետրում նշված ժամանակահատվածի համար treeStableTimer) Ներ անուն սահմանում է ժամանակացույցի անվանումը, որը կցուցադրվի BuildBot- վեբ ինտերֆեյս: IN Փոխել ֆիլտրը սահմանվում է զտիչ, որն անցնելուց հետո մասնաճյուղի փոփոխությունները հուշում են ժամանակացույցին շինարարության հարցում ուղարկելու համար: IN շինարարների անունները անունը նշված է շինարարը-ա, որը կսահմանենք մի փոքր ուշ։ Անունը մեր դեպքում կլինի նույնը, ինչ նախագծի անվանումը. ձեր Նախագիծը.

ForceScheduler շատ պարզ բան. Այս տեսակի ժամանակացույցը գործարկվում է մկնիկի սեղմումով BuildBot- վեբ ինտերֆեյս: Պարամետրերն ունեն նույն էությունը, ինչ որ SingleBranchScheduler.

ՀԳ թիվ 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. Քայլերն ավելացվում են մեթոդը կանչելով ավելացնել Քայլ

Այս օրինակում առաջին ավելացված քայլն է git մաքուր -d -f -f –x, ապա git վճարում. Այս գործողությունները ներառված են պարամետրում մեթոդ, որը հստակ նշված չէ, բայց ենթադրում է լռելյայն արժեք թարմ. Պարամետր ռեժիմ='incremental' ցույց է տալիս, որ ֆայլերը այն գրացուցակից են, որտեղ chechout, չնայած բացակայում է պահեստից, մնում է անձեռնմխելի:

Երկրորդ ավելացված քայլը սցենարը կանչելն է փորձնական պարամետրով Բարեւ Ձեզ կողքի վրա Բանվոր-a գրացուցակից /home/habr/worker/yourProject/build միջավայրի փոփոխականով PATHONPATH=... Այսպիսով, դուք կարող եք գրել ձեր սեփական սցենարները և կատարել դրանք կողքի վրա Բանվոր- յուրաքանչյուր քայլ util.ShellCommand. Այս սցենարները կարող են ուղղակիորեն տեղադրվել պահեստում: Այնուհետև ժամը chechout-ե նրանք կընկնեն /home/habr/worker/yourProject/build. Այնուամենայնիվ, կա երկու «բայց».

  1. Բանվոր պետք է ստեղծվի բանալիով --umask որպեսզի այն չարգելափակի կատարման իրավունքները հետո Checkout- Այն.
  2. Ի գնալ մղել-e այս սցենարներից դուք պետք է նշեք սեփականությունը դատարկելիայնպես որ հետո chechout-e-ն չի կորցրել Git սկրիպտը գործարկելու իրավունքը։

5.6 շինարար


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

Այն մասին, թե ինչ է դա Շինարար ասվեց այստեղ. Այժմ ես ձեզ ավելի մանրամասն կպատմեմ, թե ինչպես ստեղծել այն: BuilderConfig կոնստրուկտոր է շինարարը. Նման դիզայներները ներս գ['շինարարներ'] դուք կարող եք նշել մի քանիսը, քանի որ սա օբյեկտների թերթիկ է շինարարը տիպ. Հիմա եկեք վերաշարադրենք օրինակը BuildBot, այն ավելի մոտեցնելով մեր առաջադրանքին։


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

Հիմա ես ձեզ կասեմ պարամետրերի մասին BuilderConfig.

անուն նշում է անունը շինարարը-ա. Այստեղ մենք այն անվանեցինք ձեր Նախագիծը. Սա նշանակում է, որ վրա Բանվոր- Հենց այս ճանապարհը կստեղծվի /home/habr/worker/yourProject/build. Շեդուլեր Փնտրել շինարարը հենց այս անունով:

աշխատողների անունները պարունակում է թերթիկ Բանվոր-ս. Դրանցից յուրաքանչյուրը պետք է ավելացվի գ['աշխատողներ'].

գործարան - կոնկրետ կառուցել, որի հետ կապված է շինարարը. Նա կուղարկի առարկան կառուցել մասին Բանվոր սրանում ներառված բոլոր քայլերն ավարտելու համար կառուցել- Այն.

6. Ձեր սեփական կոնֆիգուրացիայի օրինակ

Ահա նախագծի ճարտարապետության օրինակը, որի միջոցով ես առաջարկում եմ իրականացնել BuildBot
.

Մենք կօգտագործենք որպես տարբերակի կառավարման համակարգ svn. Պահեստն ինքը կգտնվի ինչ-որ ամպի մեջ: Ահա այս ամպի հասցեն svn.host/svn/yourProject/trunk. Ամպի տակ svn կա հաշվի օգտանուն. Տեղ, passwd: Գաղտնաբառ. Սցենարներ, որոնք ներկայացնում են քայլեր կառուցել-ա նույնպես կլինի մասնաճյուղում svn, առանձին թղթապանակում buildbot/worker_linux. Այս սկրիպտները գտնվում են պահոցում՝ պահպանված հատկությամբ գործարկելի.

BuildMaster и Բանվոր վազել նույն հյուրընկալողի վրա նախագիծ.հյուրընկալող .BuildMaster պահում է իր ֆայլերը թղթապանակում /տուն/հաբր/վարպետ. Բանվոր այն պահվում է հետևյալ ճանապարհով /տուն/հաբր/աշխատող. Գործընթացի հաղորդակցություն BuildMaster-ա և Բանվոր-ա-ն իրականացվում է 4000 պորտի միջոցով՝ ըստ արձանագրության BuildBot-ա, այսինքն «pb» արձանագրություն։

Թիրախային նախագիծն ամբողջությամբ գրված է Python-ով: Խնդիրն է հետևել դրա փոփոխություններին, ստեղծել գործարկվող ֆայլ, ստեղծել փաստաթղթեր և անցկացնել թեստավորում: Անհաջողության դեպքում բոլոր մշակողները պետք է էլփոստով հաղորդագրություն ուղարկեն, որ անհաջող գործողություն կա։

Վեբ ցուցադրում BuildBot մենք միանալու ենք 80 պորտին նախագիծ.հյուրընկալող. Անհրաժեշտ չէ տեղադրել Apatch-ը: Որպես գրադարանի մաս ՈՒրիշ արդեն կա վեբ սերվեր, BuildBot օգտագործում է այն.

Ներքին տեղեկատվությունը պահելու համար BuildBot մենք կօգտագործենք sqlite.

Փոստի ուղարկման համար պահանջվում է հոսթ smtp.your.domain - այն թույլ է տալիս նամակներ ուղարկել փոստից [էլեկտրոնային փոստով պաշտպանված] առանց նույնականացման: Նաև հաղորդավարի վրա'SMTP Արձանագրությունը լսվում է 1025 հասցեում։

Գործընթացում ներգրավված է երկու մարդ. admin մասին и Տեղ. ադմինը կառավարում է BuildBot. օգտագործողը պարտավորություն կատարողն է պարտավորություն-ս.

Գործարկվող ֆայլը ստեղծվում է միջոցով 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"
}

Նախ պետք է ստեղծել BuildMaster-ա և Բանվոր-ա. Այնուհետև տեղադրեք այս ֆայլը master.cfg в /տուն/հաբր/վարպետ.

Հաջորդ քայլը ծառայության մեկնարկն է BuildMasteraa


sudo buildbot start /home/habr/master

Այնուհետև սկսեք ծառայությունը Բանվոր-a


buildbot-worker start /home/habr/worker

Պատրաստ. Հիմա Buildbot կհետևի փոփոխություններին և կգործարկվի պարտավորություն-y մեջ svn, կատարելով վերը նշված ճարտարապետությամբ նախագիծ կառուցելու և փորձարկելու քայլերը։

Ստորև ես նկարագրելու եմ վերը նշվածի որոշ առանձնահատկություններ master.cfg.

6.1 Ձեր վարպետի ճանապարհին.cfg


Գրելու ընթացքում իմ master.cfg Կկատարվեն բազմաթիվ սխալներ, ուստի կպահանջվի մատյան ֆայլի ընթերցում: Այն պահվում է որպես BuildMaster-ec բացարձակ ճանապարհ /home/habr/master/twistd.log, և կողքից Բանվոր-a բացարձակ ճանապարհով /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 սահմանում է կանոնները՝ ինչպես կոտրել թղթապանակի կառուցվածքը svn ճյուղերի վրա։ Նա նաեւ նրանց հարաբերական ուղիներ է առաջարկում։ Իր հերթին split_file_alwaystrunk պարզեցնում է գործընթացը՝ ասելով, որ պահոցը պարունակում է միայն բեռնախցիկ.

В Ժամանակացույցներ նշված է Փոխել ֆիլտրըով տեսնում է Ոչ մեկը և դրա հետ կապում է մասնաճյուղը բեռնախցիկ ըստ տվյալ ասոցիացիայի միջոցով split_file_alwaystrunk. Արձագանքելով փոփոխություններին բեռնախցիկ, Գործարկում է շինարարը անունով ձեր Նախագիծը.

հատկությունները այստեղ դա անհրաժեշտ է, որպեսզի ադմինը ստանա շինարարության և թեստավորման արդյունքների փոստային ցուցակները՝ որպես գործընթացի սեփականատեր:

Քայլ կառուցել-a Checkout կարող է ամբողջությամբ ջնջել ցանկացած ֆայլ, որը գտնվում է պահեստի տեղական տարբերակում Բանվոր-Ա. Եվ հետո կատարեք ամբողջը 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 օգտագործում է էլ.փոստ՝ ծանուցումներ ուղարկելու համար:

ձևանմուշ_html սահմանում է տեղեկագրի տեքստային ձևանմուշը: HTML-ն օգտագործվում է նշագրում ստեղծելու համար: Այն փոփոխված է շարժիչով ջինջա2 (կարելի է համեմատել django). BuildBot ունի մի շարք փոփոխականներ, որոնց արժեքները փոխարինվում են ձևանմուշում հաղորդագրության տեքստի ստեղծման գործընթացում: Այս փոփոխականները կցվում են {{ կրկնակի գանգուր փակագծերում }}: Օրինակ, ամփոփում ցուցադրում է ավարտված գործողությունների կարգավիճակը, այսինքն՝ հաջողություն կամ ձախողում: Ա ծրագրեր կարտադրվի ձեր Նախագիծը. Այսպիսով, օգտագործելով կառավարման հրամանները ջինջա2, փոփոխականներ BuildBot-a և python տողերի ձևաչափման գործիքներ, կարող եք ստեղծել բավականին տեղեկատվական հաղորդագրություն:

MailNotifier պարունակում է հետևյալ փաստարկները.

fromaddr – հասցեն, որտեղից բոլորը կստանան տեղեկագիրը:

ուղարկել Հետաքրքրված օգտվողներին=True-ն հաղորդագրություն է ուղարկում սեփականատիրոջը և օգտագործողին, ով կատարել է պարտավորություն.

որոնում — վերջածանց, որը պետք է ավելացվի տեղեկագիր ստացող օգտատերերի անուններին: Այսպիսով admin մասին ինչպես օգտվողը կստանա տեղեկագիրը հասցեով [էլեկտրոնային փոստով պաշտպանված].

փոխանցող նշում է հոսթի անունը, որի վրա բացվում է սերվերը SMTPՄի smptPort նշում է պորտի համարը, որը լսում է SMTP սերվեր.

ռեժիմ = "զգուշացում" ասում է, որ փոստը պետք է արվի միայն այն դեպքում, եթե կա առնվազն մեկ քայլ կառուցել-ա, որն ավարտվեց կարգավիճակի ձախողմամբ կամ նախազգուշացմամբ: Հաջողության դեպքում տեղեկագիր ուղարկելու կարիք չկա։

լրացուցիչ ստացողներ պարունակում է այն անձանց ցուցակը, որոնց պետք է ուղարկվի նամակագրությունը, բացի սեփականատիրոջից և այն անձից, ով իրականացրել է. պարտավորություն.

messageFormatter օբյեկտ է, որը սահմանում է հաղորդագրության ձևաչափը, դրա ձևանմուշը և հասանելի փոփոխականների մի շարք ջինջա2. Ընտրանքներ, ինչպիսիք են wantProperties=Ճիշտ է и wantSteps=Ճիշտ է սահմանել հասանելի փոփոխականների այս փաթեթը:

with['services']=[sendMessageTo All] տրամադրում է ծառայությունների ցանկ, որոնց թվում կլինի մերը լրագրող.

Մենք արեցինք դա! Շնորհավորում եմ

Մենք ստեղծեցինք մեր սեփական կոնֆիգուրացիան և տեսանք այն ֆունկցիոնալությունը, որն ունակ է: BuildBot. Սա, կարծում եմ, բավական է հասկանալու համար, թե արդյոք այս գործիքը անհրաժեշտ է ձեր նախագիծը ստեղծելու համար։ Դուք հետաքրքրվա՞ծ եք նրանով։ Ձեզ օգտակար կլինի՞։ Արդյո՞ք նա հարմար է աշխատել: Հետո ես իզուր չեմ գրում այս հոդվածը։

Եվ հետագա. Ես կցանկանայի, որ մասնագիտական ​​հանրությունը օգտագործեր BuildBot, լայնացավ, ձեռնարկներ թարգմանվեցին, օրինակներն էլ ավելի շատ եղան։

Շնորհակալություն բոլորիդ ուշադրության համար։ Հաջողություն.

Source: www.habr.com

Добавить комментарий