ตัวอย่างการใช้งานการบูรณาการอย่างต่อเนื่องโดยใช้ BuildBot

ตัวอย่างการใช้งานการบูรณาการอย่างต่อเนื่องโดยใช้ BuildBot
(ภาพโดย เครื่องคอมพิวเตอร์ ราคาเริ่มต้นที่ Pixabay)

Hi!

ชื่อของฉัน เยฟเกนีย์ เชอร์กินฉันเป็นโปรแกรมเมอร์ในทีมพัฒนาของบริษัทเหมืองแร่แห่งหนึ่ง โพลีเมทัล.

เมื่อเริ่มต้นโครงการขนาดใหญ่ คุณเริ่มคิดว่า: "ซอฟต์แวร์ใดดีที่สุดที่จะใช้ในการให้บริการ" โครงการด้านไอทีต้องผ่านหลายขั้นตอนก่อนที่จะเผยแพร่เวอร์ชันถัดไป เป็นเรื่องดีเมื่อห่วงโซ่ของสเตจเหล่านี้เป็นแบบอัตโนมัติ กระบวนการอัตโนมัติในการเปิดตัวโครงการไอทีเวอร์ชันใหม่นั้นเรียกว่า การบูรณาการอย่างต่อเนื่อง. 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 ฉันเจอบทความเกี่ยวกับการนำไปใช้งาน การบูรณาการอย่างต่อเนื่อง กับ BuildBot. เช่น, อันนี้ ฉันพบว่ามันให้ข้อมูลมากที่สุด มีอีกตัวอย่างหนึ่ง - ง่ายดาย. บทความเหล่านี้สามารถปรุงรสได้ ตัวอย่างจากคู่มือและ มัน หลังจากนั้นเป็นภาษาอังกฤษ รถคูเป้เป็นจุดเริ่มต้นที่ดี หลังจากอ่านบทความเหล่านี้แล้ว คุณอาจต้องการบางสิ่งบางอย่างทันที BuildBot ทำ.

หยุด! มีใครใช้มันในโครงการของพวกเขาจริง ๆ หรือไม่? ปรากฎว่าใช่ มากมาย นำไปประยุกต์ใช้ในงานของตน สามารถพบได้ ตัวอย่าง ใช้ BuildBot และในคลังโค้ดของ Google

แล้วตรรกะของคนที่ใช้คืออะไร บิลด์บอท? ท้ายที่สุดแล้ว ยังมีเครื่องมืออื่นๆ อีก: ครูซคอนโทรล и เจนกิ้นส์. ผมจะตอบแบบนี้ครับ สำหรับงานส่วนใหญ่ เจนกิ้นส์ และความจริงก็จะเพียงพอแล้ว ในทางกลับกัน BuildBot - ปรับตัวได้มากขึ้นในขณะที่ปัญหาได้รับการแก้ไขอย่างง่ายดายเช่นเดียวกับใน เจนกิ้นส์. ทางเลือกเป็นของคุณ แต่เนื่องจากเรากำลังมองหาเครื่องมือสำหรับโครงการเป้าหมายที่กำลังพัฒนา ทำไมไม่เลือกเครื่องมือที่จะช่วยให้ได้รับระบบการสร้างที่มีการโต้ตอบและอินเทอร์เฟซที่เป็นเอกลักษณ์โดยเริ่มจากขั้นตอนง่ายๆ

สำหรับผู้ที่โปรเจ็กต์เป้าหมายเขียนด้วยภาษา Python คำถามก็เกิดขึ้น: “ทำไมไม่เลือกระบบบูรณาการที่มีอินเทอร์เฟซที่ชัดเจนในแง่ของภาษาที่ใช้ในโปรเจ็กต์” และตอนนี้ก็ถึงเวลานำเสนอผลประโยชน์แล้ว BuildBot.

