Π’ΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° Π½Π°ΡΡΡΠΎΡ ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ ΠΈ Π΄ΠΎΡΡΠ°Π²ΡΠ½Π΅ Π½Π° ΡΠΎΡΡΡΠ΅ΡΠ½ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΎΡ Git Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π° ΡΠ°ΠΉΡΠ°. Π ΠΊΠΎΠ³Π°ΡΠΎ Π²ΠΈΠ΄ΡΡ , Π½Π΅ ΡΠΎΠ»ΠΊΠΎΠ²Π° ΠΎΡΠ΄Π°Π²Π½Π°, ΡΡΠΊ Π½Π° HabrΓ© ΡΡΠ°ΡΠΈΡ Π·Π° buildbot (Π²ΡΡΠ·ΠΊΠ° Π² ΠΊΡΠ°Ρ), ΡΠ΅ΡΠΈΡ Π΄Π° Ρ ΠΏΡΠΎΠ±Π²Π°ΠΌ ΠΈ Π΄Π° Ρ ΠΏΡΠΈΠ»ΠΎΠΆΠ°.
Π’ΡΠΉ ΠΊΠ°ΡΠΎ buildbot Π΅ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°, Π±ΠΈ Π±ΠΈΠ»ΠΎ Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π΄Π° ΡΠ΅ ΡΡΠ·Π΄Π°Π΄Π΅ ΠΎΡΠ΄Π΅Π»Π΅Π½ Ρ ΠΎΡΡ Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ Π·Π° Π²ΡΡΠΊΠ° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ° ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°. Π Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ ΡΠΎΠ²Π° ΡΠ΅ Π±ΡΠ΄Π°Ρ LXC ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ (Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° Linux) ΠΈ qemu (Π² ΡΠ»ΡΡΠ°ΠΉ Π½Π° Windows):
- vm-srv-build1 - centos 7, ΡΠ΅ ΠΈΠΌΠ° buildbot master ΠΈ Π΅Π΄ΠΈΠ½ ΠΎΡ ΡΠ°Π±ΠΎΡΠ½ΠΈΡΠΈΡΠ΅
- vm-srv-build2 - debian 10, Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° DEB ΠΏΠ°ΠΊΠ΅ΡΠΈ
- vm-srv-build3 - windows 10, Π·Π° ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅, Π·Π½Π°Π΅ΡΠ΅ Π·Π° ΠΊΠ°ΠΊΠ²ΠΎ
Π©Π΅ ΡΡΠ±ΠΈΡΠ°ΠΌΠ΅
ΠΠ½ΡΡΠ°Π»Π°ΡΠΈΡ
GNU / Linux
Π ΠΈΠ½ΡΠ΅ΡΠ½Π΅Ρ ΠΈΠΌΠ° Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡ Π·Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅
ΠΠ° ΠΌΠ°ΠΉΡΡΠΎΡΠ°:
pip3 install buildbot
pip3 install twisted
pip3 install autobahn
pip3 install pysqlite3
pip3 install sqlalchemy sqlalchemy-migrate
pip3 install buildbot-www buildbot-grid-view buildbot-console-view buildbot-waterfall-view
pip3 install python-dateutil
ΠΠ° βΡΠ°Π±ΠΎΡΠ½ΠΈΡΠΈΡΠ΅β ΡΠΎΠ²Π° Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ:
pip3 install buildbot-worker
Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, Π±ΠΈ Π±ΠΈΠ»ΠΎ ΠΏΠΎ-ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ Π΄Π° ΡΠ΅ ΡΡΠ±ΠΈΡΠ°Ρ ΠΏΠ°ΠΊΠ΅ΡΠΈ Π·Π° Π²ΡΡΠΊΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°, Π½ΠΎ ΡΠΎΠ²Π° Π΅ ΠΈΠ·Π²ΡΠ½ ΠΎΠ±Ρ Π²Π°ΡΠ° Π½Π° ΡΡΠ°ΡΠΈΡΡΠ°. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ ΠΏΡΠΎΠΏΡΡΠ½Π΅ΠΌ ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ΡΠΎ Π½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ°ΡΠ° Π½Π° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ°, ΡΠ΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠ° ΡΠ°ΠΌΠΎ, ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ ProxMox VE. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ Π·Π° Π²ΡΡΠΊΠ° ΠΎΡ, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° Π·Π° ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ (centos: rpmdevtools ΠΈ Ρ.Π½.; debian: build-essential, dh-make, pbuilder ΠΈ Ρ.Π½.)
ΠΡΠΎΠ΅ΠΊΡΠΈΡΠ΅ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ ΠΈ ΡΡΠ»ΡΠ³ΠΈΡΠ΅ Π·Π° buildbot ΡΠ΅ Π±ΡΠ΄Π°Ρ ΡΡΠ°ΡΡΠΈΡΠ°Π½ΠΈ ΠΊΠ°ΡΠΎ Π½Π΅ΠΏΡΠΈΠ²ΠΈΠ»Π΅Π³ΠΈΡΠΎΠ²Π°Π½ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π», ΡΠ°ΠΊΠ° ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΡΠ°ΠΊΡΠ² Π½Π° Π²ΡΠΈΡΠΊΠΈ Ρ ΠΎΡΡΠΎΠ²Π΅, ΡΡΠ°ΡΡΠ²Π°ΡΠΈ Π² ΠΏΡΠΎΡΠ΅ΡΠ°:
adduser buildbot
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΠΌΠ΅ Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ»ΡΠ³ΠΈ, ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎ, Π½Π° Π²ΡΠ΅ΠΊΠΈ ΠΎΡ Ρ ΠΎΡΡΠΎΠ²Π΅ΡΠ΅ (ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΈ):
Systemd Π΅Π΄ΠΈΠ½ΠΈΡΠ° Π·Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ²Π΅ΡΠ½ΠΈΠΊΠ°:
touch /etc/systemd/buildbot-master.service
[Unit]
Description=BuildBot master service
After=network.target
[Service]
User=buildbot
Group=buildbot
WorkingDirectory=/home/buildbot/master
ExecStart=/usr/local/bin/buildbot start --nodaemon
ExecReload=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
ΠΈ "ΡΠ°Π±ΠΎΡΠ½ΠΈΠΊ"
touch /etc/systemd/buildbot-worker.service
[Unit]
Description=BuildBot worker service
After=network.target
[Service]master
User=buildbot
Group=buildbot
WorkingDirectory=/home/buildbot/worker
ExecStart=/usr/local/bin/buildbot-worker start --nodaemon
[Install]
WantedBy=buildbot-master.service
Π’ΡΠΉ ΠΊΠ°ΡΠΎ Π²ΡΠΈΡΠΊΠΈ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ (Π² Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ) ΡΠ΅ Π½Π°ΠΌΠΈΡΠ°Ρ Π² /usr/local/, ΡΡΡΠ±Π²Π° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ ΠΏΡΡΡ Π΄ΠΎ ΡΡΡ Π² ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈΡΠ΅ Π½Π° ΡΡΠ΅Π΄Π°ΡΠ°:
nano /root/.bash_profile
PATH=$PATH:$HOME/.local/bin:$HOME/bin:/usr/local/bin
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ° Π½Π° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π·Π° βΡΠ°Π±ΠΎΡΠ½ΠΈΡΠΈβ (Π½Π° Π²ΡΠΈΡΠΊΠΈ Ρ ΠΎΡΡΠΎΠ²Π΅), Π·Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π°, ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΠΉΡΠ΅ ΡΠ΅ ΠΏΠΎΠ΄ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π½Π° buildbot ΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅ΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ:
ΠΠ° ΠΏΡΡΠ²ΠΈΡ Ρ ΠΎΡΡ 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
ΠΠ° Π²ΡΠΎΡΠΈΡ Ρ ΠΎΡΡ 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
ΠΠ° ΡΠ°Π±ΠΎΡΠ½ΠΈ Ρ ΠΎΡΡΠΎΠ²Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° ΡΡΠ»ΡΠ³Π°ΡΠ° buildbot-worker
systemctl start buildbot-worker
MS Windows
ΠΠ°ΡΠΎ βΡΠ°Π±ΠΎΡΠ½ΠΈΠΊβ Π·Π° ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ ΠΏΠΎΠ΄ Windows ΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° Ρ Π½Π°ΠΉ-Π½ΠΎΠ²Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° Win10.
ΠΠ° ΡΠ°Π±ΠΎΡΠ° ΡΠ΅ Π²ΠΈ ΡΡΡΠ±Π²Π°:
ΠΠΈΡΠΎΠ½ PyWIN ΠΎΡΠΈΠ²Π°ΠΌ - ΠΠ° Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π½Π΅ΡΠ° Π² Python, ΡΡΡΠ±Π²Π°ΡΠ΅ Π΄Π° ΠΈΠ·ΡΠ΅Π³Π»ΠΈΡΠ΅
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° Visual Studio 2019 - 7Zip
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ Π²ΡΠΈΡΠΊΠΎ ΠΏΠΎ-Π³ΠΎΡΠ΅ Π΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΎ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΌΠΈΡ buildbot:
pip install buildbot-worker
ΠΠ΅ΠΊΠ° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΡΠ°Π±ΠΎΡΠ΅ΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ
md c:worker
Π Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅
buildbot-worker start c:worker
ΠΠΊΠΎ Π²ΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ (Π²ΠΈΠΆΡΠ΅ ΠΆΡΡΠ½Π°Π»Π° c:workertwistd.log), ΡΠΎΠ³Π°Π²Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΡΠ΅ Π½Π°ΡΠΈΡ βΡΠ°Π±ΠΎΡΠ½ΠΈΠΊβ ΠΊΠ°ΡΠΎ ΡΡΠ»ΡΠ³Π°, ΠΊΠ°ΡΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ Π΅Π»Π΅ΠΌΠ΅Π½Ρ Ρ ΡΠ°Π±ΠΎΡΠ½Π°ΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ ΠΊΡΠΌ ΡΠ΅Π³ΠΈΡΡΡΡΠ° (ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°Ρ Π² powershell, ΡΠ°Π±ΠΎΡΠ΅Ρ ΠΊΠ°ΡΠΎ Π°Π΄ΠΌΠΈΠ½ΠΈΡΡΡΠ°ΡΠΎΡ):
buildbot_worker_windows_service.exe --user VM-SRV-BUILD3buildbot --password 123456 --startup auto install
New-ItemProperty -path Registry::HKEY_LOCAL_MACHINESYSTEMCurrentControlSetservicesBuildBotParameters -Name directories -PropertyType String -Value c:worker
Π ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΡΡΠ»ΡΠ³Π°ΡΠ°
Start-Service buildbot
Π’ΠΎΠ²Π° Π΅ Π²ΡΠΈΡΠΊΠΎ Ρ βΡΠ°Π±ΠΎΡΠ½ΠΈΡΠΈΡΠ΅β, Π½Π΅ Π΅ Π½ΡΠΆΠ½ΠΎ Π΄Π° Π³ΠΈ Π΄ΠΎΠΊΠΎΡΠ²Π°ΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅, ΡΠ΅Π»ΠΈΡΡ ΠΊΠΎΠ½ΡΡΠΎΠ» ΠΈΠ΄Π²Π° ΠΎΡ Π³ΠΎΡΠΏΠΎΠ΄Π°ΡΡ.
ΠΠ°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΡΡΠ²Π΅ΡΠ½ΠΈΠΊΠ°
ΠΠ°ΡΠΎ Π½Π°ΡΠ°Π»ΠΎ, Π½Π΅ΠΊΠ° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° Π·Π° Π³Π»Π°Π²Π½ΠΈΡ (Π½Π° Π³Π»Π°Π²Π½ΠΈΡ Ρ ΠΎΡΡ), Π·Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π°, ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°ΠΉΡΠ΅ ΡΠ΅ ΠΏΠΎΠ΄ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π½Π° buildbot ΠΈ ΠΈΠ·ΠΏΡΠ»Π½Π΅ΡΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ:
su - buildbot
mkdir /home/buildbot/master
cd ~
buildbot create-master master
ΠΠ° Π³ΠΎΡΠΎΠ²ΠΈ ΠΏΠ°ΠΊΠ΅ΡΠΈ ΡΡΠ·Π΄Π°ΠΉΡΠ΅ Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΠΈ
mkdir /home/buildbot/builds
Π‘ΡΠ·Π΄Π°Π΄Π΅Π½ Π΅ ΡΠ°ΠΉΠ» master.cfg Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° /home/buildbot/master/. Π’ΠΎΠ·ΠΈ ΡΠ°ΠΉΠ» Π΅ ΠΊΠΎΠ΄ Π½Π° Python ΠΈ ΡΡΠ΄ΡΡΠΆΠ° ΠΎΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π° Π²ΡΠΈΡΠΊΠΈ ΠΌΠ΅Ρ Π°Π½ΠΈΠ·ΠΌΠΈ Π½Π° ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°, ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈΠΌ Ρ Π½Π΅Π³ΠΎ Π² Π±ΡΠ΄Π΅ΡΠ΅.
nano /home/buildbot/master/master.cfg
import os, re
from buildbot.plugins import steps, util, schedulers, worker, changes, reporters
c= BuildmasterConfig ={}
# ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ Π½Π°ΡΠΈΡ
ΡΠ°Π±ΠΎΡΠΈΡ
.
c['workers'] = [ worker.Worker('CentOS', '123456'), worker.Worker('Debian-10', '123456'), worker.Worker('Windows-10', '123456')]
c['protocols'] = {'pb': {'port': 4000}}
# Π£ΠΊΠ°Π·Π°Π½ΠΈΠ΅ ΠΌΠ°ΡΡΠ΅ΡΡ ΠΊΠ°ΠΊΠΎΠΉ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΉ ΠΎΡΡΠ»Π΅ΠΆΠΈΠ²Π°ΡΡ
c['change_source'] = []
c['change_source'].append(changes.GitPoller(
repourl = 'https://bitbucket.org/svk28/rac-gui.git',
project = 'Rac-GUI',
branches = True,
pollInterval = 60
)
)
# ΡΠ»ΡΠΆΠ±Π° Π·Π°ΠΏΡΡΠΊΠ° ΡΠ±ΠΎΡΠΊΠΈ
c['schedulers'] = []
c['schedulers'].append(schedulers.SingleBranchScheduler(
name="Rac-GUI-schedulers",
change_filter=util.ChangeFilter(branch='master'),
builderNames=["Rac-GUI-RPM-builder", "Rac-GUI-DEB-builder", "Rac-GUI-WIN-builder"],
properties = {'owner': 'admin'}
)
)
@util.renderer
######################################3
# Π‘Π±ΠΎΡΠΊΠ° RPM-ΠΏΠ°ΠΊΠ΅ΡΠ°
rac_gui_build_RPM = util.BuildFactory()
rac_gui_build_RPM.addStep(steps.Git(
repourl = 'https://bitbucket.org/svk28/rac-gui.git',
workdir = 'rac-gui',
haltOnFailure = True,
submodules = True,
mode='full',
progress = True)
)
ΠΠ° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΎΡ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π²Π΅ΡΡΠΈΠΈ, Π·Π° Π΄Π° Π½Π΅ ΡΠ΅ Π½Π°Π»Π°Π³Π° Π΄Π° ΡΠ΅ ΡΠΎΠ²ΠΈΡΠ΅ Π² ΠΊΠΎΠ΄Π° Π½Π° ΡΠ°ΠΉΠ»Π° master.cfg, Π² Π³Π»Π°Π²Π½ΠΈΡ ΡΠΊΡΠΈΠΏΡ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° rac_gui.tcl Π±ΡΡ Π° Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ ΡΠ΅Π΄ΠΎΠ²Π΅ Ρ ΡΠ΅ΠΊΡΡΠ°ΡΠ° Π²Π΅ΡΡΠΈΡ ΠΈ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ Π² Π·Π°Π³Π»Π°Π²ΠΊΠ°ΡΠ° :
######################################################
# Rac GUI
...
# version: 1.0.3
# release: 1
Π Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΡΠ΅Π·ΠΈ ΡΠ΅Π΄ΠΎΠ²Π΅ buildbot ΡΠ΅ Π½ΠΎΠΌΠ΅ΡΠΈΡΠ° ΠΏΠ°ΠΊΠ΅ΡΠΈΡΠ΅. ΠΠ° Π΄Π° ΠΈΠ·Π²Π»Π΅ΡΠ΅ΡΠ΅ Π΄Π°Π½Π½ΠΈ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°ΡΠ° grep. Π buildbot ΠΏΡΠΎΡΡΠΎ Π½Π΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΄Π΅ΡΠΈΠ½ΠΈΡΠ°ΡΠ΅ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²ΠΈ Π·Π° βΡΠ°Π±ΠΎΡΠ½ΠΈΡΠΈβ (ΠΏΠΎΠ½Π΅ Π°Π· Π½Π΅ ΠΎΡΠΊΡΠΈΡ ΠΊΠ°ΠΊ). ΠΡΠΎ Π·Π° ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΈΠΌΠΎΡΠΈΡΠ΅. Π’Π΅Π·ΠΈ. Π ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° Π°ΡΠ΅ΠΌΠ±Π»ΠΈΡΠ°Π½Π΅ Π½ΠΈΠ΅ Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ ΡΡΡΠΏΠΊΠΈ Π·Π° ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° Π²Π΅ΡΡΠΈΡΡΠ° ΠΈ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ΡΠΎ ΠΈ ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎ Π·Π°Π΄Π°Π²Π°ΠΌΠ΅ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΡΠ° Π½Π° Π²Π΅ΡΡΠΈΡΡΠ° ΠΈ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ΡΠΎ. Π‘Π²ΠΎΠΉΡΡΠ²Π°ΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ ΠΏΠΎ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π½Π°ΡΠΈΠ½ΠΈ, Π² ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΡΡΠ΅Π· ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°:
# ΠΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°
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"
)
)
ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π·Π°ΠΌΠ΅Π½ΠΈΡΠ΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ, ΠΊΠ°ΡΠΎ ΠΈΠ·Π²ΠΈΠΊΠ°ΡΠ΅ util.Interpolate().
# ΠΠ°ΠΏΠ°ΠΊΡΠ΅ΠΌ ΠΈΡΡ
ΠΎΠ΄Π½ΠΈΠΊΠΈ
rac_gui_build_RPM.addStep(
steps.ShellCommand(
command=["tar", "czf", util.Interpolate("/home/buildbot/rpmbuild/SOURCES/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz"), "../rac-gui"]
)
)
Π’ΡΠΊ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠΈ, ΡΠ΅ ΡΡΠΉ ΠΊΠ°ΡΠΎ Ρ ΠΎΡΡΡΡ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΈ Π·Π° ΡΡΡΠ½ΠΎ ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ, ΡΠ³Π»ΠΎΠ±ΡΠ²Π°Π½Π΅ΡΠΎ ΡΠ΅ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠΈ ΠΏΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈ ΠΏΡΡΠΈΡΠ°.
# ΠΠΎΠΏΠΈΡΡΠ΅ΠΌ spec
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["cp", "../rac-gui/rac_gui.spec", "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"]))
ΠΠ° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎΡΠΎ ΠΈΠ·Π΄Π°Π½ΠΈΠ΅ ΠΈ Π½ΠΎΠΌΠ΅ΡΠ° Π½Π° Π²Π΅ΡΡΠΈΡΡΠ°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΡΠ΅ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° sed, Ρ.Π΅. ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Π·Π°ΠΌΠ΅Π½Ρ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅ Π² ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ ΡΠ°ΠΉΠ» Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅
# ΠΌΠ΅Π½ΡΠ΅ΠΌ Π²Π΅ΡΡΠΈΡ
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["sed", "-i", util.Interpolate("s/.*Version:.*/Version:t%(prop:version)s/"), "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"]))
# ΠΌΠ΅Π½ΡΠ΅ΠΌ ΡΠ΅Π»ΠΈΠ·
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["sed", "-i", util.Interpolate("s/.*Release:.*/Release:t%(prop:release)s/"), "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"]))
# Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΠΏΡΠΎΡΠ΅ΡΡ ΡΠ±ΠΎΡΠΊΠΈ
rac_gui_build_RPM.addStep(steps.RpmBuild(
specfile="/home/buildbot/rpmbuild/SPECS/rac_gui.spec",
dist='.el5',
topdir='/home/buildbot/rpmbuild',
builddir='/home/buildbot/rpmbuild/build',
rpmdir='/home/buildbot/rpmbuild/RPMS',
sourcedir='/home/buildbot/rpmbuild/SOURCES'
)
)
ΠΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π³ΠΎΡΠΎΠ²ΠΈΡ ΡΠ³Π»ΠΎΠ±Π΅Π½ ΠΏΠ°ΠΊΠ΅Ρ ΠΈ Π°ΡΡ ΠΈΠ²Π° Ρ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ Π½Π° ΠΊΠ°ΠΏΠΈΡΠ°Π½Π°. ΠΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π²Π΅Π΄Π½Π°Π³Π° Π΄Π° ΠΊΠΎΠΏΠΈΡΠ°ΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΎΡ ΡΠ°Π±ΠΎΡΠ½ΠΈΡ ΡΠΈ ΡΠ°ΠΉΠ» Π²ΡΠ² Π²Π°ΡΠ΅ΡΠΎ Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ ΠΈΠ»ΠΈ ΡΠ΅Π±ΡΠ°ΠΉΡ.
# Π‘ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ ΡΠ°ΠΉΠ» Π½Π° ΠΌΠ°ΡΡΠ΅Ρ
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")
)
)
ΠΠ΅ΠΊΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΠΊΠΎΠΏΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ±ΡΠ°Π½ΠΈΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΠΈ ΠΊΡΠΌ Ρ
ΠΎΡΡΠΈΠ½Π³Π° ΡΡΠ΅Π· FTP Π½Π° Π³Π»Π°Π²Π½ΠΈΡ. ΠΠ° ΡΠ°Π·ΠΈ ΡΠ΅Π» ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°
rac_gui_build_RPM.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.noarch.rpm"),
util.Interpolate("--remote-file=uploads/rac-gui/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm")]
)
)
rac_gui_build_RPM.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.tar.gz"),
util.Interpolate("--remote-file=uploads/rac-gui/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz")]
)
)
Π’ΠΎΠ²Π° Π΅ Π²ΡΠΈΡΠΊΠΎ Ρ RPM. Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Π΄Π° ΠΎΠΏΠΈΡΠ²Π°ΠΌΠ΅ Π°Π»Π³ΠΎΡΠΈΡΡΠΌΠ° Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° DEB ΠΏΠ°ΠΊΠ΅Ρ. Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ Π·Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ Π½Π° ΠΏΠ°ΠΊΠ΅ΡΠΈ Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ ΡΠ° Π½Π΅Π·Π°Π²ΠΈΡΠΈΠΌΠΈ Π΅Π΄ΠΈΠ½ ΠΎΡ Π΄ΡΡΠ³, ΠΌΠ½ΠΎΠ³ΠΎ ΡΡΡΠΏΠΊΠΈ ΡΠ΅ Π±ΡΠ΄Π°Ρ ΠΏΠΎΠ²ΡΠΎΡΠ΅Π½ΠΈ.
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"]))
ΠΠ° RPM ΠΏΠ°ΠΊΠ΅Ρ Π½ΡΠΊΠΎΠΈ ΠΎΡ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠΈ ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π°Ρ ΠΎΡ ΡΠ°ΠΌΠΈΡ rpm ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° Π°ΡΠ΅ΠΌΠ±Π»ΠΈΡΠ°Π½Π΅ ΠΈ ΡΠ° ΠΎΠΏΠΈΡΠ°Π½ΠΈ Π² ΡΠΏΠ΅ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΡΠ°; Π·Π° Debian ΡΡΡΠ±Π²Π° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΡΠΊ:
# ΠΠΎΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΏΡΡΠΈ ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌ
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")]
)
)
Π Π³ΠΎΡΠΎΠ²ΠΎ Ρ DEB, ΡΠ΅Π³Π° Windows!
rac_gui_build_WIN = util.BuildFactory()
rac_gui_build_WIN.addStep(steps.Git(
repourl = 'https://bitbucket.org/svk28/rac-gui.git',
haltOnFailure = True,
submodules = True,
mode='full',
workdir='build',
progress = True)
)
Π’ΡΠΉ ΠΊΠ°ΡΠΎ grep ΠΈ sed Π½Π΅ ΡΠ° ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈ Π² Windows (ΠΈΠ»ΠΈ ΠΈΠΌΠ°?), ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ powershell
# ΠΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°
rac_gui_build_WIN.addStep(
steps.SetPropertyFromCommand(
command="powershell -command "((Get-Content .rac_gui.tcl | Select-String -Pattern 'version:') -split 's')[2]",
property="version"
)
)
# ΠΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ΅Π»ΠΈΠ·Π° ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°
rac_gui_build_WIN.addStep(
steps.SetPropertyFromCommand(
command="powershell -command "((Get-Content .rac_gui.tcl | Select-String -Pattern 'release:') -split 's')[2]",
property="release"
)
)
# Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌΡΠΉ ΡΠ°ΠΉΠ»
rac_gui_build_WIN.addStep(steps.ShellCommand(
command=["c:binfreewrap.exe", "rac_gui.tcl"]))
# Π·Π°ΠΏΠ°ΠΊΡΠ΅ΠΌ ΡΠΎ, ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ
rac_gui_build_WIN.addStep(steps.ShellCommand(
command=["c:Program Files7-zip7z.exe", "a", "-r", util.Interpolate("..rac-gui_%(prop:version)s-%(prop:release)s.win.zip"), "..build"]))
# ΡΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ Π½Π° ΠΌΠ°ΡΡΠ΅Ρ
rac_gui_build_WIN.addStep(
steps.FileUpload(
workersrc=util.Interpolate("..rac-gui_%(prop:version)s-%(prop:release)s.win.zip"),
masterdest=util.Interpolate("/home/buildbot/builds/rac-gui_%(prop:version)s-%(prop:release)s.win.zip")
)
)
# Π‘ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ ΡΠ°ΠΉΠ» Π½Π° Ρ
ΠΎΡΡΠΈΠ½Π³
rac_gui_build_WIN.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.win.zip"),
util.Interpolate("--remote-file=uploads/rac-gui/rac-gui_%(prop:version)s-%(prop:release)s.win.zip")]
)
)
# Π’ΡΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅ΠΌ ΠΊΠ°ΠΊΠΈΠ΅ ΡΠ±ΠΎΡΡΠΈΠΊΠΈ Ρ Π½Π°Ρ Π΅ΡΡΡ
c['builders'] = [
util.BuilderConfig(name="Rac-GUI-RPM-builder", workername='CentOS', factory=rac_gui_build_RPM),
util.BuilderConfig(name="Rac-GUI-DEB-builder", workername='Debian-10', factory=rac_gui_build_DEB),
util.BuilderConfig(name="Rac-GUI-WIN-builder", workername='Windows-10', factory=rac_gui_build_WIN),
]
Π©Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΈΠΌΠ΅ΠΉΠ», Π·Π° Π΄Π° Π²ΠΈ ΡΠ²Π΅Π΄ΠΎΠΌΠΈΠΌ Π·Π° ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅.
c['services'] = []
template=u'''
<h4>Build status: {{ summary }}</h4>
<p> Worker used: {{ workername }}</p>
{% for step in build['steps'] %}
<p> {{ step['name'] }}: {{ step['result'] }}</p>
{% endfor %}
<p><b> -- The Buildbot</b></p>
'''
mailNotifier = reporters.MailNotifier(fromaddr="[email protected]",
sendToInterestedUsers=False,
mode=('all'),
extraRecipients=["[email protected]"],
relayhost="mail.domain.ru",
smtpPort=587,
smtpUser="[email protected]",
smtpPassword="******",
messageFormatter=reporters.MessageFormatter(
template=template, template_type='html',
wantProperties=True, wantSteps=True))
c['services'].append(mailNotifier)
# ΠΡΠ½ΠΎΠ²Π½ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΌΠ°ΡΡΠ΅ΡΠ°
c['title'] = "The process of bulding"
c['titleURL'] = "http://vm-srv-build1:80/"
c['buildbotURL'] = "http://vm-srv-build1/"
c['www'] = dict(port=80,
plugins=dict(waterfall_view={}, console_view={}, grid_view={}))
c['db'] = {
'db_url' : "sqlite:///state.sqlite"
}
ΠΠ°ΠΏΠ°Π·Π΅ΡΠ΅ ΡΠ°ΠΉΠ»Π° ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΎΠΏΠΈΡΠ°ΡΠ΅ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ ΡΡΠ»ΡΠ³Π°ΡΠ° ΡΡΠ²Π΅ΡΠ½ΠΈΠΊ:
systemctl restart buildbot-master
Π Π΄Π½Π΅Π²Π½ΠΈΠΊΠ° ΡΠ΅ ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ Π΄Π°Π»ΠΈ Π²ΡΠΈΡΠΊΠΎ Π΅ Π½Π°ΡΠ΅Π΄ Ρ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΠΈ Π²ΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ Π½ΠΎΡΠΌΠ°Π»Π½ΠΎ. ΠΡΠΈΡΠΊΠΈ Π½Π°ΡΠΈ ΡΠ°Π±ΠΎΡΠ½ΠΈΡΠΈ Π²Π΅ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠΆΠ°Ρ, ΠΊΠΎΠ΅ΡΠΎ Ρ ΡΠ°Π΄ΠΎΡΡ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΎΡΡΠ΅ΡΠ΅Π½ΠΎ Π² Π΄Π½Π΅Π²Π½ΠΈΠΊΠ° »»'/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
Π’ΠΎΠ²Π° Π·Π°Π²ΡΡΡΠ²Π° ΠΏΡΠΎΡΠ΅ΡΠ° Π½Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ°. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΡΠ΅ΠΊΡΡΠΎΡΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ ΡΡΠ΅Π· ΡΠ΅Π± ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°. ΠΡΠ΄Π΅ΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΡΠΎ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ Π³ΡΠ΅ΡΠΊΠΈ ΠΏΡΠΈ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅, Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΡΠ΅ Π·Π°ΠΌΡΠ°Π·Π΅Π½ ΠΏΡΠΎΡΠ΅Ρ, Π°ΠΊΠΎ Π½Π΅ΡΠΎ ΡΠ΅ ΠΎΠ±ΡΡΠΊΠ° ΠΈ Ρ.Π½.
ΠΠ΅Π΄Π½Π°Π³Π° ΡΠ»Π΅Π΄ ΠΏΡΡΠΊΠ°Π½Π΅ΡΠΎ Π½Π° ΠΏΠ°Π·Π°ΡΠ° Π½Π°ΡΠΈΡΠ΅ ΡΡΡΠ΄ΠΎΠ»ΡΠ±ΠΈΠ²ΠΈ ΡΠ°Π±ΠΎΡΠ½ΠΈΡΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΏΡΠ΅Π³Π»Π΅Π΄Π°Π½ΠΈ ΠΏΡΠ΅Π· ΠΌΠ΅Π½ΡΡΠΎ βΠΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅β -> βΠ Π°Π±ΠΎΡΠ½ΠΈΡΠΈβ
Π‘Π»Π΅Π΄ ΠΏΡΠΈΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΡΠ²ΠΈΡ ΠΏΡΠΎΡΠ΅Ρ Π½Π° ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°Π½Π΅ (Ρ.Π΅. ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² Git Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ), ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΡΠ΅ΡΠΈΡΠ΅ ΡΠ΅ ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ Π½Π° ΠΏΡΡΠ²Π°ΡΠ° ΡΡΡΠ°Π½ΠΈΡΠ°.
ΠΠΊΠΎ ΡΡΠ°ΠΊΠ½Π΅ΡΠ΅ Π²ΡΡΡ Ρ ΠΆΠ΅Π»Π°Π½ΠΈΡ ΡΠ΅Π΄ Ρ ΠΌΠΈΡΠΊΠ°ΡΠ°, ΡΠ΅ ΡΠ΅ ΠΎΡΠ²ΠΎΡΠΈ ΡΡΡΠ°Π½ΠΈΡΠ° Ρ ΡΠ΅ΠΊΡΡΠΎΡΠΎ ΡΡΡΡΠΎΡΠ½ΠΈΠ΅ Π½Π° ΡΠΎΠ·ΠΈ ΠΏΡΠΎΡΠ΅Ρ, ΠΊΡΠ΄Π΅ΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΡΠ»ΡΡΠ²Π°, ΠΊΠ°ΠΊΠ²ΠΈ Π³ΡΠ΅ΡΠΊΠΈ ΠΈ Ρ.Π½.
Π¦ΡΠ»Π°ΡΠ° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π½Π° ΡΡΠ²Π΅ΡΠ½ΠΈΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π½Π°ΠΌΠ΅ΡΠ΅Π½Π° ΡΡΠΊ
import os, re
from buildbot.plugins import steps, util, schedulers, worker, changes, reporters
c= BuildmasterConfig ={}
c['workers'] = [ worker.Worker('CentOS', '123456'), worker.Worker('Debian-10', '123456'), worker.Worker('Windows-10', '123456')]
c['protocols'] = {'pb': {'port': 4000}}
c['change_source'] = []
c['change_source'].append(changes.GitPoller(
repourl = 'https://bitbucket.org/svk28/rac-gui.git',
project = 'Rac-GUI',
branches = True,
pollInterval = 600
))
# ΡΠ»ΡΠΆΠ±Π° Π·Π°ΠΏΡΡΠΊΠ° ΡΠ±ΠΎΡΠΊΠΈ
c['schedulers'] = []
c['schedulers'].append(schedulers.SingleBranchScheduler(
name="Rac-GUI-schedulers",
change_filter=util.ChangeFilter(branch='master'),
builderNames=["Rac-GUI-RPM-builder", "Rac-GUI-DEB-builder", "Rac-GUI-WIN-builder"],
properties = {'owner': 'admin'}
))
@util.renderer
def get_name_version_release(props):
prog_name = "rac-gui"
prog_version = "1.0.3"
prog_release = "3"
return {
"prog_name": prog_name
#"prog_version": prog_version,
#"prog_release": prog_release
}
rac_gui_build_RPM = util.BuildFactory()
rac_gui_build_RPM.addStep(steps.Git(
repourl = 'https://bitbucket.org/svk28/rac-gui.git',
workdir = 'rac-gui',
haltOnFailure = True,
submodules = True,
mode='full',
progress = True)
)
# ΠΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°
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"
)
)
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["tar", "czf", util.Interpolate("/home/buildbot/rpmbuild/SOURCES/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz"), "../rac-gui"]))
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["cp", "../rac-gui/rac_gui.spec", "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"]))
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["sed", "-i", util.Interpolate("s/.*Version:.*/Version:t%(prop:version)s/"), "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"]))
rac_gui_build_RPM.addStep(steps.ShellCommand(
command=["sed", "-i", util.Interpolate("s/.*Release:.*/Release:t%(prop:release)s/"), "/home/buildbot/rpmbuild/SPECS/rac_gui.spec"]))
rac_gui_build_RPM.addStep(steps.RpmBuild(
specfile="/home/buildbot/rpmbuild/SPECS/rac_gui.spec",
dist='.el5',
topdir='/home/buildbot/rpmbuild',
builddir='/home/buildbot/rpmbuild/build',
rpmdir='/home/buildbot/rpmbuild/RPMS',
sourcedir='/home/buildbot/rpmbuild/SOURCES'
))
# Π‘ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ ΡΠ°ΠΉΠ» Π½Π° ΠΌΠ°ΡΡΠ΅Ρ
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")
)
)
rac_gui_build_RPM.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.noarch.rpm"),
util.Interpolate("--remote-file=uploads/rac-gui/rac-gui-%(prop:version)s-%(prop:release)s.noarch.rpm")]
)
)
rac_gui_build_RPM.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.tar.gz"),
util.Interpolate("--remote-file=uploads/rac-gui/rac-gui-%(prop:version)s-%(prop:release)s.tar.gz")]
)
)
####################################
## DEB
####################################
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"]))
# ΠΠΎΠΌΠ΅Π½ΡΠ΅ΠΌ ΠΏΡΡΠΈ ΠΊ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΠΌ
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")]
)
)
############################################
# WIN
############################################
rac_gui_build_WIN = util.BuildFactory()
rac_gui_build_WIN.addStep(steps.Git(
repourl = 'https://bitbucket.org/svk28/rac-gui.git',
haltOnFailure = True,
submodules = True,
mode='full',
workdir='build',
progress = True)
)
# ΠΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π²Π΅ΡΡΠΈΠΈ ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°
rac_gui_build_WIN.addStep(
steps.SetPropertyFromCommand(
command="powershell -command "((Get-Content .rac_gui.tcl | Select-String -Pattern 'version:') -split 's')[2]",
property="version"
)
)
# ΠΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ΅Π»ΠΈΠ·Π° ΠΈΠ· ΠΎΡΠ½ΠΎΠ²Π½ΠΎΠ³ΠΎ ΡΠ°ΠΉΠ»Π°
rac_gui_build_WIN.addStep(
steps.SetPropertyFromCommand(
command="powershell -command "((Get-Content .rac_gui.tcl | Select-String -Pattern 'release:') -split 's')[2]",
property="release"
)
)
# Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌΡΠΉ ΡΠ°ΠΉΠ»
rac_gui_build_WIN.addStep(steps.ShellCommand(
command=["c:binfreewrap.exe", "rac_gui.tcl"]))
# Π·Π°ΠΏΠ°ΠΊΡΠ΅ΠΌ ΡΠΎ, ΡΡΠΎ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ
rac_gui_build_WIN.addStep(steps.ShellCommand(
command=["c:Program Files7-zip7z.exe", "a", "-r", util.Interpolate("..rac-gui_%(prop:version)s-%(prop:release)s.win.zip"), "..build"]))
# ΡΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ Π½Π° ΠΌΠ°ΡΡΠ΅Ρ
rac_gui_build_WIN.addStep(
steps.FileUpload(
workersrc=util.Interpolate("..rac-gui_%(prop:version)s-%(prop:release)s.win.zip"),
masterdest=util.Interpolate("/home/buildbot/builds/rac-gui_%(prop:version)s-%(prop:release)s.win.zip")
)
)
# Π‘ΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ ΡΠ°ΠΉΠ» Π½Π° Ρ
ΠΎΡΡΠΈΠ½Π³
rac_gui_build_WIN.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.win.zip"),
util.Interpolate("--remote-file=uploads/rac-gui/rac-gui_%(prop:version)s-%(prop:release)s.win.zip")]
)
)
c['builders'] = [
util.BuilderConfig(name="Rac-GUI-RPM-builder", workername='CentOS', factory=rac_gui_build_RPM),
util.BuilderConfig(name="Rac-GUI-DEB-builder", workername='Debian-10', factory=rac_gui_build_DEB),
util.BuilderConfig(name="Rac-GUI-WIN-builder", workername='Windows-10', factory=rac_gui_build_WIN),
]
c['services'] = []
template=u'''
<h4>Build status: {{ summary }}</h4>
<p> Worker used: {{ workername }}</p>
{% for step in build['steps'] %}
<p> {{ step['name'] }}: {{ step['result'] }}</p>
{% endfor %}
<p><b> -- The Buildbot</b></p>
'''
mailNotifier = reporters.MailNotifier(fromaddr="[email protected]",
sendToInterestedUsers=False,
mode=('all'),
extraRecipients=["[email protected]"],
relayhost="mail.domain.local",
smtpPort=587,
smtpUser="[email protected]",
smtpPassword="**********",
messageFormatter=reporters.MessageFormatter(
template=template, template_type='html',
wantProperties=True, wantSteps=True))
c['services'].append(mailNotifier)
c['title'] = "The process of bulding"
c['titleURL'] = "http://vm-srv-build1:80/"
c['buildbotURL'] = "http://vm-srv-build1/"
c['www'] = dict(port=80,
plugins=dict(waterfall_view={}, console_view={}, grid_view={}))
c['db'] = {
'db_url' : "sqlite:///state.sqlite"
}
ΠΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈ
ΠΡΠΈ ΠΈΠ·Π³ΠΎΡΠ²ΡΠ½Π΅ΡΠΎ Π½Π° ΡΡΠ°ΡΠΈΡΡΠ° ΡΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ΠΈ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΠΌΠ°ΡΠ΅ΡΠΈΠ°Π»ΠΈ:
ΠΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Ρ BuildBot Buildbot: ΠΈΡΡΠΎΡΠΈΡ Ρ ΠΏΡΠΈΠΌΠ΅ΡΠΈ Π·Π° Π΄ΡΡΠ³Π° ΡΠΈΡΡΠ΅ΠΌΠ° Π·Π° Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ ΠΠ°ΡΡΡΠΎΠΉΠ²Π°Π½Π΅ Π½Π° Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠ° ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡ Π² Buildbot Π½Π° Ubuntu 16.04 - Π, Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° Π½Π° ΠΏΡΠΎΠ΄ΡΠΊΡΠ°
Π£ΡΠΎΠΊ Π·Π° Buildbot
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com