උදාහරණ ලෙස Buildbot

Git ගබඩාවක සිට වෙබ් අඩවියට මෘදුකාංග පැකේජ එකලස් කිරීමේ සහ බෙදා හැරීමේ ක්‍රියාවලිය සැකසීමට මට අවශ්‍ය විය. තවද, බොහෝ කලකට පෙර, මෙහි Habré හි buildbot පිළිබඳ ලිපියක් (අවසානයේ සබැඳිය) දුටු විට, මම එය උත්සාහ කර එය යෙදීමට තීරණය කළෙමි.

බිල්ඩ්බෝට් යනු බෙදා හරින ලද පද්ධතියක් බැවින්, එක් එක් ගෘහ නිර්මාණ ශිල්පය සහ මෙහෙයුම් පද්ධතිය සඳහා වෙනම ගොඩනඟන සත්කාරකයක් නිර්මාණය කිරීම තාර්කික වනු ඇත. අපගේ නඩුවේදී, මේවා LXC බහාලුම් (ලිනක්ස් සම්බන්ධයෙන්) සහ qemu (වින්ඩෝස් සම්බන්ධයෙන්):

  • vm-srv-build1 - centos 7, buildbot master කෙනෙක් සහ සේවකයෙක් ඉන්නවා
  • vm-srv-build2 - debian 10, DEB පැකේජ තැනීම සඳහා
  • vm-srv-build3 - windows 10, එකලස් කිරීම සඳහා, කුමක් සඳහාදැයි ඔබ දන්නවා

අපි එකතු කරන්නෙමු Rac GUI - සේවාදායකයන් පොකුරක් කළමනාකරණය කිරීම සඳහා 1C rac සඳහා චිත්රක අතුරු මුහුණතක්. Linux සඳහා, එක් එක් OS සඳහා සම්මත මෙවලම් භාවිතා කරනු ඇත; tcl script එකකින් Windows සඳහා exe ගොනුවක් තැනීමට, භාවිතා කරන්න freewrap.

ස්ථාපනය

GNU / Linux

ස්ථාපනය සඳහා අන්තර්ජාලයේ ප්රමාණවත් ලියකියවිලි තිබේ 1,2. ඔව්, එය විශේෂ ගැටළු ඇති නොකරයි:
ස්වාමියා සඳහා:

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

ඇත්ත වශයෙන්ම, එක් එක් OS සඳහා පැකේජ එකතු කිරීම වඩාත් නිවැරදි වනු ඇත, නමුත් මෙය ලිපියේ විෂය පථයෙන් ඔබ්බට ය. වැඩ සඳහා බහාලුම් සැකසීමේ විස්තරය ද අපි මග හරිනු ඇත, මම ProxMox VE භාවිතා කරන බව පමණක් සටහන් කරමි. තවද ඔබට එකලස් කිරීම සඳහා අවශ්‍ය එක් එක් අක්ෂය සඳහා පැකේජ ස්ථාපනය කිරීමට අවශ්‍ය වනු ඇත (centos: rpmdevtools, etc.; debian: build-essential, dh-make, pbuilder, etc.)

Build Projects සහ 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 වින්ඩෝස්

වින්ඩෝස් යටතේ එකලස් කිරීම සඳහා "කම්කරුවෙකු" ලෙස, Win10 හි නවතම නිකුතුව සහිත අථත්ය යන්ත්රයක් භාවිතා කරනු ඇත.
වැඩ කිරීමට ඔබට අවශ්ය වනු ඇත:

ඉහත සියල්ල ස්ථාපනය කිරීමෙන් පසු, ඔබට buildbot ම ස්ථාපනය කළ හැකිය:

pip install buildbot-worker

අපි වැඩ කරන නාමාවලියක් නිර්මාණය කරමු

md c:worker

සහ අපි දියත් කරමු

buildbot-worker start c:worker

