{"id":293664,"date":"2019-08-21T09:00:57","date_gmt":"2019-08-21T09:00:57","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=293664"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=293664","title":{"rendered":"Buildbot \u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u0445"},"content":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\">\n<p>\u041f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043c\u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430 \u0441\u0430\u0439\u0442 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0438\u0437 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u044f. \u0418 \u0443\u0432\u0438\u0434\u0435\u0432, \u043d\u0438 \u0442\u0430\u043a \u0434\u0430\u0432\u043d\u043e, \u0442\u0443\u0442 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0441\u0442\u0430\u0442\u044c\u044e \u043f\u043e buildbot (\u0441\u0441\u044b\u043b\u043a\u0430 \u0432 \u043a\u043e\u043d\u0446\u0435) \u0440\u0435\u0448\u0438\u043b \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a buildbot \u2014 \u044d\u0442\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043a\u0443 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0439 \u0445\u043e\u0441\u0442. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0443\u0442 LXC-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b (\u0432 \u0441\u043b\u0443\u0447\u0430\u0435 linux) \u0438 qemu (\u0432 \u0441\u043b\u0443\u0447\u0430\u0435 windows):<\/p>\n<p>  <\/p>\n<ul>\n<li>vm-srv-build1 \u2014 centos 7, \u0442\u0443\u0442 \u0431\u0443\u0434\u0435\u0442 buildbot \u043c\u0430\u0441\u0442\u0435\u0440 (master) \u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 (worker)<\/li>\n<li>vm-srv-build2 \u2014 debian 10, \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 DEB \u043f\u0430\u043a\u0435\u0442\u043e\u0432<\/li>\n<li>vm-srv-build3 \u2014 windows 10, \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438, \u0441\u0430\u043c\u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435, \u043f\u043e\u0434 \u0447\u0442\u043e<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c <a href=\"https:\/\/habr.com\/ru\/post\/415835\/\">Rac GUI<\/a> \u2014 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043c\u043e\u0440\u0434\u0430 \u043a 1\u0421 rac \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u041f\u043e\u0434 \u043b\u0438\u043d\u0443\u043a\u0441 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0448\u0442\u0430\u0442\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u0443\u044e \u041e\u0421, \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 exe-\u0444\u0430\u0439\u043b\u0430 \u043f\u043e\u0434 windows \u0438\u0437 tcl-\u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"http:\/\/freewrap.sourceforge.net\">freewrap<\/a>.<\/p>\n<p><a name=\"habracut\"><\/a>  <\/p>\n<h3 id=\"ustanovka\">\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430<\/h3>\n<p>  <\/p>\n<h4 id=\"gnulinux\">GNU\/Linux<\/h4>\n<p>  <\/p>\n<p>\u041f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435, \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0432 \u0441\u0435\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e <a href=\"https:\/\/habr.com\/ru\/post\/460501\/\">1<\/a>,<a href=\"https:\/\/www.8host.com\/blog\/nastrojka-nepreryvnoj-integracii-v-buildbot-v-ubuntu-16-04\">2<\/a>. \u0414\u0430 \u0438 \u043e\u0441\u043e\u0431\u044b\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c \u043e\u043d\u0430 \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442:<br \/>  \u0414\u043b\u044f \u043c\u0430\u0441\u0442\u0435\u0440\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">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<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f &#171;\u0440\u0430\u0431\u043e\u0447\u0438\u0445&#187;, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e\u0433\u043e \u044d\u0442\u043e\u0433\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">pip3 install buildbot-worker<\/code><\/pre>\n<p>  <\/p>\n<p>\u041a\u043e\u043d\u0435\u0447\u043d\u043e, \u0431\u043e\u043b\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u043c \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u0443\u044e \u041e\u0421, \u043d\u043e \u044d\u0442\u043e \u0432 \u0440\u0430\u043c\u043a\u0438 \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0435 \u0432\u0445\u043e\u0434\u0438\u0442. \u0422\u0430\u043a\u0436\u0435 \u043e\u043f\u0443\u0441\u0442\u0438\u043c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b, \u043e\u0442\u043c\u0435\u0447\u0443 \u0442\u043e\u043b\u044c\u043a\u043e, \u0447\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e ProxMox VE. \u0418 \u0435\u0449\u0451 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u0443\u044e \u043e\u0441\u044c \u043f\u043e\u0442\u0440\u0435\u0431\u043d\u044b\u0435 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 (centos: rpmdevtools \u0438 \u0442.\u0434; debian: build-essential, dh-make, pbuilder \u0438 \u0442.\u0434.)<\/p>\n<p>  <\/p>\n<p>\u0421\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u044b buildbot \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043e\u0442 \u0438\u043c\u0435\u043d\u0438 \u043d\u0435\u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u0430 \u0432\u0441\u0435\u0445 \u0445\u043e\u0441\u0442\u0430\u0445, \u0443\u0447\u0430\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\"> adduser buildbot<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0437\u0430\u043f\u0443\u0441\u043a \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437 \u0445\u043e\u0441\u0442\u043e\u0432 (\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432):<\/p>\n<p>  <\/p>\n<p>Systemd \u044e\u043d\u0438\u0442 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u0430\u0441\u0442\u0435\u0440\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">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<\/code><\/pre>\n<p>  <\/p>\n<p>\u0438 &#171;\u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e&#187;<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">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<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0432\u0441\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b (\u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435) \u043b\u0435\u0436\u0430\u0442 \u0432 \/usr\/local\/, \u0442\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u043e\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0443\u0442\u044c \u043a \u043d\u0438\u043c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">nano \/root\/.bash_profile  PATH=$PATH:$HOME\/.local\/bin:$HOME\/bin:\/usr\/local\/bin<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e, \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u0432 \u0434\u043b\u044f &#171;\u0440\u0430\u0431\u043e\u0447\u0438\u0445&#187; (\u043d\u0430 \u0432\u0441\u0435\u0445 \u0445\u043e\u0441\u0442\u0430\u0445), \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c buildbot \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<p>  <\/p>\n<p>\u041d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0445\u043e\u0441\u0442\u0435 vm-srv-build1:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">su - buildbot mkdir \/home\/buildbot\/worker cd ~ buildbot-worker create-worker --umask=0o22 --keepalive=60 worker vm-srv-build1:4000 CentOS 123456<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c \u0445\u043e\u0441\u0442\u0435 vm-srv-build2:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">su - buildbot mkdir \/home\/buildbot\/worker cd ~ buildbot-worker create-worker --umask=0o22 --keepalive=60 worker vm-srv-build1:4000 Debian-10 123456<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430 \u0445\u043e\u0441\u0442\u0430\u0445-\u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u0441\u043b\u0443\u0436\u0431\u0443 buildbot-worker \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">systemctl start buildbot-worker<\/code><\/pre>\n<p>  <\/p>\n<h4 id=\"ms-windows\">MS Windows<\/h4>\n<p>  <\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 &#171;\u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e&#187; \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u043e\u0434 windows, \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u0441 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u043c \u0440\u0435\u043b\u0438\u0437\u043e\u043c Win10.<br \/>  \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/www.python.org\/downloads\/windows\/\"> Python<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/mhammond\/pywin32\/releases\">PyWIN<\/a><\/li>\n<li><a href=\"https:\/\/git-scm.com\/download\/win\">Git<\/a><\/li>\n<li>\u0414\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0432\u0441\u044f\u043a\u043e\u0433\u043e-\u0440\u0430\u0437\u043d\u043e\u0433\u043e \u0432 \u043f\u0438\u0442\u043e\u043d\u0435 \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u0441\u043a\u0430\u0447\u0430\u0442\u044c <a href=\"https:\/\/visualstudio.microsoft.com\/downloads\/\">Build Tools for Visual Studio 2019<\/a><\/li>\n<li>7Zip<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u0441\u044f \u0432\u0441\u0451 \u0432\u044b\u0448\u0435\u043f\u0435\u0440\u0435\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u043e\u0435, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438 \u0441\u0430\u043c buildbot:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">pip install buildbot-worker<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043a\u0430\u0442\u0430\u043b\u043e\u0433<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">md c:\\worker<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">buildbot-worker start c:\\worker<\/code><\/pre>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 (\u0441\u043c. \u043b\u043e\u0433 c:\\worker\\twistd.log), \u0442\u043e \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u0448\u0435\u0433\u043e &#171;\u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e&#187;, \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u0430\u043a \u0441\u043b\u0443\u0436\u0431\u0443, \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0432 \u0440\u0435\u0435\u0441\u0442\u0440 \u043f\u0443\u043d\u043a\u0442 \u0441 \u0440\u0430\u0431\u043e\u0447\u0438\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u043c (\u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 powershell \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u043c \u043e\u0442 \u0438\u043c\u0435\u043d\u0438 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430):<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">buildbot_worker_windows_service.exe --user VM-SRV-BUILD3\\buildbot --password 123456 --startup auto install New-ItemProperty -path Registry::HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\services\\BuildBot\\Parameters -Name directories -PropertyType String -Value c:\\worker <\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0441\u043b\u0443\u0431\u0436\u0443<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">Start-Service buildbot<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421 &#171;\u0440\u0430\u0431\u043e\u0447\u0438\u043c\u0438&#187; \u043d\u0430 \u044d\u0442\u043e\u043c \u0432\u0441\u0451, \u0434\u0430\u043b\u044c\u0448\u0435 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0442\u0440\u043e\u0433\u0430\u0442\u044c, \u0432\u0441\u0451 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0438\u0434\u0451\u0442 \u0441 \u043c\u0430\u0441\u0442\u0435\u0440\u0430.<\/p>\n<p>  <\/p>\n<h3 id=\"nastroyka-mastera\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043c\u0430\u0441\u0442\u0435\u0440\u0430<\/h3>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430, \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u043b\u044f \u043c\u0430\u0441\u0442\u0435\u0440\u0430 (\u043d\u0430 \u0433\u043b\u0430\u0432\u043d\u043e\u043c \u0445\u043e\u0441\u0442\u0435), \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c buildbot \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">su - buildbot mkdir \/home\/buildbot\/master cd ~ buildbot create-master master<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433 builds<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">mkdir \/home\/buildbot\/builds<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u0435 \/home\/buildbot\/master\/ \u0431\u044b\u043b \u0441\u043e\u0437\u0434\u0430\u043d \u0444\u0430\u0439\u043b master.cfg. \u0414\u0430\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043a\u043e\u0434 \u043d\u0430 python \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0432\u0441\u0435\u0445 \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0441 \u043d\u0438\u043c \u0438 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c.<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">nano \/home\/buildbot\/master\/master.cfg<\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"python\">import os, re from buildbot.plugins import steps, util, schedulers, worker, changes, reporters  c= BuildmasterConfig ={}  # \u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043d\u0430\u0448\u0438\u0445 \u0440\u0430\u0431\u043e\u0447\u0438\u0445. c['workers'] = [ worker.Worker('CentOS', '123456'), worker.Worker('Debian-10', '123456'), worker.Worker('Windows-10', '123456')] c['protocols'] = {'pb': {'port': 4000}}   # \u0423\u043a\u0430\u0437\u0430\u043d\u0438\u0435 \u043c\u0430\u0441\u0442\u0435\u0440\u0443 \u043a\u0430\u043a\u043e\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c c['change_source'] = [] c['change_source'].append(changes.GitPoller(        repourl = 'https:\/\/bitbucket.org\/svk28\/rac-gui.git',        project = 'Rac-GUI',        branches = True,        pollInterval = 60       ) )  # \u0441\u043b\u0443\u0436\u0431\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 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 # \u0421\u0431\u043e\u0440\u043a\u0430 RPM-\u043f\u0430\u043a\u0435\u0442\u0430  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) )<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0432\u0435\u0440\u0441\u0438\u0439, \u0434\u0430\u0431\u044b \u043d\u0435 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u043e\u043e\u0441\u044c \u043b\u0430\u0437\u0438\u0442\u044c \u0432 \u043a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 master.cfg, \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0441\u043a\u0440\u0438\u043f\u0442\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b rac_gui.tcl \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435, \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0441\u0442\u0440\u043e\u043a\u0438 \u0441 \u0442\u0435\u043a\u0443\u0449\u0438\u043c\u0438 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u0438 \u0440\u0435\u043b\u0438\u0437\u043e\u043c:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">###################################################### #        Rac GUI ... # version: 1.0.3 # release: 1<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u044d\u0442\u0438\u0445 \u0441\u0442\u0440\u043e\u043a buildbot \u0431\u0443\u0434\u0435\u0442 \u043d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0430\u043a\u0435\u0442\u044b. \u0414\u043b\u044f \u0432\u044b\u0434\u0451\u0440\u0433\u0438\u0432\u0430\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0433\u043e grep. \u0412 buildbot \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a \u043d\u0435\u043b\u044c\u0437\u044f \u043e\u043f\u0435\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f &#171;\u0440\u0430\u0431\u043e\u0447\u0438\u0445&#187; (\u0432\u043e \u0432\u0441\u044f\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u044f \u043d\u0435 \u043d\u0430\u0448\u0451\u043b \u043a\u0430\u043a). \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0443\u0436\u0430\u0442 \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 (property). \u0422.\u0435. \u0432 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u043c \u0448\u0430\u0433\u0438 \u043f\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044e \u0432\u0435\u0440\u0441\u0438\u0438 \u0438 \u0440\u0435\u043b\u0438\u0437\u0430 \u0438 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0432\u0435\u043d\u043d\u043e, \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u0430 version \u0438 release. \u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\"># \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 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\"        ) ) # \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u043b\u0438\u0437\u0430 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 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\"        ) )<\/code><\/pre>\n<p>  <\/p>\n<p>\u041f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u043f\u0443\u0442\u0451\u043c \u0432\u044b\u0437\u043e\u0432\u0430 util.Interpolate().<\/p>\n<p>  <\/p>\n<pre><code class=\"python\"># \u0417\u0430\u043f\u0430\u043a\u0443\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 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\"]        ) )<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0443\u0442 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c \u0447\u0442\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0445\u043e\u0441\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0438 \u0434\u043b\u044f \u0440\u0443\u0447\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0442\u043e \u0441\u0431\u043e\u0440\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442\u044c \u043f\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u043c \u043f\u0443\u0442\u044f\u043c.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\"># \u041a\u043e\u043f\u0438\u0440\u0443\u0435\u043c spec rac_gui_build_RPM.addStep(steps.ShellCommand(        command=[\"cp\", \"..\/rac-gui\/rac_gui.spec\", \"\/home\/buildbot\/rpmbuild\/SPECS\/rac_gui.spec\"]))<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0445 \u043d\u043e\u043c\u0435\u0440\u043e\u0432 \u0440\u0435\u043b\u0438\u0437\u0430 \u0438 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u043d\u043e\u0433\u043e sed, \u0442.\u0435. \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0437\u0430\u043c\u0435\u043d\u044f\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 spec-\u0444\u0430\u0439\u043b\u0430 \u043d\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435<\/p>\n<p>  <\/p>\n<pre><code class=\"python\"># \u043c\u0435\u043d\u044f\u0435\u043c \u0432\u0435\u0440\u0441\u0438\u044e 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\"])) # \u043c\u0435\u043d\u044f\u0435\u043c \u0440\u0435\u043b\u0438\u0437 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\"]))  # \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u043a\u0438 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'       ) )<\/code><\/pre>\n<p>  <\/p>\n<p>\u0413\u043e\u0442\u043e\u0432\u044b\u0439 \u0441\u043e\u0431\u0440\u0430\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442 \u0438 \u0430\u0440\u0445\u0438\u0432 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0430\u043c\u0438 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440. \u041d\u043e \u043c\u043e\u0436\u043d\u043e \u0438 \u0441\u0440\u0430\u0437\u0443 \u0441 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u044b \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0432\u043e\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438\u043b\u0438 \u043d\u0430 \u0441\u0430\u0439\u0442.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\"># \u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440 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\")        ) )<\/code><\/pre>\n<p>  <\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u043c \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043d\u0430 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u043f\u043e \u0444\u0442\u043f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"https:\/\/nuk-svk.ru\/files\/deploy-ftp.tcl.gz\">\u0441\u043a\u0440\u0438\u043f\u0442<\/a> \u043d\u0430 tcl.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">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\")]         ) )<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u0441 RPM \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0438. \u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u0441\u0442\u0443\u043f\u0438\u043c \u043a \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e \u0430\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 DEB-\u043f\u0430\u043a\u0435\u0442\u0430. \u0422\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043f\u043e\u0434 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430, \u0442\u043e \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0448\u0430\u0433\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0442\u0441\u044f.<\/p>\n<p>  <\/p>\n<pre><code class=\"python\"> 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) )  # \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 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\"        ) )  # \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u043b\u0438\u0437\u0430 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 rac_gui_build_DEB.addStep(        steps.SetPropertyFromCommand(        command=\"grep release rac_gui.tcl | grep -oE '\\\\b[0-9]{1,3}\\\\b'\", property=\"release\"        ) )  # \u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u0443\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b     rac_gui_build_DEB.addStep(steps.ShellCommand(        command=[\"mv\", \"rac_gui.tcl\", \"racgui\"]))<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f RPM-\u043f\u0430\u043a\u0435\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u043d\u0438\u0436\u0435\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0441\u0430\u043c\u0438\u043c rpm \u043f\u0440\u0438 \u0441\u0431\u043e\u0440\u043a\u0435 \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u044b \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u043f\u0435\u043a\u0430, \u0434\u043b\u044f \u0434\u0435\u0431\u0438\u0430\u043d\u0430 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u0443\u0442:<\/p>\n<p>  <\/p>\n<pre><code class=\"python\"># \u041f\u043e\u043c\u0435\u043d\u044f\u0435\u043c \u043f\u0443\u0442\u0438 \u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c rac_gui_build_DEB.addStep(steps.ShellCommand(        command=[\"sed\", \"-i\", \"s+^set\\ dir(lib)+set\\ dir(lib)\\ \/usr\/share\/rac-gui\/lib ;#+g\", \"racgui\"]))  # \u041f\u043e\u043c\u0435\u043d\u044f\u0435\u043c \u043f\u0443\u0442\u0438 \u043a \u0444\u0430\u0439\u043b\u0430\u043c rac_gui_build_DEB.addStep(steps.ShellCommand(        command=[\"sed\", \"-i\", \"s+\\[pwd\\]+\/usr\/share\/rac-gui+g\", \"racgui\"]))  # \u0437\u0430\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 rac_gui_build_DEB.addStep(steps.ShellCommand(        command=[\"tar\", \"czf\", util.Interpolate(\"..\/rac-gui_%(prop:version)s.orig.tar.gz\"), \".\"]))  # \u0421\u043e\u0431\u0435\u0440\u0451\u043c \u043f\u0430\u043a\u0435\u0442 rac_gui_build_DEB.addStep(steps.ShellCommand(        command=[\"dpkg-buildpackage\"]))  # \u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440 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\")]         ) )<\/code><\/pre>\n<p>  <\/p>\n<p>\u0418 \u0441 DEB \u043f\u043e\u043a\u043e\u043d\u0447\u0435\u043d\u043e, \u0442\u0435\u043f\u0435\u0440\u044c windows!<\/p>\n<p>  <\/p>\n<pre><code class=\"python\">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) )<\/code><\/pre>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u0432 windows \u0448\u0442\u0430\u0442\u043d\u043e \u043d\u0435\u0442 grep \u0438 sed (\u0438\u043b\u0438 \u0435\u0441\u0442\u044c?) \u0442\u043e \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c powershell<\/p>\n<p>  <\/p>\n<pre><code class=\"python\"># \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 rac_gui_build_WIN.addStep(        steps.SetPropertyFromCommand(        command=\"powershell -command \\\"((Get-Content .\\\\rac_gui.tcl | Select-String -Pattern 'version:') -split '\\\\s')[2]\",        property=\"version\"        )     )  # \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u043b\u0438\u0437\u0430 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 rac_gui_build_WIN.addStep(        steps.SetPropertyFromCommand(        command=\"powershell -command \\\"((Get-Content .\\\\rac_gui.tcl | Select-String -Pattern 'release:') -split '\\\\s')[2]\",        property=\"release\"        ) )  # \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b rac_gui_build_WIN.addStep(steps.ShellCommand(        command=[\"c:\\\\bin\\\\freewrap.exe\", \"rac_gui.tcl\"]))  # \u0437\u0430\u043f\u0430\u043a\u0443\u0435\u043c \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c rac_gui_build_WIN.addStep(steps.ShellCommand(        command=[\"c:\\\\Program Files\\\\7-zip\\\\7z.exe\", \"a\", \"-r\", util.Interpolate(\"..\\\\rac-gui_%(prop:version)s-%(prop:release)s.win.zip\"), \"..\\\\build\"]))  # \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440 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\")        ) ) # \u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b \u043d\u0430 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 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\")]        ) )  # \u0422\u0443\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c \u043a\u0430\u043a\u0438\u0435 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0438 \u0443 \u043d\u0430\u0441 \u0435\u0441\u0442\u044c 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), ]<\/code><\/pre>\n<p>  <\/p>\n<p>\u0414\u043b\u044f \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u044f \u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u044d\u043b\u0435\u043a\u0442\u0440\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043f\u043e\u0447\u0442\u0443<\/p>\n<p>  <\/p>\n<pre><code class=\"python\"> c['services'] = []  template=u'''\\     &lt;h4&gt;Build status: {{ summary }}&lt;\/h4&gt;     &lt;p&gt; Worker used: {{ workername }}&lt;\/p&gt;     {% for step in build['steps'] %}     &lt;p&gt; {{ step['name'] }}: {{ step['result'] }}&lt;\/p&gt;     {% endfor %}     &lt;p&gt;&lt;b&gt; -- The Buildbot&lt;\/b&gt;&lt;\/p&gt;     '''  mailNotifier = reporters.MailNotifier(fromaddr=\"builder@domain.ru\",              sendToInterestedUsers=False,              mode=('all'),              extraRecipients=[\"admin@domain.ru\"],              relayhost=\"mail.domain.ru\",              smtpPort=587,              smtpUser=\"builder@domain.ru\",              smtpPassword=\"******\",              messageFormatter=reporters.MessageFormatter(                                  template=template, template_type='html',                                  wantProperties=True, wantSteps=True))  c['services'].append(mailNotifier)  # \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043c\u0430\u0441\u0442\u0435\u0440\u0430 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\" }<\/code><\/pre>\n<p>  <\/p>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0444\u0430\u0439\u043b \u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043b\u0443\u0436\u0431\u0443 \u043c\u0430\u0441\u0442\u0435\u0440\u0430:<\/p>\n<p>  <\/p>\n<pre><code class=\"bash\">systemctl restart buildbot-master<\/code><\/pre>\n<p>  <\/p>\n<p>\u0412 \u043b\u043e\u0433\u0435 \u043f\u0440\u043e\u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u043c \u0447\u0442\u043e \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u043e\u043c \u0432\u0441\u0435 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435 \u0438 \u0432\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u0448\u0442\u0430\u0442\u043d\u043e\u043c \u0440\u0435\u0436\u0438\u043c\u0435. \u0412\u0441\u0435 \u043d\u0430\u0448\u0438 \u0440\u0430\u0431\u043e\u0442\u043d\u0438\u043a\u0438 \u0434\u043e\u043b\u0436\u043d\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f, \u043e \u0447\u0435\u043c \u0432 \u043b\u043e\u0433\u0435 &#187;&#187;&#8217;\/home\/buildbot\/master\/twistd.log&#187;&#187;&#8217; \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0434\u043e\u0441\u0442\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u043e:<\/p>\n<p>  <\/p>\n<pre><code class=\"plaintext\"> 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 &lt;buildbot.www.service.BuildbotSite object at 0x7fe31c2657b8&gt;  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 &lt;twisted.spread.pb.PBServerFactory object at 0x7fe31c147470&gt;  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<\/code><\/pre>\n<p>  <\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d. \u041f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0442\u0435\u043a\u0443\u0449\u0435\u0435 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0432\u044d\u0431-\u043c\u043e\u0440\u0434e. \u0413\u0434\u0435 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0438 \u0441\u0431\u043e\u0440\u043a\u0438, \u043f\u043d\u0443\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0448\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0435\u0441\u043b\u0438 \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0438 \u0442\u0430\u043a \u0438 \u0442.\u0434.<\/p>\n<p>  <\/p>\n<p>\u0421\u0440\u0430\u0437\u0443 \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0430\u0448\u0438\u0445 \u0440\u0430\u0431\u043e\u0442\u044f\u0433 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043c\u0435\u043d\u044e &#171;Builds&#187; -&gt; &#171;Workers&#187;<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/425\/92a\/182\/42592a182ecbe305bea2bff87c28755e.png\" alt=\"image\"><\/p>\n<p>  <\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u043a\u0438 (\u0442.\u0435. \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u0438), \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0435 \u043f\u043e\u044f\u0432\u0438\u0442\u0441\u044f \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/614\/d81\/2a1\/614d812a145d9f25d7267d71de13c678.png\" alt=\"image\"><\/p>\n<p>  <\/p>\n<p>\u0415\u0441\u043b\u0438 \u0442\u043a\u043d\u0443\u0442\u044c \u043c\u044b\u0448\u043e\u0439 \u0432 \u043d\u0443\u0436\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0442\u043e \u043e\u0442\u043a\u0440\u043e\u0435\u0442\u0441\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0430 \u0441 \u0442\u0435\u043a\u0443\u0449\u0438\u043c \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435\u043c \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430, \u0433\u0434\u0435 \u0432\u0438\u0434\u043d\u043e \u0447\u0442\u043e \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442, \u043a\u0430\u043a\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u0442.\u0434.<\/p>\n<p>  <\/p>\n<p><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/getpro\/habr\/post_images\/aeb\/945\/d73\/aeb945d73a63cb5b3ead878ebf6fe774.png\" alt=\"image\"><\/p>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0426\u0435\u043b\u0438\u043a\u043e\u043c \u043a\u043e\u043d\u0444\u0438\u0433 \u043c\u0430\u0441\u0442\u0435\u0440\u0430 \u043c\u043e\u0436\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0442\u0443\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">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     ))  # \u0441\u043b\u0443\u0436\u0431\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 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)     )  # \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 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\"     ) )  # \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u043b\u0438\u0437\u0430 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 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'     ))  # \u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440 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)     )  # \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 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\"     ) )  # \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u043b\u0438\u0437\u0430 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 rac_gui_build_DEB.addStep(     steps.SetPropertyFromCommand(     command=\"grep release rac_gui.tcl | grep -oE '\\\\b[0-9]{1,3}\\\\b'\", property=\"release\"     ) )  # \u041f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u0443\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b rac_gui_build_DEB.addStep(steps.ShellCommand(     command=[\"mv\", \"rac_gui.tcl\", \"racgui\"]))  # \u041f\u043e\u043c\u0435\u043d\u044f\u0435\u043c \u043f\u0443\u0442\u0438 \u043a \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430\u043c rac_gui_build_DEB.addStep(steps.ShellCommand(     command=[\"sed\", \"-i\", \"s+^set\\ dir(lib)+set\\ dir(lib)\\ \/usr\/share\/rac-gui\/lib ;#+g\", \"racgui\"]))  # \u041f\u043e\u043c\u0435\u043d\u044f\u0435\u043c \u043f\u0443\u0442\u0438 \u043a \u0444\u0430\u0439\u043b\u0430\u043c rac_gui_build_DEB.addStep(steps.ShellCommand(     command=[\"sed\", \"-i\", \"s+\\[pwd\\]+\/usr\/share\/rac-gui+g\", \"racgui\"]))  # \u0437\u0430\u0430\u0440\u0445\u0438\u0432\u0438\u0440\u0443\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 rac_gui_build_DEB.addStep(steps.ShellCommand(     command=[\"tar\", \"czf\", util.Interpolate(\"..\/rac-gui_%(prop:version)s.orig.tar.gz\"), \".\"]))  # \u0421\u043e\u0431\u0435\u0440\u0451\u043c \u043f\u0430\u043a\u0435\u0442 rac_gui_build_DEB.addStep(steps.ShellCommand(     command=[\"dpkg-buildpackage\"]))  # \u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440 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)     )  # \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 rac_gui_build_WIN.addStep(     steps.SetPropertyFromCommand(     command=\"powershell -command \\\"((Get-Content .\\\\rac_gui.tcl | Select-String -Pattern 'version:') -split '\\\\s')[2]\",     property=\"version\"     ) )  # \u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u043b\u0438\u0437\u0430 \u0438\u0437 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 rac_gui_build_WIN.addStep(     steps.SetPropertyFromCommand(     command=\"powershell -command \\\"((Get-Content .\\\\rac_gui.tcl | Select-String -Pattern 'release:') -split '\\\\s')[2]\",     property=\"release\"     ) )  # \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b rac_gui_build_WIN.addStep(steps.ShellCommand(     command=[\"c:\\\\bin\\\\freewrap.exe\", \"rac_gui.tcl\"]))  # \u0437\u0430\u043f\u0430\u043a\u0443\u0435\u043c \u0442\u043e, \u0447\u0442\u043e \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c rac_gui_build_WIN.addStep(steps.ShellCommand(     command=[\"c:\\\\Program Files\\\\7-zip\\\\7z.exe\", \"a\", \"-r\", util.Interpolate(\"..\\\\rac-gui_%(prop:version)s-%(prop:release)s.win.zip\"), \"..\\\\build\"]))  # \u0441\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u043d\u0430 \u043c\u0430\u0441\u0442\u0435\u0440 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\")     ) )  # \u0421\u043a\u043e\u043f\u0438\u0440\u0443\u0435\u043c \u0444\u0430\u0439\u043b \u043d\u0430 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 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'''\\ &lt;h4&gt;Build status: {{ summary }}&lt;\/h4&gt; &lt;p&gt; Worker used: {{ workername }}&lt;\/p&gt; {% for step in build['steps'] %} &lt;p&gt; {{ step['name'] }}: {{ step['result'] }}&lt;\/p&gt; {% endfor %} &lt;p&gt;&lt;b&gt; -- The Buildbot&lt;\/b&gt;&lt;\/p&gt; '''  mailNotifier = reporters.MailNotifier(fromaddr=\"112@icvibor.ru\",           sendToInterestedUsers=False,           mode=('all'),           extraRecipients=[\"my@domain.local\"],           relayhost=\"mail.domain.local\",           smtpPort=587,           smtpUser=\"buildbot@domain.local\",           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\" }<\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<h3 id=\"materialy\">\u041c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b<\/h3>\n<p>  <\/p>\n<p>\u041f\u0440\u0438 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b:<\/p>\n<p>  <\/p>\n<ul>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/460501\/\">\u041f\u0440\u0438\u043c\u0435\u0440 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 Continuous Integration \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e BuildBot<\/a><\/li>\n<li><a href=\"https:\/\/habr.com\/ru\/post\/439096\/\">Buildbot: \u0441\u043a\u0430\u0437 \u0441 \u043f\u0440\u0438\u043c\u0435\u0440\u0430\u043c\u0438 \u0435\u0449\u0435 \u043e\u0431 \u043e\u0434\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438<\/a><\/li>\n<li><a href=\"https:\/\/www.8host.com\/blog\/nastrojka-nepreryvnoj-integracii-v-buildbot-v-ubuntu-16-04\">\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0432 Buildbot \u0432 Ubuntu 16.04<\/a><\/li>\n<li>\u041d\u0443 \u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u043f\u043e \u043f\u0440\u043e\u0434\u0443\u043a\u0442\u0443 <a href=\"http:\/\/docs.buildbot.net\/current\/tutorial\/index.html\">Buildbot Tutorial<\/a><\/li>\n<\/ul>\n<\/div>\n<p>               <script class=\"js-mediator-script\">!function(e){function t(t,n){if(!(n in e)){for(var r,a=e.document,i=a.scripts,o=i.length;o--;)if(-1!==i[o].src.indexOf(t)){r=i[o];break}if(!r){r=a.createElement(\"script\"),r.type=\"text\/javascript\",r.async=!0,r.defer=!0,r.src=t,r.charset=\"UTF-8\";var d=function(){var e=a.getElementsByTagName(\"script\")[0];e.parentNode.insertBefore(r,e)};\"[object Opera]\"==e.opera?a.addEventListener?a.addEventListener(\"DOMContentLoaded\",d,!1):e.attachEvent(\"onload\",d):d()}}}t(\"\/\/mediator.mail.ru\/script\/2820404\/\",\"_mediator\")}(window);<\/script>     <br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/post\/464489\/\"> https:\/\/habr.com\/ru\/post\/464489\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\">\n<p>\u041f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043b\u043e\u0441\u044c \u043c\u043d\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043d\u0430 \u0441\u0430\u0439\u0442 \u043f\u0430\u043a\u0435\u0442\u043e\u0432 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u0438\u0437 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u0430\u0440\u0438\u044f. \u0418 \u0443\u0432\u0438\u0434\u0435\u0432, \u043d\u0438 \u0442\u0430\u043a \u0434\u0430\u0432\u043d\u043e, \u0442\u0443\u0442 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0441\u0442\u0430\u0442\u044c\u044e \u043f\u043e buildbot (\u0441\u0441\u044b\u043b\u043a\u0430 \u0432 \u043a\u043e\u043d\u0446\u0435) \u0440\u0435\u0448\u0438\u043b \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c.<\/p>\n<p>  <\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a buildbot \u2014 \u044d\u0442\u043e \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430, \u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043b\u043e\u0433\u0438\u0447\u043d\u044b\u043c \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443 \u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u043e\u043d\u043a\u0443 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0439 \u0445\u043e\u0441\u0442. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0443\u0442 LXC-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u044b (\u0432 \u0441\u043b\u0443\u0447\u0430\u0435 linux) \u0438 qemu (\u0432 \u0441\u043b\u0443\u0447\u0430\u0435 windows):<\/p>\n<p>  <\/p>\n<ul>\n<li>vm-srv-build1 \u2014 centos 7, \u0442\u0443\u0442 \u0431\u0443\u0434\u0435\u0442 buildbot \u043c\u0430\u0441\u0442\u0435\u0440 (master) \u0438 \u043e\u0434\u0438\u043d \u0438\u0437 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 (worker)<\/li>\n<li>vm-srv-build2 \u2014 debian 10, \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 DEB \u043f\u0430\u043a\u0435\u0442\u043e\u0432<\/li>\n<li>vm-srv-build3 \u2014 windows 10, \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438, \u0441\u0430\u043c\u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442\u0435, \u043f\u043e\u0434 \u0447\u0442\u043e<\/li>\n<\/ul>\n<p>  <\/p>\n<p>\u0421\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c <a href=\"https:\/\/habr.com\/ru\/post\/415835\/\">Rac GUI<\/a> \u2014 \u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043c\u043e\u0440\u0434\u0430 \u043a 1\u0421 rac \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. \u041f\u043e\u0434 \u043b\u0438\u043d\u0443\u043a\u0441 \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0448\u0442\u0430\u0442\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0430 \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u0443\u044e \u041e\u0421, \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 exe-\u0444\u0430\u0439\u043b\u0430 \u043f\u043e\u0434 windows \u0438\u0437 tcl-\u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <a href=\"http:\/\/freewrap.sourceforge.net\">freewrap<\/a>.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-293664","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/293664","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=293664"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/293664\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=293664"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=293664"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=293664"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}