ดังนั้น "วงเครื่องดนตรี" ของเรา สำหรับตัวฉันเอง ฉันได้ระบุคุณลักษณะสี่ประการไว้แล้ว BuildBot:

  1. เป็นเฟรมเวิร์กโอเพ่นซอร์สภายใต้ลิขสิทธิ์ GPL
  2. นี่คือการใช้ Python เป็นเครื่องมือกำหนดค่าและคำอธิบายการดำเนินการที่จำเป็น
  3. นี่เป็นโอกาสที่จะได้รับการตอบสนองจากเครื่องจักรที่ทำการประกอบ
  4. สิ่งเหล่านี้คือข้อกำหนดขั้นต่ำสำหรับโฮสต์ การปรับใช้ต้องใช้ Python และ Twisted และไม่ต้องใช้เครื่องเสมือนและ Java Machine

2. แนวคิดที่นำโดย BuildMaster

ตัวอย่างการใช้งานการบูรณาการอย่างต่อเนื่องโดยใช้ BuildBot

ศูนย์กลางของสถาปัตยกรรมการกระจายงานคือ บิลด์มาสเตอร์. เป็นบริการที่:

  • ติดตาม การเปลี่ยนแปลงในแผนผังต้นทางของโครงการ
  • ส่ง คำสั่งที่ควรดำเนินการโดยบริการ Worker เพื่อสร้างโครงการและทดสอบ
  • แจ้ง ผู้ใช้เกี่ยวกับผลลัพธ์ของการดำเนินการ

บิลด์มาสเตอร์ กำหนดค่าผ่านไฟล์ master.cfg. ไฟล์นี้อยู่ในรูท บิลด์มาสเตอร์. ต่อมาฉันจะแสดงให้เห็นว่ารูตนี้ถูกสร้างขึ้นอย่างไร ไฟล์นั้นเอง master.cfg มีสคริปต์หลามที่ใช้การโทร BuildBot.

วัตถุที่สำคัญที่สุดถัดไป BuildBot มันมีชื่อ คนงาน. บริการนี้สามารถเปิดใช้งานบนโฮสต์อื่นที่มีระบบปฏิบัติการอื่นหรืออาจเปิดใช้งานบนโฮสต์อื่นก็ได้ บิลด์มาสเตอร์. นอกจากนี้ยังสามารถมีอยู่ในสภาพแวดล้อมเสมือนที่เตรียมไว้เป็นพิเศษด้วยแพ็คเกจและตัวแปรของตัวเอง สภาพแวดล้อมเสมือนเหล่านี้สามารถจัดเตรียมได้โดยใช้ยูทิลิตี้หลามเช่น virtualenv, venv.

บิลด์มาสเตอร์ ถ่ายทอดคำสั่งไปยังทุกคน คนงาน-y และในทางกลับกันเขาก็เติมเต็มพวกเขา นั่นคือปรากฎว่ากระบวนการสร้างและทดสอบโครงการสามารถดำเนินต่อไปได้ คนงาน-e ที่ใช้ Windows และบน Worker อื่นที่ใช้ Linux

เช็คเอาท์ ซอร์สโค้ดของโปรเจ็กต์จะเกิดขึ้นในแต่ละรายการ คนงาน-e

3. การติดตั้ง

งั้นไปกัน. ฉันจะใช้ Ubuntu 18.04 เป็นโฮสต์ ฉันจะวางอันหนึ่งไว้บนนั้น บิลด์มาสเตอร์-a และหนึ่ง คนงาน-ก. แต่ก่อนอื่นคุณต้องติดตั้ง 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

ขั้นตอนต่อไปคือการติดตั้ง ทวีตแล้ว и BuildBotรวมถึงแพ็คเกจที่ให้คุณใช้ฟังก์ชันเพิ่มเติมได้ BuildBot-NS.


