(ภาพโดย
Hi!
ชื่อของฉัน เยฟเกนีย์ เชอร์กินฉันเป็นโปรแกรมเมอร์ในทีมพัฒนาของบริษัทเหมืองแร่แห่งหนึ่ง โพลีเมทัล.
เมื่อเริ่มต้นโครงการขนาดใหญ่ คุณเริ่มคิดว่า: "ซอฟต์แวร์ใดดีที่สุดที่จะใช้ในการให้บริการ" โครงการด้านไอทีต้องผ่านหลายขั้นตอนก่อนที่จะเผยแพร่เวอร์ชันถัดไป เป็นเรื่องดีเมื่อห่วงโซ่ของสเตจเหล่านี้เป็นแบบอัตโนมัติ กระบวนการอัตโนมัติในการเปิดตัวโครงการไอทีเวอร์ชันใหม่นั้นเรียกว่า การบูรณาการอย่างต่อเนื่อง. BuildBot กลายเป็นผู้ช่วยที่ดีสำหรับเราในการดำเนินกระบวนการนี้
ในบทความนี้ ฉันตัดสินใจที่จะให้ภาพรวมของความเป็นไปได้ BuildBot. ซอฟต์แวร์นี้มีความสามารถอะไร? จะเข้าหาเขาได้อย่างไร และจะสร้างความสัมพันธ์ในการทำงานที่มีประสิทธิภาพตามปกติกับเขาได้อย่างไร? คุณสามารถใช้ประสบการณ์ของเราได้ด้วยตัวเองโดยการสร้างบริการที่ใช้งานได้สำหรับการสร้างและทดสอบโปรเจ็กต์ของคุณบนเครื่องของคุณ
Содержание
Содержание
1. ทำไมต้อง BuildBot?
ก่อนหน้านี้ใน habr-e ฉันเจอบทความเกี่ยวกับการนำไปใช้งาน การบูรณาการอย่างต่อเนื่อง กับ BuildBot. เช่น,
หยุด! มีใครใช้มันในโครงการของพวกเขาจริง ๆ หรือไม่? ปรากฎว่าใช่
แล้วตรรกะของคนที่ใช้คืออะไร บิลด์บอท? ท้ายที่สุดแล้ว ยังมีเครื่องมืออื่นๆ อีก: ครูซคอนโทรล и เจนกิ้นส์. ผมจะตอบแบบนี้ครับ สำหรับงานส่วนใหญ่ เจนกิ้นส์ และความจริงก็จะเพียงพอแล้ว ในทางกลับกัน BuildBot - ปรับตัวได้มากขึ้นในขณะที่ปัญหาได้รับการแก้ไขอย่างง่ายดายเช่นเดียวกับใน เจนกิ้นส์. ทางเลือกเป็นของคุณ แต่เนื่องจากเรากำลังมองหาเครื่องมือสำหรับโครงการเป้าหมายที่กำลังพัฒนา ทำไมไม่เลือกเครื่องมือที่จะช่วยให้ได้รับระบบการสร้างที่มีการโต้ตอบและอินเทอร์เฟซที่เป็นเอกลักษณ์โดยเริ่มจากขั้นตอนง่ายๆ
สำหรับผู้ที่โปรเจ็กต์เป้าหมายเขียนด้วยภาษา Python คำถามก็เกิดขึ้น: “ทำไมไม่เลือกระบบบูรณาการที่มีอินเทอร์เฟซที่ชัดเจนในแง่ของภาษาที่ใช้ในโปรเจ็กต์” และตอนนี้ก็ถึงเวลานำเสนอผลประโยชน์แล้ว BuildBot.
ดังนั้น "วงเครื่องดนตรี" ของเรา สำหรับตัวฉันเอง ฉันได้ระบุคุณลักษณะสี่ประการไว้แล้ว BuildBot:
- เป็นเฟรมเวิร์กโอเพ่นซอร์สภายใต้ลิขสิทธิ์ GPL
- นี่คือการใช้ Python เป็นเครื่องมือกำหนดค่าและคำอธิบายการดำเนินการที่จำเป็น
- นี่เป็นโอกาสที่จะได้รับการตอบสนองจากเครื่องจักรที่ทำการประกอบ
- สิ่งเหล่านี้คือข้อกำหนดขั้นต่ำสำหรับโฮสต์ การปรับใช้ต้องใช้ Python และ Twisted และไม่ต้องใช้เครื่องเสมือนและ Java Machine
2. แนวคิดที่นำโดย BuildMaster
ศูนย์กลางของสถาปัตยกรรมการกระจายงานคือ บิลด์มาสเตอร์. เป็นบริการที่:
- ติดตาม การเปลี่ยนแปลงในแผนผังต้นทางของโครงการ
- ส่ง คำสั่งที่ควรดำเนินการโดยบริการ 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 # Собственно сдесь и создаем
mkdir worker
buildbot-worker create-worker --umask=0o22 --keepalive=60 worker localhost:4000 yourWorkerName password
เมื่อคุณวิ่ง คนงานจากนั้นโดยค่าเริ่มต้น มันจะสร้างเข้ามา /home/habr/คนงาน โฟลเดอร์ที่มีชื่อของโครงการซึ่งระบุไว้ใน master.cfg. และในโฟลเดอร์ที่มีชื่อโครงการจะสร้างไดเร็กทอรี สร้างและจะทำต่อไป เช็คเอาต์. ไดเร็กทอรีการทำงานสำหรับ คนงาน-และมันจะกลายเป็นไดเร็กทอรี /home/habr/yourProject/build.
“กุญแจทอง
และตอนนี้สิ่งที่ฉันเขียนในย่อหน้าก่อนหน้านี้สำหรับ: สคริปต์นั้น เจ้านาย จะเรียกร้องจาก คนงาน- และทำจากระยะไกลในไดเร็กทอรีนี้จะไม่ถูกดำเนินการเนื่องจากสคริปต์ไม่มีสิทธิ์ในการทำงาน คุณจะต้องมีกุญแจเพื่อแก้ไขสถานการณ์
บิลด์มาสเตอร์ и คนงาน สร้างการเชื่อมต่อระหว่างกัน มันเกิดขึ้นว่ามันแตกออกและ คนงาน รอการตอบกลับจาก บิลด์มาสเตอร์-ก. หากไม่มีการตอบสนอง การเชื่อมต่อจะเริ่มต้นใหม่ สำคัญ --รักษา=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 — พจนานุกรมพื้นฐานของไฟล์กำหนดค่า จะต้องรวมอยู่ในไฟล์กำหนดค่า เพื่อความสะดวกในการใช้งาน จึงมีการใช้นามแฝงในโค้ดการกำหนดค่า "ค". ชื่อเรื่อง
แรงงาน 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 ในบรรดาขั้นตอนเหล่านี้จะมีการระบุไว้ ปรับปรุง พื้นที่เก็บข้อมูล ตรงเป๊ะเลย คนงานสิ่งนี้จะสร้างสำเนาของที่เก็บในเครื่อง รายละเอียดของกระบวนการนี้จะกล่าวถึงด้านล่างในสองส่วนถัดไป (
วิธีการติดตามการเปลี่ยนแปลงในพื้นที่เก็บข้อมูลที่หรูหรายิ่งขึ้นไปอีกคือการส่งข้อความโดยตรงจากเซิร์ฟเวอร์ที่โฮสต์พื้นที่เก็บข้อมูลนั้น บิลด์มาสเตอร์- เกี่ยวกับการเปลี่ยนซอร์สโค้ดของโครงการ ในกรณีนี้ทันทีที่ผู้พัฒนาทำ ผูกมัดเซิร์ฟเวอร์ที่มีที่เก็บโปรเจ็กต์จะส่งข้อความ บิลด์มาสเตอร์-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"]))
กำหนดการ – นี่คือองค์ประกอบที่ทำหน้าที่เป็นตัวกระตุ้นที่เริ่มต้นห่วงโซ่การประกอบและการทดสอบทั้งหมดของโครงการ
การเปลี่ยนแปลงเหล่านั้นที่ถูกบันทึกไว้ change_source, เปลี่ยนแปลงไปในกระบวนการทำงาน BuildBot-a เพื่อคัดค้าน เปลี่ยนแปลง และตอนนี้ทุก ผู้กำหนดตารางเวลา โดยจะสร้างคำขอเพื่อเริ่มกระบวนการสร้างโครงการ อย่างไรก็ตาม ยังกำหนดเมื่อคำขอเหล่านี้ถูกโอนไปยังคิวเพิ่มเติมอีกด้วย วัตถุ
เราเห็นว่าในตัวอย่างปัจจุบันดังกล่าว กำหนดการ จัดสร้าง 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. อย่างไรก็ตาม มี “แต่” สองประการ:
- คนงาน ต้องสร้างด้วยกุญแจ
--umamask เพื่อที่จะได้ไม่ปิดกั้นสิทธิ์ในการดำเนินการหลังจากนั้น เช็คเอาต์-NS. - ที่ git push-e ของสคริปต์เหล่านี้ คุณต้องระบุคุณสมบัติ ดำเนินการได้ดังนั้นในภายหลัง เช็คเอ้าท์-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. ผู้กำหนดตารางเวลา กำลังมองหา สร้าง เพียงด้วยชื่อนี้
ชื่อคนงาน มีแผ่น คนงาน-ส ซึ่งแต่ละอย่างก็ต้องเพิ่มเข้าไปด้วย ค['คนงาน'].
โรงงาน - เฉพาะเจาะจง สร้างซึ่งมันเกี่ยวข้องด้วย สร้าง. เขาจะส่งวัตถุ. สร้าง บน คนงาน เพื่อดำเนินการทุกขั้นตอนที่รวมอยู่ในนี้ให้เสร็จสิ้น สร้าง-NS.
6. ตัวอย่างการกำหนดค่าของคุณเอง
นี่คือตัวอย่างสถาปัตยกรรมโครงการที่ฉันเสนอให้นำไปใช้ BuildBot
.
เราจะใช้เป็นระบบควบคุมเวอร์ชัน สว. พื้นที่เก็บข้อมูลนั้นจะอยู่ในคลาวด์บางประเภท นี่คือที่อยู่ของคลาวด์นี้
บิลด์มาสเตอร์ и คนงาน ทำงานบนโฮสต์เดียวกัน โครงการ.โฮสต์ .บิลด์มาสเตอร์ เก็บไฟล์ไว้ในโฟลเดอร์ /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"
}
ก่อนอื่นคุณต้อง
ขั้นตอนต่อไปคือการเริ่มบริการ บิลด์มาสเตอร์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 ใช้เพื่อสร้างมาร์กอัป มันถูกดัดแปลงโดยเครื่องยนต์
MailNotifier มีข้อโต้แย้งต่อไปนี้
จากaddr – ที่อยู่ที่ทุกคนจะได้รับจดหมายข่าว
sendToผู้ใช้ที่สนใจ=True ส่งข้อความถึงเจ้าของและผู้ใช้ที่ทำ ผูกมัด.
ค้นหา — คำต่อท้ายที่ต้องเพิ่มในชื่อของผู้ใช้ที่ได้รับจดหมายข่าว ดังนั้น ผู้ดูแลระบบ ผู้ใช้จะได้รับจดหมายข่าวตามที่อยู่อย่างไร [ป้องกันอีเมล].
รีเลย์โฮสต์ ระบุชื่อโฮสต์ที่เซิร์ฟเวอร์เปิดอยู่ SMTPที่ smptPort ระบุหมายเลขพอร์ตที่ฟัง SMTP เซิร์ฟเวอร์
โหมด = "คำเตือน" บอกว่าควรส่งไปรษณีย์ก็ต่อเมื่อมีขั้นตอนอย่างน้อยหนึ่งขั้นตอนเท่านั้น สร้าง-a ซึ่งลงท้ายด้วยสถานะล้มเหลวหรือคำเตือน ในกรณีที่ประสบความสำเร็จ ไม่จำเป็นต้องส่งจดหมายข่าว
ผู้รับพิเศษ มีรายชื่อบุคคลที่ควรส่งจดหมายให้ นอกเหนือจากเจ้าของและบุคคลที่ดำเนินการ ผูกมัด.
ข้อความฟอร์แมตเตอร์ เป็นออบเจ็กต์ที่ระบุรูปแบบข้อความ เทมเพลต และชุดตัวแปรที่มีให้ จินจา2. ตัวเลือกเช่น wantProperties=จริง и wantSteps=จริง กำหนดตัวแปรที่มีอยู่ชุดนี้
ด้วย['บริการ']=[sendMessageToAll] จัดทำรายการบริการซึ่งเราจะเป็น ผู้รายงานข่าว.
เราทำได้! ยินดีด้วย
เราสร้างการกำหนดค่าของเราเองและเห็นฟังก์ชันการทำงานที่สามารถทำได้ BuildBot. ฉันคิดว่านี่เพียงพอที่จะเข้าใจว่าจำเป็นต้องใช้เครื่องมือนี้ในการสร้างโครงการของคุณหรือไม่ คุณสนใจเขาไหม? มันจะเป็นประโยชน์กับคุณหรือไม่? เขาสบายใจที่จะร่วมงานด้วยไหม? ถ้าอย่างนั้นฉันจะไม่เขียนบทความนี้โดยเปล่าประโยชน์
และต่อไป. ฉันอยากให้ชุมชนมืออาชีพใช้ BuildBotกว้างขึ้น มีการแปลคู่มือ และยังมีตัวอย่างอีกมากมาย
ขอขอบคุณทุกท่านที่ให้ความสนใจ ขอให้โชคดี.
ที่มา: will.com