සෑම දෙයක්ම ක්‍රියාත්මක වන්නේ නම් (ලොග් c:workertwistd.log බලන්න), එවිට ඔබට අපගේ “වැඩකරු” සේවාවක් ලෙස ලියාපදිංචි කළ හැක්කේ වැඩ කරන නාමාවලිය සමඟ අයිතමයක් රෙජිස්ට්‍රියට එක් කිරීමෙන් (විධාන ක්‍රියාත්මක වන්නේ පවර්ෂෙල් පරිපාලක ලෙස ක්‍රියාත්මක වන විටය):

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

/home/buildbot/master/ බහලුම තුළ master.cfg ගොනුවක් සාදන ලදී. මෙම ගොනුව පයිතන් කේතයක් වන අතර පද්ධතියේ සියලුම යාන්ත්‍රණ පිළිබඳ විස්තරයක් අඩංගු වේ; අපි අනාගතයේදී එය සමඟ වැඩ කරන්නෙමු.

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 ඇමතුම භාවිතා කරන්න. බිල්ඩ්බොට් හි ඔබට "කම්කරුවන්" සඳහා විචල්‍යයන් නිර්වචනය කළ නොහැක (අවම වශයෙන්, කෙසේදැයි මම සොයාගෙන නැත). දේපල භාවිතා කරන්නේ මෙයයි. එම. එකලස් කිරීමේ ක්‍රියාවලියේදී, අපි අනුවාදය සහ මුදා හැරීම තීරණය කිරීමට පියවර එකතු කරන අතර, ඒ අනුව, අනුවාදය සහ මුදා හැරීමේ ගුණාංග සකසන්න. මෙම අවස්ථාවේදී කොන්සෝල විධානය ඇමතීමෙන් ගුණාංග විවිධ ආකාරවලින් සැකසිය හැක:

# Добавим определение версии из основного файла
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 ඇමතුමක් භාවිතා කරන්න, i.e. විධානය මඟින් පිරිවිතර ගොනුව තුළ ඇති අගයන් අවශ්‍ය ඒවා සමඟ ප්‍රතිස්ථාපනය කරයි

# меняем версию
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 හරහා සත්කාරකයට පිටපත් කිරීමේ ක්‍රියාවලිය ආරම්භ කරමු. මෙම කාර්යය සඳහා එය භාවිතා වේ පිටපත tcl මත.

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

Windows හි grep සහ sed සම්මත නොවන බැවින් (නැතහොත් තිබේද?), අපි 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

මෙය සැකසුම් ක්‍රියාවලිය සම්පූර්ණ කරයි. ඔබට වෙබ් අතුරු මුහුණත හරහා වත්මන් තත්ත්වය නැරඹිය හැක. ඔබට ගොඩනැගීමේ දෝෂ ද දැකිය හැකි තැන, යමක් වැරදී ඇත්නම්, ශීත කළ ක්‍රියාවලියකට පයින් ගැසීම යනාදිය.

දියත් කළ විගසම, අපගේ වෙහෙස මහන්සි වී වැඩ කරන්නන් “බිල්ඩ්ස්” -> “කම්කරුවන්” මෙනුව හරහා නැරඹිය හැකිය.

උදාහරණ ලෙස Buildbot

පළමු ගොඩනැගීමේ ක්‍රියාවලිය අවසන් වූ පසු (එනම් Git ගබඩාවේ වෙනස්කම්), ක්‍රියාවලි වල තත්ත්වය පළමු පිටුවේ දිස්වනු ඇත.

උදාහරණ ලෙස Buildbot

ඔබ මූසිකය සමඟ අපේක්ෂිත රේඛාව මත ක්ලික් කළහොත්, මෙම ක්‍රියාවලියේ වත්මන් තත්වය සමඟ පිටුවක් විවෘත වනු ඇත, එහිදී ඔබට සිදුවන්නේ කුමක්ද, කුමන දෝෂ ආදියද දැකිය හැකිය.

උදාහරණ ලෙස Buildbot

සම්පූර්ණ විශාරද වින්‍යාසය මෙහි සොයාගත හැකිය

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"
}

ද්රව්ය

ලිපිය සකස් කිරීමේදී පහත සඳහන් ද්‍රව්‍ය භාවිතා කරන ලදී:

මූලාශ්රය: www.habr.com

අදහස් එක් කරන්න