/*Все что под 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 # Собственно сдесь и создаем

ขั้นตอนต่อไป. มาสร้างกันเถอะ คนงาน. มันจะอยู่ในโฟลเดอร์ของเรา /home/habr/คนงาน.

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

เมื่อคุณวิ่ง คนงานจากนั้นโดยค่าเริ่มต้น มันจะสร้างเข้ามา /home/habr/คนงาน โฟลเดอร์ที่มีชื่อของโครงการซึ่งระบุไว้ใน master.cfg. และในโฟลเดอร์ที่มีชื่อโครงการจะสร้างไดเร็กทอรี สร้างและจะทำต่อไป เช็คเอาต์. ไดเร็กทอรีการทำงานสำหรับ คนงาน-และมันจะกลายเป็นไดเร็กทอรี /home/habr/yourProject/build.

“กุญแจทอง
และตอนนี้สิ่งที่ฉันเขียนในย่อหน้าก่อนหน้านี้สำหรับ: สคริปต์นั้น เจ้านาย จะเรียกร้องจาก คนงาน- และทำจากระยะไกลในไดเร็กทอรีนี้จะไม่ถูกดำเนินการเนื่องจากสคริปต์ไม่มีสิทธิ์ในการทำงาน คุณจะต้องมีกุญแจเพื่อแก้ไขสถานการณ์ --umask=0o22ซึ่งห้ามไม่ให้เขียนลงในไดเร็กทอรีนี้ แต่จะยังคงสิทธิ์ในการเปิดใช้ และนั่นคือทั้งหมดที่เราต้องการ

บิลด์มาสเตอร์ и คนงาน สร้างการเชื่อมต่อระหว่างกัน มันเกิดขึ้นว่ามันแตกออกและ คนงาน รอการตอบกลับจาก บิลด์มาสเตอร์-ก. หากไม่มีการตอบสนอง การเชื่อมต่อจะเริ่มต้นใหม่ สำคัญ --รักษา=60 แค่ต้องระบุเวลาหลังจากนั้น ต่อ รีบูต

5. การกำหนดค่า สูตรทีละขั้นตอน

องค์ประกอบ บิลด์มาสเตอร์ จะดำเนินการที่ด้านข้างของเครื่องที่เราดำเนินการคำสั่ง สร้างมาสเตอร์. ในกรณีของเรา นี่คือไดเร็กทอรี /home/habr/master. ไฟล์การกำหนดค่า master.cfg ยังไม่มี แต่คำสั่งได้สร้างไฟล์แล้ว master.cmg.ตัวอย่าง. คุณต้องเปลี่ยนชื่อเป็น master.cfg.ตัวอย่าง в 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 บิลด์มาสเตอร์คอนฟิก

c = BuildmasterConfig = {} 

BuildmasterConfig — พจนานุกรมพื้นฐานของไฟล์กำหนดค่า จะต้องรวมอยู่ในไฟล์กำหนดค่า เพื่อความสะดวกในการใช้งาน จึงมีการใช้นามแฝงในโค้ดการกำหนดค่า "ค". ชื่อเรื่อง ของกุญแจ в ค["คีย์FromDist"] เป็นองค์ประกอบคงที่สำหรับการโต้ตอบกับ บิลด์มาสเตอร์. สำหรับแต่ละคีย์ วัตถุที่เกี่ยวข้องจะถูกแทนที่ด้วยค่า

แรงงาน 5.2

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

ครั้งนี้เราขอนำเสนอ บิลด์มาสเตอร์-y รายการของ คนงาน-ส ตัวฉันเอง คนงาน เราสร้างขึ้น เหนือ, ยูคาซาว่า คุณ-ชื่อคนงาน и รหัสผ่าน. ตอนนี้จำเป็นต้องระบุแทน ตัวอย่างคนงาน и ส่ง .

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

โดยคีย์ change_source พจนานุกรม c เราเข้าถึงรายการที่เราต้องการวางวัตถุที่สำรวจพื้นที่เก็บข้อมูลด้วยซอร์สโค้ดของโครงการ ตัวอย่างนี้ใช้พื้นที่เก็บข้อมูล Git ที่ถูกสำรวจในช่วงเวลาหนึ่ง

อาร์กิวเมนต์แรกคือเส้นทางไปยังพื้นที่เก็บข้อมูลของคุณ

ผบ หมายถึงเส้นทางไปยังโฟลเดอร์ที่อยู่ด้านข้าง คนงาน-สัมพันธ์กับเส้นทาง /home/habr/worker/yourProject/build git จะเก็บเวอร์ชันท้องถิ่นของที่เก็บ

สาขา มีสาขาเฉพาะในพื้นที่เก็บข้อมูลที่ควรติดตาม

แบบสำรวจความคิดเห็นช่วง มีจำนวนวินาทีหลังจากนั้น บิลด์มาสเตอร์ จะสำรวจพื้นที่เก็บข้อมูลเพื่อดูการเปลี่ยนแปลง

มีหลายวิธีในการติดตามการเปลี่ยนแปลงในที่เก็บของโปรเจ็กต์

วิธีที่ง่ายที่สุดก็คือ การลงคะแนนเลือกตั้งซึ่งหมายความว่า บิลด์มาสเตอร์ สำรวจเซิร์ฟเวอร์กับที่เก็บเป็นระยะ ถ้า ผูกมัด สะท้อนถึงการเปลี่ยนแปลงในคลังแล้ว บิลด์มาสเตอร์ จะสร้างวัตถุภายในโดยมีความล่าช้าบ้าง เปลี่ยนแปลง และส่งไปยังตัวจัดการเหตุการณ์ ตารางเวลาซึ่งจะเปิดตัวขั้นตอนในการสร้างและทดสอบโครงการ คนงาน-e ในบรรดาขั้นตอนเหล่านี้จะมีการระบุไว้ ปรับปรุง พื้นที่เก็บข้อมูล ตรงเป๊ะเลย คนงานสิ่งนี้จะสร้างสำเนาของที่เก็บในเครื่อง รายละเอียดของกระบวนการนี้จะกล่าวถึงด้านล่างในสองส่วนถัดไป (5.4 и 5.5).

วิธีการติดตามการเปลี่ยนแปลงในพื้นที่เก็บข้อมูลที่หรูหรายิ่งขึ้นไปอีกคือการส่งข้อความโดยตรงจากเซิร์ฟเวอร์ที่โฮสต์พื้นที่เก็บข้อมูลนั้น บิลด์มาสเตอร์- เกี่ยวกับการเปลี่ยนซอร์สโค้ดของโครงการ ในกรณีนี้ทันทีที่ผู้พัฒนาทำ ผูกมัดเซิร์ฟเวอร์ที่มีที่เก็บโปรเจ็กต์จะส่งข้อความ บิลด์มาสเตอร์-y และในทางกลับกันเขาจะสกัดกั้นมันด้วยการสร้างวัตถุขึ้นมา PBChangeSource. ต่อไปวัตถุนี้จะถูกโอนไปที่ ตารางเวลาซึ่งเปิดใช้งานขั้นตอนในการสร้างโปรเจ็กต์และทดสอบ ส่วนสำคัญของวิธีนี้กำลังทำงานอยู่ เบ็ด- สคริปต์เซิร์ฟเวอร์ในพื้นที่เก็บข้อมูล ในสคริปต์ เบ็ด-a รับผิดชอบในการประมวลผลการดำเนินการเมื่อ ผูกมัด-e คุณต้องโทรหายูทิลิตี้ ส่งเปลี่ยน และระบุที่อยู่เครือข่าย บิลด์มาสเตอร์-ก. คุณต้องระบุพอร์ตเครือข่ายที่จะรับฟังด้วย PBChangeSource. PBChangeSourceยังไงก็ตามก็เป็นส่วนหนึ่ง บิลด์มาสเตอร์-ก. วิธีการนี้จะต้องได้รับอนุญาต ผู้ดูแลระบบ-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 เพื่อคัดค้าน เปลี่ยนแปลง และตอนนี้ทุก ผู้กำหนดตารางเวลา โดยจะสร้างคำขอเพื่อเริ่มกระบวนการสร้างโครงการ อย่างไรก็ตาม ยังกำหนดเมื่อคำขอเหล่านี้ถูกโอนไปยังคิวเพิ่มเติมอีกด้วย วัตถุ ผู้ก่อสร้าง เก็บคิวคำขอและติดตามสถานะของแอสเซมบลีปัจจุบันแยกจากกัน คนงาน-อี ผู้ก่อสร้าง มีอยู่บน บิลด์มาสเตอร์-e และต่อไป คนงาน-e เขาส่งด้วย. บิลด์มาสเตอร์-เปิด คนงาน-และเฉพาะเจาะจงอยู่แล้ว สร้าง - ชุดขั้นตอนที่ต้องปฏิบัติตาม
เราเห็นว่าในตัวอย่างปัจจุบันดังกล่าว กำหนดการ จัดสร้าง 2 ชิ้น. นอกจากนี้แต่ละคนก็มีประเภทของตัวเอง

SingleBranchScheduler – หนึ่งในชั้นเรียนที่ได้รับความนิยมมากที่สุดในตาราง มันเฝ้าดูสาขาหนึ่งและถูกกระตุ้นโดยการเปลี่ยนแปลงที่บันทึกไว้ในนั้น เมื่อเขาเห็นการเปลี่ยนแปลง เขาสามารถชะลอการส่งคำขอบิลด์ได้ (เลื่อนไปตามระยะเวลาที่ระบุในพารามิเตอร์พิเศษ treeStableTimer) ชื่อ ตั้งชื่อตารางเวลาที่จะแสดง BuildBot-เว็บอินเตอร์เฟส ใน เปลี่ยนตัวกรอง มีการตั้งค่าตัวกรองหลังจากผ่านการเปลี่ยนแปลงในสาขาทำให้กำหนดเวลาส่งคำขอก่อสร้าง ใน ชื่อผู้สร้าง มีการระบุชื่อ สร้าง-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 สร้างโรงงาน


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

BuildTimer เป็นระยะ ระบุเวลาของช่วงเวลานี้เป็นวินาที

สร้างโรงงาน สร้างความเฉพาะเจาะจง สร้างซึ่งตอนนั้น สร้าง ส่งไปที่ คนงาน. ใน สร้างโรงงาน ระบุขั้นตอนที่ต้องปฏิบัติตาม คนงาน-y ขั้นตอนจะถูกเพิ่มโดยการเรียกเมธอด เพิ่มขั้นตอน

ขั้นตอนแรกที่เพิ่มเข้าไปในตัวอย่างนี้คือ คอมไพล์สะอาด -d -f -f –xแล้วก็ การชำระเงินคอมไพล์. การดำเนินการเหล่านี้จะรวมอยู่ในพารามิเตอร์ วิธีซึ่งไม่ได้ระบุไว้อย่างชัดเจน แต่หมายถึงค่าเริ่มต้น สด. พารามิเตอร์ โหมด = 'ส่วนเพิ่ม' บ่งชี้ว่าไฟล์นั้นมาจากไดเร็กทอรีที่ เช็คเอ้าท์แม้ว่าจะหายไปจากพื้นที่เก็บข้อมูล แต่ก็ยังไม่ถูกแตะต้อง

ขั้นตอนที่สองที่เพิ่มเข้ามาคือการเรียกสคริปต์ การทดลอง พร้อมพารามิเตอร์ สวัสดี ด้านข้าง คนงาน-a จากไดเรกทอรี /home/habr/worker/yourProject/build ด้วยตัวแปรสภาพแวดล้อม PATHONPATH=... ดังนั้น คุณสามารถเขียนสคริปต์ของคุณเองและดำเนินการที่ด้านข้างได้ คนงาน-ทุกขั้นตอน util.ShellCommand. สคริปต์เหล่านี้สามารถวางลงในที่เก็บได้โดยตรง แล้วที่ เช็คเอ้าท์-e พวกเขาจะตกอยู่ใน /home/habr/worker/yourProject/build. อย่างไรก็ตาม มี “แต่” สองประการ:

  1. คนงาน ต้องสร้างด้วยกุญแจ --umamask เพื่อที่จะได้ไม่ปิดกั้นสิทธิ์ในการดำเนินการหลังจากนั้น เช็คเอาต์-NS.
  2. ที่ git push-e ของสคริปต์เหล่านี้ คุณต้องระบุคุณสมบัติ ดำเนินการได้ดังนั้นในภายหลัง เช็คเอ้าท์-e ไม่ได้สูญเสียสิทธิ์ในการรันสคริปต์ Git

จำนวนสร้าง 5.6 องค์


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

เกี่ยวกับอะไร ผู้ก่อสร้าง ได้รับการบอกกล่าว ที่นี่. ตอนนี้ฉันจะบอกรายละเอียดเพิ่มเติมเกี่ยวกับวิธีการสร้างมัน ตัวสร้างการกำหนดค่า เป็นตัวสร้าง สร้าง. นักออกแบบดังกล่าวใน ค['ผู้สร้าง'] คุณสามารถระบุได้หลายรายการ เนื่องจากนี่คือแผ่นงานของวัตถุ สร้าง พิมพ์. ทีนี้ลองเขียนตัวอย่างใหม่จาก BuildBotทำให้เข้าใกล้งานของเรามากขึ้น


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

ตอนนี้ฉันจะบอกคุณเกี่ยวกับพารามิเตอร์ ตัวสร้างการกำหนดค่า.

ชื่อ ระบุชื่อ สร้าง-ก. ที่นี่เราตั้งชื่อมันว่า โครงการของคุณ. ซึ่งหมายความว่าเปิด คนงาน- เส้นทางนี้เองจะถูกสร้างขึ้น /home/habr/worker/yourProject/build. ผู้กำหนดตารางเวลา กำลังมองหา สร้าง เพียงด้วยชื่อนี้

ชื่อคนงาน มีแผ่น คนงาน-ส ซึ่งแต่ละอย่างก็ต้องเพิ่มเข้าไปด้วย ค['คนงาน'].

โรงงาน - เฉพาะเจาะจง สร้างซึ่งมันเกี่ยวข้องด้วย สร้าง. เขาจะส่งวัตถุ. สร้าง บน คนงาน เพื่อดำเนินการทุกขั้นตอนที่รวมอยู่ในนี้ให้เสร็จสิ้น สร้าง-NS.

6. ตัวอย่างการกำหนดค่าของคุณเอง

นี่คือตัวอย่างสถาปัตยกรรมโครงการที่ฉันเสนอให้นำไปใช้ BuildBot
.

เราจะใช้เป็นระบบควบคุมเวอร์ชัน สว. พื้นที่เก็บข้อมูลนั้นจะอยู่ในคลาวด์บางประเภท นี่คือที่อยู่ของคลาวด์นี้ svn.host/svn/yourProject/trunk. ในกลุ่มเมฆด้านล่าง สว มีชื่อผู้ใช้บัญชี: ผู้ใช้งาน, รหัสผ่าน: รหัสผ่าน. สคริปต์ที่แสดงขั้นตอน สร้าง-a ก็จะอยู่ในสาขาด้วย สวในโฟลเดอร์แยกต่างหาก buildbot/worker_linux. สคริปต์เหล่านี้อยู่ในที่เก็บที่มีคุณสมบัติที่บันทึกไว้ ปฏิบัติการ.

บิลด์มาสเตอร์ и คนงาน ทำงานบนโฮสต์เดียวกัน โครงการ.โฮสต์ .บิลด์มาสเตอร์ เก็บไฟล์ไว้ในโฟลเดอร์ /home/habr/master. คนงาน มันถูกเก็บไว้ในเส้นทางต่อไปนี้ /home/habr/คนงาน. การสื่อสารกระบวนการ บิลด์มาสเตอร์-a และ คนงาน-a ดำเนินการผ่านพอร์ต 4000 ตามโปรโตคอล BuildBot-ก นั่นคือ 'พีบี' มาตรการ.

โปรเจ็กต์เป้าหมายเขียนด้วยภาษา Python ทั้งหมด ภารกิจคือการติดตามการเปลี่ยนแปลง สร้างไฟล์ปฏิบัติการ สร้างเอกสาร และดำเนินการทดสอบ ในกรณีที่เกิดความล้มเหลว นักพัฒนาซอฟต์แวร์ทุกคนจะต้องส่งข้อความทางอีเมลโดยระบุว่ามีการดำเนินการที่ไม่สำเร็จ

การแสดงเว็บ BuildBot เราจะเชื่อมต่อกับพอร์ต 80 เพื่อ โครงการ.โฮสต์. ไม่จำเป็นต้องติดตั้ง Apatch เป็นส่วนหนึ่งของห้องสมุด เป๋ มีเว็บเซิร์ฟเวอร์อยู่แล้ว BuildBot ใช้มัน

เพื่อจัดเก็บข้อมูลภายในสำหรับ BuildBot เราจะใช้ สแควร์ไลท์.

จำเป็นต้องมีโฮสต์สำหรับการส่งจดหมาย smtp.your.โดเมน - อนุญาตให้ส่งจดหมายจากจดหมาย [ป้องกันอีเมล] โดยไม่มีการรับรองความถูกต้อง อยู่ที่เจ้าบ้านด้วย'SMTP ' รายงานการประชุมอยู่ที่โพสต์ 1025

มีบุคคลสองคนที่เกี่ยวข้องกับกระบวนการนี้: ผู้ดูแลระบบ и ผู้ใช้งาน. ผู้ดูแลระบบ BuildBot. ผู้ใช้คือบุคคลที่กระทำการ ผูกมัด-ส

ไฟล์ปฏิบัติการถูกสร้างขึ้นผ่านทาง โปรแกรมติดตั้ง py. เอกสารถูกสร้างขึ้นผ่านทาง ด็อกซีเจน.

สำหรับสถาปัตยกรรมนี้ ฉันเขียนสิ่งนี้: 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 และ คนงาน-ก. จากนั้นวางไฟล์นี้ master.cfg в /home/habr/master.

ขั้นตอนต่อไปคือการเริ่มบริการ บิลด์มาสเตอร์s


sudo buildbot start /home/habr/master

จากนั้นจึงเริ่มบริการ คนงาน-a


buildbot-worker start /home/habr/worker

พร้อม! ตอนนี้ บิลด์บอท จะติดตามการเปลี่ยนแปลงและทริกเกอร์ ผูกมัด-y เข้า สวดำเนินการขั้นตอนการสร้างและทดสอบโครงการด้วยสถาปัตยกรรมข้างต้น

ด้านล่างนี้ฉันจะอธิบายคุณสมบัติบางอย่างข้างต้น มาสเตอร์.cfg.

6.1 ระหว่างทางไปยัง master.cfg ของคุณ


ในขณะที่เขียนของฉัน master.cfg จะมีข้อผิดพลาดมากมายเกิดขึ้น ดังนั้นจำเป็นต้องอ่านไฟล์บันทึก มันถูกเก็บไว้เป็น บิลด์มาสเตอร์-ec เส้นทางสัมบูรณ์ /home/habr/master/twistd.logและด้านข้าง คนงาน-a มีเส้นทางที่แน่นอน /home/habr/คนงาน/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_alwaysstrunk ตั้งกฎ: วิธีแบ่งโครงสร้างโฟลเดอร์ สว บนกิ่งก้าน พระองค์ทรงเสนอเส้นทางสัมพันธ์แก่พวกเขาด้วย ในทางกลับกัน split_file_alwaysstrunk ลดความซับซ้อนของกระบวนการโดยบอกว่าพื้นที่เก็บข้อมูลมีเพียงเท่านั้น ลำต้น.

В schedulers ระบุ เปลี่ยนตัวกรองใครเห็น ไม่มี และเชื่อมโยงสาขาเข้ากับมัน ลำต้น ตามสมาคมที่กำหนดโดยผ่าน split_file_alwaysstrunk. ตอบสนองต่อการเปลี่ยนแปลงใน ลำต้น, เปิดตัว สร้าง มีชื่อ โครงการของคุณ.

คุณสมบัติ ที่นี่จำเป็นเพื่อให้ผู้ดูแลระบบได้รับรายชื่อผู้รับจดหมายของผลการสร้างและการทดสอบในฐานะเจ้าของกระบวนการ

ขั้นตอน สร้าง-a เช็คเอาต์ สามารถลบไฟล์ใด ๆ ที่อยู่ในที่เก็บเวอร์ชันโลคัลได้อย่างสมบูรณ์ คนงาน-ก. แล้วทำเต็มที่. อัปเดต svn. โหมดนี้ได้รับการกำหนดค่าผ่านพารามิเตอร์ โหมด = เต็ม, วิธีการ = สด. พารามิเตอร์ หยุด OnTailure บอกว่าถ้า อัปเดต 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 (สามารถเปรียบเทียบได้กับ จังโก้). BuildBot มีชุดตัวแปรที่มีค่าจะถูกแทนที่ลงในเทมเพลตระหว่างกระบวนการสร้างข้อความ ตัวแปรเหล่านี้อยู่ใน {{ วงเล็บปีกกาคู่ }} ตัวอย่างเช่น, สรุป แสดงสถานะของการดำเนินการที่เสร็จสมบูรณ์ กล่าวคือ สำเร็จหรือล้มเหลว ก โครงการ จะส่งออก โครงการของคุณ. ดังนั้นการใช้คำสั่งควบคุมใน จินจา2, ตัวแปร BuildBotเครื่องมือการจัดรูปแบบสตริง -a และ python คุณสามารถสร้างข้อความที่ให้ข้อมูลได้ค่อนข้างดี

MailNotifier มีข้อโต้แย้งต่อไปนี้

จากaddr – ที่อยู่ที่ทุกคนจะได้รับจดหมายข่าว

sendToผู้ใช้ที่สนใจ=True ส่งข้อความถึงเจ้าของและผู้ใช้ที่ทำ ผูกมัด.

ค้นหา — คำต่อท้ายที่ต้องเพิ่มในชื่อของผู้ใช้ที่ได้รับจดหมายข่าว ดังนั้น ผู้ดูแลระบบ ผู้ใช้จะได้รับจดหมายข่าวตามที่อยู่อย่างไร [ป้องกันอีเมล].

รีเลย์โฮสต์ ระบุชื่อโฮสต์ที่เซิร์ฟเวอร์เปิดอยู่ SMTPที่ smptPort ระบุหมายเลขพอร์ตที่ฟัง SMTP เซิร์ฟเวอร์

โหมด = "คำเตือน" บอกว่าควรส่งไปรษณีย์ก็ต่อเมื่อมีขั้นตอนอย่างน้อยหนึ่งขั้นตอนเท่านั้น สร้าง-a ซึ่งลงท้ายด้วยสถานะล้มเหลวหรือคำเตือน ในกรณีที่ประสบความสำเร็จ ไม่จำเป็นต้องส่งจดหมายข่าว

ผู้รับพิเศษ มีรายชื่อบุคคลที่ควรส่งจดหมายให้ นอกเหนือจากเจ้าของและบุคคลที่ดำเนินการ ผูกมัด.

ข้อความฟอร์แมตเตอร์ เป็นออบเจ็กต์ที่ระบุรูปแบบข้อความ เทมเพลต และชุดตัวแปรที่มีให้ จินจา2. ตัวเลือกเช่น wantProperties=จริง и wantSteps=จริง กำหนดตัวแปรที่มีอยู่ชุดนี้

ด้วย['บริการ']=[sendMessageToAll] จัดทำรายการบริการซึ่งเราจะเป็น ผู้รายงานข่าว.

เราทำได้! ยินดีด้วย

เราสร้างการกำหนดค่าของเราเองและเห็นฟังก์ชันการทำงานที่สามารถทำได้ BuildBot. ฉันคิดว่านี่เพียงพอที่จะเข้าใจว่าจำเป็นต้องใช้เครื่องมือนี้ในการสร้างโครงการของคุณหรือไม่ คุณสนใจเขาไหม? มันจะเป็นประโยชน์กับคุณหรือไม่? เขาสบายใจที่จะร่วมงานด้วยไหม? ถ้าอย่างนั้นฉันจะไม่เขียนบทความนี้โดยเปล่าประโยชน์

และต่อไป. ฉันอยากให้ชุมชนมืออาชีพใช้ BuildBotกว้างขึ้น มีการแปลคู่มือ และยังมีตัวอย่างอีกมากมาย

ขอขอบคุณทุกท่านที่ให้ความสนใจ ขอให้โชคดี.

ที่มา: will.com

เพิ่มความคิดเห็น