Tôi cần thiết lập quy trình lắp ráp và phân phối các gói phần mềm từ kho Git đến trang web. Và cách đây không lâu, khi tôi thấy trên Habré một bài viết về buildbot (đường dẫn ở cuối), tôi đã quyết định thử và áp dụng nó.
Vì buildbot là một hệ thống phân tán nên sẽ hợp lý nếu tạo một máy chủ xây dựng riêng cho từng kiến trúc và hệ điều hành. Trong trường hợp của chúng tôi, đây sẽ là các thùng chứa LXC (trong trường hợp Linux) và qemu (trong trường hợp Windows):
vm-srv-build1 - centos 7, sẽ có một buildbot master và một trong những công nhân
vm-srv-build2 - debian 10, để xây dựng các gói DEB
vm-srv-build3 - windows 10, để lắp ráp, bạn biết để làm gì
Chúng tôi sẽ thu thập GUI Rac — giao diện đồ họa dành cho rac 1C để quản lý một cụm máy chủ. Đối với Linux, các công cụ tiêu chuẩn cho từng HĐH sẽ được sử dụng; để xây dựng tệp exe cho Windows từ tập lệnh tcl, hãy sử dụng miễn phí.
Cài đặt
GNU / Linux
Có đủ tài liệu trên Internet để cài đặt 1,2. Có, và nó không gây ra bất kỳ vấn đề đặc biệt nào:
Đối với thầy:
Tất nhiên, sẽ đúng hơn nếu thu thập các gói cho từng HĐH, nhưng điều này nằm ngoài phạm vi của bài viết. Chúng tôi cũng sẽ bỏ qua mô tả về việc thiết lập vùng chứa cho công việc, tôi chỉ lưu ý rằng tôi sử dụng ProxMox VE. Và bạn cũng sẽ cần cài đặt các gói cho từng trục cần thiết để lắp ráp (centos: RPMdevtools, v.v.; debian: build-essential, dh-make, pbuilder, v.v.)
Các dự án xây dựng và dịch vụ buildbot sẽ được khởi chạy với tư cách là người dùng không có đặc quyền, vì vậy bạn cần tạo một dự án trên tất cả các máy chủ tham gia vào quy trình:
adduser buildbot
Tiếp theo, chúng tôi sẽ định cấu hình tự động khởi chạy dịch vụ tương ứng trên từng máy chủ (vùng chứa):
Sau này, bạn có thể tạo cơ sở hạ tầng thư mục cho “công nhân” (trên tất cả các máy chủ), để thực hiện việc này, hãy đăng ký dưới tên người dùng buildbot và chạy các lệnh sau:
Trên máy chủ đầu tiên vm-srv-build1:
su - buildbot
mkdir /home/buildbot/worker
cd ~
buildbot-worker create-worker --umask=0o22 --keepalive=60 worker vm-srv-build1:4000 CentOS 123456
Trên máy chủ thứ hai vm-srv-build2:
su - buildbot
mkdir /home/buildbot/worker
cd ~
buildbot-worker create-worker --umask=0o22 --keepalive=60 worker vm-srv-build1:4000 Debian-10 123456
Trên máy chủ công nhân, dịch vụ buildbot-worker có thể được khởi động
systemctl start buildbot-worker
MS Windows
Với tư cách là một “công nhân” lắp ráp trong Windows, một máy ảo chạy phiên bản Win10 mới nhất sẽ được sử dụng.
Để làm việc bạn cần:
Sau khi cài đặt xong tất cả những thứ trên, bạn có thể cài đặt buildbot:
pip install buildbot-worker
Hãy tạo một thư mục làm việc
md c:worker
Và hãy khởi động
buildbot-worker start c:worker
Nếu mọi thứ đều hoạt động (xem nhật ký c:workertwistd.log), thì bạn có thể đăng ký “worker” của chúng tôi làm dịch vụ bằng cách thêm một mục có thư mục làm việc vào sổ đăng ký (các lệnh được thực thi trong powershell chạy với tư cách quản trị viên):
Đó là tất cả với các “công nhân”, bạn không cần phải động chạm gì thêm đến họ, mọi quyền kiểm soát đều đến từ chủ.
Thiết lập thuật sĩ
Để bắt đầu, hãy tạo cơ sở hạ tầng cho bản gốc (trên máy chủ chính), để thực hiện việc này, hãy đăng ký dưới tên người dùng buildbot và chạy các lệnh sau:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
Đối với các gói làm sẵn, hãy tạo thư mục bản dựng
mkdir /home/buildbot/builds
Tệp master.cfg đã được tạo trong thư mục /home/buildbot/master/. Tệp này là mã python và chứa mô tả về tất cả các cơ chế của hệ thống; chúng tôi sẽ làm việc với nó trong tương lai.
Để tự động hóa việc lắp ráp các gói thuộc các phiên bản khác nhau, để không phải đi sâu vào mã của tệp master.cfg, trong tập lệnh chính của chương trình rac_gui.tcl, các dòng có phiên bản hiện tại và bản phát hành đã được thêm vào tiêu đề :
Và dựa vào những dòng này buildbot sẽ đánh số các gói. Để trích xuất dữ liệu, hãy sử dụng lệnh gọi console grep. Trong buildbot, bạn đơn giản là không thể xác định các biến cho “công nhân” (ít nhất là tôi chưa tìm ra cách). Đây là những gì tài sản được sử dụng cho. Những thứ kia. Trong quá trình lắp ráp, chúng tôi thêm các bước để xác định phiên bản và bản phát hành, đồng thời đặt thuộc tính phiên bản và bản phát hành. Các thuộc tính có thể được đặt theo nhiều cách khác nhau, trong trường hợp này bằng cách gọi lệnh console:
# Добавим определение версии из основного файла
rac_gui_build_RPM.addStep(
steps.SetPropertyFromCommand(
command="grep version ../rac-gui/rac_gui.tcl | grep -oE 'b[0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2}b'", property="version"
)
)
# Добавим определение релиза из основного файла
rac_gui_build_RPM.addStep(
steps.SetPropertyFromCommand(
command="grep release ../rac-gui/rac_gui.tcl | grep -oE 'b[0-9]{1,3}b'", property="release"
)
)
Bạn có thể thay thế các giá trị kết quả bằng cách gọi util.Interpolate().
Để đặt số phiên bản và bản phát hành chính xác, hãy sử dụng lệnh gọi sed tiêu chuẩn, tức là. lệnh thay thế các giá trị bên trong tệp spec bằng các giá trị được yêu cầu
Chúng tôi sao chép gói đã lắp ráp hoàn chỉnh và kho lưu trữ có nguồn vào bản chính. Nhưng bạn có thể sao chép ngay các tệp từ tệp công việc vào kho lưu trữ hoặc trang web của mình.
# Скопируем файл на мастер
rac_gui_build_RPM.addStep(
steps.FileUpload(
workersrc=util.Interpolate("/home/buildbot/rpmbuild/RPMS/noarch/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm"),
masterdest=util.Interpolate("/home/buildbot/builds/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm")
)
)
rac_gui_build_RPM.addStep(
steps.FileUpload(
workersrc=util.Interpolate("/home/buildbot/rpmbuild/SOURCES/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz"),
masterdest=util.Interpolate("/home/buildbot/builds/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz")
)
)
Hãy bắt đầu quá trình sao chép các gói đã thu thập vào hosting qua FTP trên máy chủ. Với mục đích này nó được sử dụng kịch bản trên tcl.
Đó là với RPM. Bây giờ hãy bắt đầu mô tả thuật toán xây dựng gói DEB. Do các quy trình xây dựng gói cho các hệ thống khác nhau độc lập với nhau nên nhiều bước sẽ được lặp lại.
rac_gui_build_DEB = util.BuildFactory()
rac_gui_build_DEB.addStep(steps.Git(
repourl = 'https://bitbucket.org/svk28/rac-gui.git',
haltOnFailure = True,
submodules = True,
mode='full',
workdir='build',
progress = True)
)
# Добавим определение версии из основного файла
rac_gui_build_DEB.addStep(
steps.SetPropertyFromCommand(
command="grep version rac_gui.tcl | grep -oE 'b[0-9]{1,2}.[0-9]{1,2}.[0-9]{1,2}b'", property="version"
)
)
# Добавим определение релиза из основного файла
rac_gui_build_DEB.addStep(
steps.SetPropertyFromCommand(
command="grep release rac_gui.tcl | grep -oE 'b[0-9]{1,3}b'", property="release"
)
)
# Переименуем запускаемый файл
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["mv", "rac_gui.tcl", "racgui"]))
Đối với gói RPM, một số quy trình sau được chính vòng/phút thực hiện trong quá trình lắp ráp và được mô tả bên trong thông số kỹ thuật; đối với Debian, bạn phải thực hiện tại đây:
# Поменяем пути к библиотекам
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["sed", "-i", "s+^set dir(lib)+set dir(lib) /usr/share/rac-gui/lib ;#+g", "racgui"]))
# Поменяем пути к файлам
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["sed", "-i", "s+[pwd]+/usr/share/rac-gui+g", "racgui"]))
# заархивируем исходники
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["tar", "czf", util.Interpolate("../rac-gui_%(prop:version)s.orig.tar.gz"), "."]))
# Соберём пакет
rac_gui_build_DEB.addStep(steps.ShellCommand(
command=["dpkg-buildpackage"]))
# Скопируем файл на мастер
rac_gui_build_DEB.addStep(
steps.FileUpload(
workersrc=util.Interpolate("../rac-gui_%(prop:version)s-%(prop:release)s_amd64.deb"),
masterdest=util.Interpolate("/home/buildbot/builds/rac-gui_%(prop:version)s-%(prop:release)s_amd64.deb")
)
)
rac_gui_build_DEB.addStep(
steps.MasterShellCommand(
command=["/usr/local/bin/deploy-ftp.tcl",
util.Interpolate("--local-file=/home/buildbot/builds/rac-gui_%(prop:version)s-%(prop:release)s_amd64.deb"),
util.Interpolate("--remote-file=uploads/rac-gui/rac-gui_%(prop:version)s-%(prop:release)s_amd64.deb")]
)
)
Lưu tệp và bạn có thể thử khởi động dịch vụ thuật sĩ:
systemctl restart buildbot-master
Trong nhật ký, chúng tôi sẽ kiểm tra xem mọi thứ có đúng với cấu hình không và mọi thứ có hoạt động như bình thường không. Tất cả các công nhân của chúng tôi bây giờ sẽ kết nối, điều này sẽ được báo cáo trong nhật ký »»'/home/buildbot/master/twistd.log»»':
2019-07-24 16:50:35+0300 [-] Loading buildbot.tac...
2019-07-24 16:50:35+0300 [-] Loaded.
2019-07-24 16:50:35+0300 [-] twistd 19.2.1 (/usr/bin/python3.6 3.6.8) starting up.
2019-07-24 16:50:35+0300 [-] reactor class: twisted.internet.epollreactor.EPollReactor.
2019-07-24 16:50:35+0300 [-] Starting BuildMaster -- buildbot.version: 2.3.1
2019-07-24 16:50:35+0300 [-] Loading configuration from '/home/buildbot/master/master.cfg'
2019-07-24 16:50:36+0300 [-] /usr/local/lib/python3.6/site-packages/buildbot/config.py:90: buildbot.config.ConfigWarning: [0.9.0 and later] `buildbotNetUsageData` is not configured and defaults to basic.
This parameter helps the buildbot development team to understand the installation base.
No personal information is collected.
Only installation software version info and plugin usage is sent.
You can `opt-out` by setting this variable to None.
Or `opt-in` for more information by setting it to "full".
2019-07-24 16:50:36+0300 [-] Setting up database with URL 'sqlite:/state.sqlite'
2019-07-24 16:50:36+0300 [-] setting database journal mode to 'wal'
2019-07-24 16:50:36+0300 [-] adding 1 new services, removing 0
2019-07-24 16:50:36+0300 [-] adding 1 new change_sources, removing 0
2019-07-24 16:50:36+0300 [-] gitpoller: using workdir '/home/buildbot/master/gitpoller-work'
2019-07-24 16:50:36+0300 [-] adding 3 new builders, removing 0
2019-07-24 16:50:36+0300 [-] adding 1 new schedulers, removing 0
2019-07-24 16:50:36+0300 [-] initializing www plugin 'waterfall_view'
2019-07-24 16:50:36+0300 [-] initializing www plugin 'console_view'
2019-07-24 16:50:36+0300 [-] initializing www plugin 'grid_view'
2019-07-24 16:50:36+0300 [-] NOTE: www plugin 'sitenav' is installed but not configured
2019-07-24 16:50:36+0300 [-] initializing www plugin 'waterfall_view'
2019-07-24 16:50:36+0300 [-] initializing www plugin 'console_view'
2019-07-24 16:50:36+0300 [-] initializing www plugin 'grid_view'
2019-07-24 16:50:36+0300 [-] NOTE: www plugin 'sitenav' is installed but not configured
2019-07-24 16:50:36+0300 [-] BuildbotSite starting on 80
2019-07-24 16:50:36+0300 [-] Starting factory <buildbot.www.service.BuildbotSite object at 0x7fe31c2657b8>
2019-07-24 16:50:36+0300 [-] adding 3 new workers, removing 0
2019-07-24 16:50:36+0300 [-] PBServerFactory starting on 4000
2019-07-24 16:50:36+0300 [-] Starting factory <twisted.spread.pb.PBServerFactory object at 0x7fe31c147470>
2019-07-24 16:50:37+0300 [-] BuildMaster is running
2019-07-24 16:50:37+0300 [-] buildbotNetUsageData: sending {'installid': 'b6193b126b96689351d2fe95787c5a03fc0879f9', 'versions': {'Python': '3.6.8', 'Buildbot': '2.3.1', 'Twisted': '19.2.1'}, 'platform': {'platform': 'Linux-4.15.18-10- pve-x86_64-with-centos-7.6.1810-Core', 'system': 'Linux', 'machine': 'x86_64', 'processor': 'x86_64', 'python_implementation': 'CPython', 'version': '#1 SMP PVE 4.15.18-32', 'distro': 'centos:7'}, 'plugins': {'buildbot/worker/base/Worker': 3, 'buildbot/config/BuilderConfig': 3, 'buildbot/schedulers/basic/SingleBranchScheduler': 1, 'buildbot/reporters/mail/MailNotifier': 1, 'buildbot/changes/gitpoller/GitPoller': 1, 'buildbot/steps/worker/MakeDirectory': 1, 'buildbot/steps/source/git/Git': 3, 'buildbot/steps/shell/ShellCommand': 9, 'buildbot/steps/package/rpm/rpmbuild/RpmBuild': 1}, 'db': 'sqlite', 'mq': 'simple', 'www_plugins': ['waterfall_view', 'console_view', 'grid_view']}
2019-07-24 16:50:37+0300 [Broker,0,127.0.0.1] worker 'CentOS' attaching from IPv4Address(type='TCP', host='127.0.0.1', port=37332)
2019-07-24 16:50:37+0300 [Broker,0,127.0.0.1] Got workerinfo from 'CentOS'
2019-07-24 16:50:37+0300 [-] bot attached
2019-07-24 16:50:37+0300 [Broker,0,127.0.0.1] Worker CentOS attached to Rac-GUI-RPM-builder
2019-07-24 16:50:37+0300 [-] buildbotNetUsageData: buildbot.net said: ok
2019-07-24 16:50:39+0300 [Broker,1,192.168.55.15] worker 'Windows-10' attaching from IPv4Address(type='TCP', host='192.168.5.145', port=49831)
2019-07-24 16:50:39+0300 [Broker,1,192.168.55.15] Got workerinfo from 'Windows-10'
2019-07-24 16:50:40+0300 [-] bot attached
2019-07-24 16:50:40+0300 [Broker,1,192.168.55.15] Worker Windows-10 attached to Rac-GUI-WIN-builder
2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] worker 'Debian-10' attaching from IPv4Address(type='TCP', host='192.168.5.9', port=44430)
2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] Got workerinfo from 'Debian-10'
2019-07-24 16:50:41+0300 [-] bot attached
2019-07-24 16:50:41+0300 [Broker,2,192.168.55.99] Worker Debian-10 attached to Rac-GUI-DEB-builder
Điều này hoàn tất quá trình thiết lập. Bạn có thể xem trạng thái hiện tại thông qua giao diện web. Nơi bạn cũng có thể thấy lỗi xây dựng, khởi động quy trình bị đóng băng nếu có sự cố, v.v.
Ngay sau khi ra mắt, các bạn có thể xem những người thợ chăm chỉ của chúng tôi thông qua menu “Builds” -> “Workers”
Sau khi quá trình xây dựng đầu tiên hoàn tất (tức là thay đổi kho Git), trạng thái của các quy trình sẽ xuất hiện trên trang đầu tiên.
Nếu bạn nhấp chuột vào dòng mong muốn, một trang sẽ mở ra với trạng thái hiện tại của quá trình này, nơi bạn có thể xem điều gì đang xảy ra, lỗi gì, v.v.
Toàn bộ cấu hình trình hướng dẫn có thể được tìm thấy ở đây