{"id":292227,"date":"2019-07-18T09:01:50","date_gmt":"2019-07-18T09:01:50","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=292227"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=292227","title":{"rendered":"\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"},"content":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/jj\/-4\/-g\/jj-4-gindpovkdi6rbmzxax4yqu.jpeg\" alt=\"BuildBot \u043f\u0440\u043e\u0431\u043d\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\"\/><br \/>  <i>(Image by <a href=\"https:\/\/pixabay.com\/users\/Computerizer-4588466\/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=2301646\">Computerizer<\/a> from <a href=\"https:\/\/pixabay.com\/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=2301646\">Pixabay)<\/a><br \/>  <\/i><br \/>  \u041f\u0440\u0438\u0432\u0435\u0442! <\/p>\n<p>  \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 <b>\u0415\u0432\u0433\u0435\u043d\u0438\u0439 \u0427\u0435\u0440\u043a\u0438\u043d<\/b>, \u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0432 \u0433\u043e\u0440\u043d\u043e\u0434\u043e\u0431\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 <b>Polymetal<\/b>. <\/p>\n<p>  \u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u044f \u043a \u043b\u044e\u0431\u043e\u043c\u0443 \u043a\u0440\u0443\u043f\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0448\u044c \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c\u0441\u044f: \u00ab\u041a\u0430\u043a\u043e\u0439 \u0436\u0435 \u0441\u043e\u0444\u0442 \u043b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0435\u0433\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f?\u00bb. IT-\u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u043f\u0443\u0441\u043a\u043e\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0440\u044f\u0434 \u044d\u0442\u0430\u043f\u043e\u0432. \u0425\u043e\u0440\u043e\u0448\u043e, \u043a\u043e\u0433\u0434\u0430 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u044d\u0442\u0438\u0445 \u044d\u0442\u0430\u043f\u043e\u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430. \u0421\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u0443\u0441\u043a\u0430 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 IT-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <i>Continuous Integration<\/i>. <b>BuildBot <\/b>\u0434\u043b\u044f \u043d\u0430\u0441 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0445\u043e\u0440\u043e\u0448\u0438\u043c \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a\u043e\u043c, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u043c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441.<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043e\u0431\u0437\u043e\u0440 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 <b>BuildBot<\/b>. \u041d\u0430 \u0447\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u044d\u0442\u043e\u0442 \u0441\u043e\u0444\u0442? \u041a\u0430\u043a \u043a \u043d\u0435\u043c\u0443 \u043f\u043e\u0434\u0441\u0442\u0443\u043f\u0438\u0442\u044c\u0441\u044f \u0438 \u043a\u0430\u043a \u0432\u044b\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441 \u043d\u0438\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u042d\u0424\u0424\u0415\u041a\u0422\u0418\u0412\u041d\u042b\u0415 \u0420\u0410\u0411\u041e\u0427\u0418\u0415 \u041e\u0422\u041d\u041e\u0428\u0415\u041d\u0418\u042f? \u041d\u0430\u0448 \u043e\u043f\u044b\u0442 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0438 \u0443 \u0441\u0435\u0431\u044f, \u0441\u043e\u0437\u0434\u0430\u0432 \u043d\u0430 \u0441\u0432\u043e\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. <br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/b><\/p>\n<div class=\"spoiler_text\">\n<div class=\"scrollable-table\">\n<table>\n<tr>\n<td colspan=\"4\" align=\"center\">\n<h3>\u0421\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/h3>\n<\/td>\n<\/tr>\n<tr>\n<td><a href=\"#Why\">1. \u041f\u043e\u0447\u0435\u043c\u0443 BuildBot?<\/a><\/td>\n<td><a href=\"#Concepts\">2. \u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u0432\u043e \u0433\u043b\u0430\u0432\u0435 \u0441 BuildMaster<\/a><\/td>\n<td><a href=\"#Install\">3. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430<\/a><\/td>\n<td><a href=\"#master\">4. \u041f\u0435\u0440\u0432\u044b\u0435 \u0448\u0430\u0433\u0438<\/a><\/td>\n<\/tr>\n<tr>\n<td colspan=\"4\" align=\"center\"><a href=\"#Recept\">5. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f. \u041f\u043e\u0448\u0430\u0433\u043e\u0432\u044b\u0439 \u0440\u0435\u0446\u0435\u043f\u0442<\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"#BC\">5.1 BuildmasterConfig<\/a><\/td>\n<td><a href=\"#Worker\">5.2 workers<\/a><\/td>\n<td><a href=\"#CS\">5.3 change_source<\/a><\/td>\n<td><a href=\"#shedulers\">5.4 shedulers<\/a><\/td>\n<\/tr>\n<tr>\n<td colspan=\"2\" align=\"center\"><a href=\"#buildfactory\">5.5 BuildFactory<\/a><\/td>\n<td colspan=\"2\" align=\"center\"><a href=\"#builders\">5.6 builders<\/a><\/td>\n<\/tr>\n<tr>\n<td colspan=\"4\" align=\"center\"><a href=\"#myconfig\">6. \u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438<\/a><\/td>\n<\/tr>\n<tr>\n<td><a href=\"#fails\">6.1 \u041d\u0430 \u043f\u0443\u0442\u0438 \u043a \u0441\u0432\u043e\u0435\u043c\u0443 master.cfg<\/a><\/td>\n<td><a href=\"#svn\">6.2 \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 svn<\/a><\/td>\n<td colspan=\"2\"><a href=\"#reporter\">6.3 \u0412\u0430\u043c \u043f\u0438\u0441\u044c\u043c\u043e: reporters \u0443\u043f\u043e\u043b\u043d\u043e\u043c\u043e\u0447\u0435\u043d \u0437\u0430\u044f\u0432\u0438\u0442\u044c<\/a><\/td>\n<\/tr>\n<tr>\n<td colspan=\"4\" align=\"center\"><a href=\"#goodboy\">\u041c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e! \u041c\u043e\u0438 \u043f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/a><\/td>\n<\/tr>\n<\/table>\n<\/div>\n<p>  <\/div>\n<\/div>\n<p>  <a name=\"Why\"><\/a><\/p>\n<h3>1. \u041f\u043e\u0447\u0435\u043c\u0443 BuildBot?<\/h3>\n<hr\/>\n<p>  \u0420\u0430\u043d\u0435\u0435 \u043d\u0430 habr-e \u044f \u0432\u0441\u0442\u0440\u0435\u0447\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 \u043e \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 <i>Continuous Integration<\/i> \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c <b>BuildBot<\/b>. \u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443, <a href=\"https:\/\/habr.com\/ru\/post\/439096\/\">\u0432\u043e\u0442 \u044d\u0442\u0430<\/a> \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043c\u043d\u0435 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u043e\u0439. \u0415\u0441\u0442\u044c \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u2014 <a href=\"https:\/\/habr.com\/ru\/post\/204700\/\">\u043f\u043e\u043f\u0440\u043e\u0449\u0435<\/a>. \u0414\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u043f\u0440\u0430\u0432\u0438\u0442\u044c <a href=\"http:\/\/docs.buildbot.net\/current\/tutorial\/fiveminutes.html\">\u043f\u0440\u0438\u043c\u0435\u0440\u043e\u043c \u0441 \u043c\u0430\u043d\u0443\u0430\u043b\u0430<\/a>, \u0430 <a href=\"http:\/\/trac.buildbot.net\/wiki\/Press\">\u044d\u0442\u043e <\/a>\u0432\u0434\u043e\u0433\u043e\u043d\u043e\u0447\u043a\u0443, \u043d\u0430 \u0430\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435. \u0412 \u043a\u0443\u043f\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043b\u043e\u0445\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430. \u041f\u0440\u043e\u0447\u0438\u0442\u0430\u0432 \u044d\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438, \u0432\u044b \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043d\u0430 <b>BuildBot <\/b>\u0441\u0434\u0435\u043b\u0430\u0442\u044c.<\/p>\n<p>  \u0421\u0442\u043e\u043f! \u0410 \u043a\u0442\u043e-\u0442\u043e \u0432\u043e\u043e\u0431\u0449\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0435\u0433\u043e \u0432 \u0441\u0432\u043e\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445? \u041e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0434\u0430, <a href=\"https:\/\/github.com\/buildbot\/buildbot\/wiki\/SuccessStories\">\u043c\u043d\u043e\u0433\u0438\u0435 <\/a>\u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043b\u0438 \u0435\u0433\u043e \u0432 \u0441\u0432\u043e\u0438\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445. \u041c\u043e\u0436\u043d\u043e \u043d\u0430\u0439\u0442\u0438 <a href=\"https:\/\/code.google.com\/archive\/search?q=domain:code.google.com%20label:buildbot\">\u043f\u0440\u0438\u043c\u0435\u0440\u044b <\/a>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f <b>BuildBot <\/b>\u0438 \u0432 \u0430\u0440\u0445\u0438\u0432\u0430\u0445 \u043a\u043e\u0434\u043e\u0432 Google. <\/p>\n<p>  \u0422\u0430\u043a \u043a\u0430\u043a\u043e\u0432\u0430 \u0436\u0435 \u043b\u043e\u0433\u0438\u043a\u0430 \u043b\u044e\u0434\u0435\u0439, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 <b>Buildbot<\/b>? \u0412\u0435\u0434\u044c \u0435\u0441\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b: <b>CruiseControl <\/b>\u0438 <b>Jenkins<\/b>. \u041e\u0442\u0432\u0435\u0447\u0443 \u0442\u0430\u043a. \u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0437\u0430\u0434\u0430\u0447 <b>Jenkins <\/b>\u0438 \u043f\u0440\u0430\u0432\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u0412 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, <b>BuildBot <\/b> \u2014 \u0431\u043e\u043b\u0435\u0435 \u0430\u0434\u0430\u043f\u0442\u0438\u0432\u043d\u044b\u0439, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u0437\u0430\u0434\u0430\u0447\u0438 \u0442\u0430\u043c \u0440\u0435\u0448\u0430\u044e\u0442\u0441\u044f \u0442\u0430\u043a \u0436\u0435 \u043f\u0440\u043e\u0441\u0442\u043e, \u043a\u0430\u043a \u0438 \u0432 <b>Jenkins<\/b>. \u0412\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0430\u043c. \u041d\u043e \u0440\u0430\u0437 \u0443\u0436 \u043c\u044b \u0438\u0449\u0435\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u0446\u0435\u043b\u0435\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0442\u043e \u043f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0442\u043e\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442, \u043e\u0442\u0442\u0430\u043b\u043a\u0438\u0432\u0430\u044f\u0441\u044c \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 \u0448\u0430\u0433\u043e\u0432, \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0441\u0431\u043e\u0440\u043a\u0438, \u0438\u043c\u0435\u044e\u0449\u0443\u044e \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u043e\u0441\u0442\u044c \u0438 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441.<\/p>\n<p>  \u0423 \u0442\u0435\u0445, \u0447\u0435\u0439 \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 python, \u0432\u043e\u0437\u043d\u0438\u043a\u0430\u0435\u0442 \u0432\u043e\u043f\u0440\u043e\u0441: \u00ab\u041f\u043e\u0447\u0435\u043c\u0443 \u0431\u044b \u043d\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0435\u0441\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u043e\u0433\u043e \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435?\u00bb. \u0418 \u0442\u0443\u0442 \u0441\u0430\u043c\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u0430 <b>BuildBot<\/b>.  <\/p>\n<blockquote><p>\u0418\u0442\u0430\u043a, \u043d\u0430\u0448 \u00ab\u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u0432\u0430\u0440\u0442\u0435\u0442\u00bb. \u0414\u043b\u044f \u0441\u0435\u0431\u044f \u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043b \u0447\u0435\u0442\u0432\u0435\u0440\u043a\u0443 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0435\u0439 <b>BuildBot<\/b>:   <\/p>\n<ol>\n<li>\u042d\u0442\u043e framework c \u043e\u0442\u043a\u0440\u044b\u0442\u044b\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043f\u043e\u0434 \u043b\u0438\u0446\u0435\u043d\u0437\u0438\u0435\u0439 GPL<\/li>\n<li>\u042d\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 python \u043a\u0430\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439<\/li>\n<li>\u042d\u0442\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0442\u0432\u0435\u0442 \u0441\u043e \u0441\u0442\u043e\u0440\u043e\u043d\u044b \u043c\u0430\u0448\u0438\u043d\u044b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0441\u0431\u043e\u0440\u043a\u0430<\/li>\n<li>\u042d\u0442\u043e, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u043a \u0425\u043e\u0441\u0442\u0443. \u0414\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f python \u0438 twisted, \u0438 \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 \u0438 java-\u043c\u0430\u0448\u0438\u043d\u0430.<\/li>\n<\/ol>\n<p>  <\/p><\/blockquote>\n<p> <a name=\"Concepts\"><\/a><\/p>\n<h3>2. \u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u0432\u043e \u0433\u043b\u0430\u0432\u0435 \u0441 BuildMaster<\/h3>\n<hr\/>\n<p>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/so\/qs\/u1\/soqsu1skae_0xuktzdemfv-n3yq.png\" alt=\"BuildBot BuildMaster\"\/><\/p>\n<p>  \u0426\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043e \u0432 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435 \u0440\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 \u0437\u0430\u043d\u0438\u043c\u0430\u0435\u0442 <b>BuildMaster<\/b>. \u041e\u043d \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439:<\/p>\n<ul>\n<li><b>\u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442<\/b> \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0434\u0435\u0440\u0435\u0432\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430<\/li>\n<li><b>\u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 <\/b>\u043a\u043e\u043c\u0430\u043d\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0435\u0440\u0432\u0438\u0441\u0443 Worker \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0435\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/li>\n<li><b>\u0443\u0432\u0435\u0434\u043e\u043c\u043b\u044f\u0435\u0442<\/b> \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043e \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439<\/li>\n<\/ul>\n<p>  <b>BuildMaster <\/b>\u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u0444\u0430\u0439\u043b <i>master.cfg<\/i>. \u042d\u0442\u043e \u0444\u0430\u0439\u043b \u043b\u0435\u0436\u0438\u0442 \u0432 \u043a\u043e\u0440\u043d\u0435 <b>BuildMaster<\/b>. \u041f\u043e\u0437\u0436\u0435 \u044f \u043f\u043e\u043a\u0430\u0436\u0443, \u043a\u0430\u043a \u044d\u0442\u043e\u0442 \u043a\u043e\u0440\u0435\u043d\u044c \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f. \u0421\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u0444\u0430\u0439\u043b <i>master.cfg<\/i> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0432 \u0441\u0435\u0431\u0435 python \u2014 \u0441\u043a\u0440\u0438\u043f\u0442, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0439 \u0432\u044b\u0437\u043e\u0432\u044b <b>BuildBot<\/b>.<\/p>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0432\u0430\u0436\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 <b>BuildBot <\/b>\u0438\u043c\u0435\u0435\u0442 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 <b>Worker<\/b>. \u042d\u0442\u043e\u0442 \u0441\u0435\u0440\u0432\u0438\u0441 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c \u0445\u043e\u0441\u0442\u0435 c \u0434\u0440\u0443\u0433\u043e\u0439 OS, \u0430 \u043c\u043e\u0436\u0435\u0442 \u0438 \u043d\u0430 \u0442\u043e\u043c, \u0433\u0434\u0435 <b>BuildMaster<\/b>. \u0422\u0430\u043a\u0436\u0435 \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435 \u0441\u043e \u0441\u0432\u043e\u0438\u043c\u0438 \u043f\u0430\u043a\u0435\u0442\u0430\u043c\u0438 \u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438. \u0414\u0430\u043d\u043d\u044b\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u044b \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0440\u0438\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u044b \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 python-\u0443\u0442\u0438\u043b\u0438\u0442 \u0432\u0440\u043e\u0434\u0435 <i>vertualenv, venv<\/i>. <\/p>\n<p>  <b>BuildMaster <\/b>\u0442\u0440\u0430\u043d\u0441\u043b\u0438\u0440\u0443\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043a\u0430\u0436\u0434\u043e\u043c\u0443 <b>Worker<\/b>-\u0443, \u0430 \u0442\u043e\u0442, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0438\u0445 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442. \u0422\u043e \u0435\u0441\u0442\u044c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438\u0434\u0442\u0438 \u043d\u0430 <b>Worker<\/b>-\u0435 \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c Windows \u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u043c Worker-\u0435 \u043f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c linux. <\/p>\n<p>  <i>\u0421heckout <\/i>\u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u0434\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u043d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c <b>Worker<\/b>-\u0435.<\/p>\n<p>  <a name=\"Install\"><\/a><\/p>\n<h3>3. \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430<\/h3>\n<hr\/>\n<p>  \u0418\u0442\u0430\u043a, \u043f\u043e\u0435\u0445\u0430\u043b\u0438. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0445\u043e\u0441\u0442\u0430 \u044f \u0431\u0443\u0434\u0443 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Ubuntu 18.04. \u041d\u0430 \u043d\u0435\u043c \u044f \u0440\u0430\u0437\u043c\u0435\u0449\u0443 \u043e\u0434\u043d\u043e\u0433\u043e <b>BuildMaster<\/b>-a \u0438 \u043e\u0434\u043d\u043e\u0433\u043e <b>Worker<\/b>-a. \u041d\u043e \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c python3.7:<\/p>\n<pre><code class=\"bash\">sudo apt-get update sudo apt-get install python3.7 <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u0442\u0435\u0445 \u043a\u043e\u043c\u0443 \u043d\u0430\u0434\u043e python3.7.2 \u0432\u043c\u0435\u0441\u0442\u043e 3.7.1 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435: <\/p>\n<pre><code class=\"bash\"> sudo apt-get update sudo apt-get software-properties-common sudo add-apt-repository ppa:deadsnakes\/ppa sudo apt-get install python3.7 sudo ln -fs \/usr\/bin\/python3.7 \/usr\/bin\/python3 pip3 install --upgrade pip <\/code><\/pre>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c <i>Twited <\/i>\u0438 <b>BuildBot<\/b>, \u0430 \u0442\u0430\u043a \u0436\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0449\u0438\u0435 \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b <b>BuildBot<\/b>-a. <\/p>\n<pre><code class=\"bash\"> \/*\u0412\u0441\u0435 \u0447\u0442\u043e \u043f\u043e\u0434 sudo \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \/usr\/local\/lib\/python3.7\/dist-packages*\/  #\u041d\u0430 \u0445\u043e\u0441\u0442\u0435 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 Worker-\u043e\u0432  sudo pip install twisted #\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 twisted sudo pip install buildbot #BuildMaster #\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b pip install pysqlite3 #\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0431\u0430\u0437\u0443 sqllite \u0432 \u0443\u0447\u0435\u0431\u043d\u044b\u0445 \u0446\u0435\u043b\u044f\u0445 pip install jinja2 #framework \u043d\u0430\u043f\u043e\u0434\u043e\u0431\u0438\u0435 django, \u0434\u043b\u044f web \u0438 \u0434\u043b\u044f \u043f\u043e\u0447\u0442\u043e\u0432\u044b\u0445 \u0440\u0430\u0441\u0441\u044b\u043b\u043b\u043e\u043a pip install autobahn #Web c\u043e\u043a\u0435\u0442\u044b \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 BuildMaster-&gt;Worker pip install sqlalchemy sqlalchemy-migrate #\u0414\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0441\u0445\u0435\u043c\u044b \u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 #\u0414\u043b\u044f Web \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f BuildBot-a pip install buildbot-www buildbot-grid-view buildbot-console-view buildbot-watherfall-view pip install python-dateutil #\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0434\u0430\u0442 \u0432 web #\u041d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u0445\u043e\u0441\u0442\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u0441\u0431\u043e\u0440\u043a\u0443 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435  pip install buildbot-worker #Worker #\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b sudo pip install virtualenv #\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0440\u0435\u0434\u0430  <\/code><\/pre>\n<p>  <a name=\"master\"><\/a><\/p>\n<h3>4. \u041f\u0435\u0440\u0432\u044b\u0435 \u0448\u0430\u0433\u0438<\/h3>\n<hr\/>\n<p>  \u0412\u0440\u0435\u043c\u044f \u0441\u043e\u0437\u0434\u0430\u0442\u044c <b>BuildMaster<\/b>. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0443 \u043d\u0430\u0441 \u0432 \u043f\u0430\u043f\u043a\u0435 <i>\/home\/habr\/master<\/i>.  <\/p>\n<pre><code class=\"bash\">mkdir master buildbot create-master master # \u0421\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0441\u0434\u0435\u0441\u044c \u0438 \u0441\u043e\u0437\u0434\u0430\u0435\u043c<\/code><\/pre>\n<p>  <a name=\"createworker\"><\/a>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0448\u0430\u0433. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c <b>Worker<\/b>. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0443 \u043d\u0430\u0441 \u0432 \u043f\u0430\u043f\u043a\u0435 <i>\/home\/habr\/worker<\/i>.  <\/p>\n<pre><code class=\"bash\">mkdir worker buildbot-worker create-worker --umask=0o22 --keepalive=60 worker localhost:4000 yourWorkerName password <\/code><\/pre>\n<p>  \u041a\u043e\u0433\u0434\u0430 \u0432\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 <b>Worker<\/b>, \u0442\u043e \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0432 <i>\/home\/habr\/worker<\/i> \u043f\u0430\u043f\u043a\u0443 \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u043d \u0432 <i>master.cfg<\/i>. \u0410 \u0432 \u043f\u0430\u043f\u043e\u0447\u043a\u0435 \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043e\u043d \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e <i>build<\/i>, \u0438 \u0434\u0430\u043b\u0435\u0435 \u0432 \u043d\u0435\u0451 \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u043b\u0430\u0442\u044c <i>checkout<\/i>. \u0420\u0430\u0431\u043e\u0447\u0438\u043c \u043a\u0430\u0442\u0430\u043b\u043e\u0433\u043e\u043c \u0434\u043b\u044f <b>Worker<\/b>-\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f <i>\/home\/habr\/yourProject\/build<\/i>.<\/p>\n<p>  <b>\u00ab\u0417\u043e\u043b\u043e\u0442\u043e\u0439\u00bb \u043a\u043b\u044e\u0447\u0438\u043a<\/b><br \/>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0442\u043e, \u0440\u0430\u0434\u0438 \u0447\u0435\u0433\u043e \u044f \u043f\u0438\u0441\u0430\u043b \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 \u0430\u0431\u0437\u0430\u0446: \u0441\u043a\u0440\u0438\u043f\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 <b>Master <\/b>\u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0443 <b>Worker<\/b>-\u0430 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438, \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0443 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 \u043d\u0435\u0442 \u043f\u0440\u0430\u0432 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430. \u0427\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u044e, \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043a\u043b\u044e\u0447\u0438\u043a <a name=\"umask\"><\/a><i>&#8212;umask=0o22<\/i>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0437\u0430\u043f\u0440\u0435\u0442 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c \u0432 \u044d\u0442\u0443 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u043d\u043e \u043f\u0440\u0430\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043e\u0441\u0442\u0430\u0432\u0438\u0442. \u0410 \u043d\u0430\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u044d\u0442\u043e \u0438 \u043d\u0443\u0436\u043d\u043e. <\/p>\n<p>  <b>BuildMaster <\/b>\u0438 <b>Worker <\/b>\u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442 \u043c\u0435\u0436\u0434\u0443 \u0441\u043e\u0431\u043e\u0439 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435. \u0421\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f, \u0447\u0442\u043e \u043e\u043d\u043e \u043e\u0431\u0440\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438 <b>Worker <\/b>\u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u043e\u0442\u0432\u0435\u0442\u0430 \u043e\u0442 <b>BuildMaster<\/b>-\u0430. \u0415\u0441\u043b\u0438 \u043e\u0442\u0432\u0435\u0442\u0430 \u043d\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u0435\u0442, \u0442\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f. \u041a\u043b\u044e\u0447 <b>&#8212;keepalive=60<\/b> \u043a\u0430\u043a \u0440\u0430\u0437 \u0438 \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0440\u0435\u043c\u044f, \u043f\u043e \u043f\u0440\u043e\u0448\u0435\u0441\u0442\u0432\u0438\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e <i>connect <\/i>\u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442\u0441\u044f.<\/p>\n<p>  <a name=\"Recept\"><\/a><\/p>\n<h3>5. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f. \u041f\u043e\u0448\u0430\u0433\u043e\u0432\u044b\u0439 \u0440\u0435\u0446\u0435\u043f\u0442<\/h3>\n<hr\/>\n<p>  \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f <b>BuildMaster <\/b>\u0432\u0435\u0434\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 \u043c\u0430\u0448\u0438\u043d\u044b, \u0433\u0434\u0435 \u043c\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0438 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <i>create-master<\/i>. \u0412 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u2014 \u044d\u0442\u043e \u043a\u0430\u0442\u0430\u043b\u043e\u0433 <i>\/home\/habr\/master<\/i>. \u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b <i>master.cfg<\/i> \u043f\u043e\u043a\u0430 \u0435\u0449\u0435 \u043d\u0435 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u043e\u0434\u043d\u0430\u043a\u043e \u0441\u0430\u043c\u0430 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043b\u0430 \u0444\u0430\u0439\u043b <i>master.cmg.sample<\/i>. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 <i>master.cfg.sample<\/i> \u0432 <i>master.cfg<\/i>  <\/p>\n<pre><code class=\"bash\">mv master.cfg.sample master.cfg<\/code><\/pre>\n<p>  \u041e\u0442\u043a\u0440\u043e\u0435\u043c \u044d\u0442\u043e\u0442 <i>master.cfg<\/i>. \u0418 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u0442\u043e, \u0438\u0437 \u0447\u0435\u0433\u043e \u043e\u043d \u0441\u043e\u0441\u0442\u043e\u0438\u0442. \u0410 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0444\u0430\u0439\u043b.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">master.cfg<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"python\">c['change_source'] = [] c['change_source'].append(changes.GitPoller(     'git:\/\/github.com\/buildbot\/hello-world.git',          workdir='gitpoller-workdir', branch='master',          pollInterval=300))                          c['schedulers'] = [] c['schedulers'].append(schedulers.SingleBranchScheduler(         name=&quot;all&quot;,         change_filter=util.ChangeFilter(branch='master'),         treeStableTimer=None,         builderNames=[&quot;runtests&quot;])) c['schedulers'].append(schedulers.ForceScheduler(         name=&quot;force&quot;,         builderNames=[&quot;runtests&quot;]))                          factory = util.BuildFactory()                          factory.addStep(steps.Git(repourl='git:\/\/github.com\/buildbot\/hello-world.git', mode='incremental')) factory.addStep(steps.ShellCommand(command=[&quot;trial&quot;, &quot;hello&quot;],                                    env={&quot;PYTHONPATH&quot;: &quot;.&quot;}))                          c['builders'] = [] c['builders'].append(     util.BuilderConfig(name=&quot;runtests&quot;,     workernames=[&quot;example-worker&quot;],     factory=factory))                           c['services'] = []                          c['title'] = &quot;Hello World CI&quot; c['titleURL'] = &quot;https:\/\/buildbot.github.io\/hello-world\/&quot;                                                   c['buildbotURL'] = &quot;http:\/\/localhost:8010\/&quot;                          c['www'] = dict(port=8010,                 plugins=dict(waterfall_view={}, console_view={}, grid_view={}))                          c['db'] = {     'db_url' : &quot;sqlite:\/\/\/state.sqlite&quot;, } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <a name=\"BC\"><\/a><u><\/p>\n<h4>5.1 BuildmasterConfig<\/h4>\n<p><\/u>  <\/p>\n<pre><code class=\"python\">c = BuildmasterConfig = {} <\/code><\/pre>\n<p>  <i>BuildmasterConfig <\/i> \u2014 \u0431\u0430\u0437\u043e\u0432\u044b\u0439 \u0441\u043b\u043e\u0432\u0430\u0440\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430. \u041e\u043d \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d \u0432 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435. \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043a\u043e\u0434\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 \u0432\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0435\u0433\u043e \u043f\u0441\u0435\u0432\u0434\u043e\u043d\u0438\u043c <i>\u00abc\u00bb<\/i>. \u041d\u0430\u0437\u0432\u0430\u043d\u0438\u044f <a href=\"http:\/\/docs.buildbot.net\/current\/bb-cfg.html\">\u043a\u043b\u044e\u0447\u0435\u0439 <\/a>\u0432 <i>c[\u00abkeyFromDist\u00bb] <\/i>\u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u0434\u043b\u044f \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 <b>BuildMaster<\/b>. \u041f\u043e\u0434 \u043a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u044e\u0447 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442.<\/p>\n<p>  <a name=\"Worker\"><\/a><u><\/p>\n<h4>5.2 workers<\/h4>\n<p><\/u>  <\/p>\n<pre><code class=\"python\">c['workers'] = [worker.Worker(&quot;example-worker&quot;, &quot;pass&quot;)]<\/code><\/pre>\n<p>  \u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c <b>BuildMaster<\/b>-\u0443 \u0441\u043f\u0438\u0441\u043e\u043a \u0438\u0437 <b>Worker<\/b>-\u043e\u0432. \u0421\u0430\u043c <b>Worker <\/b>\u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u043b\u0438 <a href=\"#createworker\">\u0432\u044b\u0448\u0435<\/a>, \u0443\u043a\u0430\u0437\u0430\u0432 <i>you-worker-name<\/i> \u0438 <i>password<\/i>. \u0422\u0435\u043f\u0435\u0440\u044c \u0438\u0445 \u0436\u0435 \u043d\u0430\u0434\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u043c\u0435\u0441\u0442\u043e <i>example-worker<\/i> \u0438 <i>pass <\/i>.<\/p>\n<p>  <a name=\"CS\"><\/a><u><\/p>\n<h4>5.3 change_source<\/h4>\n<p><\/u>  <\/p>\n<pre><code class=\"python\">c['change_source'] = [] c['change_source'].append(changes.GitPoller(                             'git:\/\/github.com\/buildbot\/hello-world.git',                              workdir='gitpoller-workdir', branch='master',                              pollInterval=300))                 <\/code><\/pre>\n<p>  \u041f\u043e \u043a\u043b\u044e\u0447\u0443 <i>change_source<\/i> \u0441\u043b\u043e\u0432\u0430\u0440\u044f c \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u043f\u0438\u0441\u043a\u0443, \u043a\u0443\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u043e\u0431\u044a\u0435\u043a\u0442, \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u043c \u043a\u043e\u0434\u043e\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0412 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f Git \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u043d\u043e\u0441\u0442\u044c\u044e. <\/p>\n<p>  \u041f\u0435\u0440\u0432\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0443\u0442\u0435\u043c \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044e. <\/p>\n<p>  <i>workdir <\/i>\u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043e\u0431\u043e\u0439 \u043f\u0443\u0442\u044c \u043a \u043f\u0430\u043f\u043a\u0435, \u0433\u0434\u0435 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 <b>Worker<\/b>-\u0430 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0443\u0442\u0438 <i>\/home\/habr\/worker\/yourProject\/build<\/i> \u0431\u0443\u0434\u0435\u0442 git \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. <\/p>\n<p>  <i>branch <\/i>\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0432\u0435\u0442\u043a\u0443 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438, \u0437\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0441\u043b\u0435\u0434\u0438\u0442\u044c. <\/p>\n<p>  <i>pollInterval <\/i>\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0447\u0438\u0441\u043b\u043e \u0441\u0435\u043a\u0443\u043d\u0434, \u043f\u043e \u0438\u0441\u0442\u0435\u0447\u0435\u043d\u0438\u044e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 <b>BuildMaster <\/b>\u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0442\u044c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 \u043d\u0430\u043b\u0438\u0447\u0438\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p>  \u0415\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. <\/p>\n<p>  \u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u043c\u0435\u0442\u043e\u0434 \u2014 \u044d\u0442\u043e <i>Polling<\/i>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442, \u0447\u0442\u043e <b>BuildMaster <\/b>\u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435, \u0435\u0441\u043b\u0438 <i>commit <\/i>\u043e\u0442\u0440\u0430\u0437\u0438\u043b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438, \u0442\u043e <b>BuildMaster <\/b>\u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u0441\u043e\u0437\u0434\u0430\u0441\u0442 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 <i>Change <\/i>\u0438 \u043d\u0430\u043f\u0440\u0430\u0432\u0438\u0442 \u0435\u0433\u043e \u0432 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u043e\u0431\u044b\u0442\u0438\u0439 <i>Scheduler<\/i>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442 \u0448\u0430\u0433\u0438 \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430 <i>Worker<\/i>-\u0435. \u0421\u0440\u0435\u0434\u0438 \u044d\u0442\u0438 \u0448\u0430\u0433\u043e\u0432 \u0431\u0443\u0434\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u043d <i>update <\/i>\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. \u0418\u043c\u0435\u043d\u043d\u043e \u043d\u0430 <b>Worker<\/b>-\u0435 \u0441\u043e\u0437\u0434\u0430\u0441\u0442\u0441\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043f\u0438\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. \u0414\u0435\u0442\u0430\u043b\u0438 \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u043a\u0440\u044b\u0442\u044b \u043d\u0438\u0436\u0435 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0434\u0432\u0443\u0445 \u0440\u0430\u0437\u0434\u0435\u043b\u0430\u0445 <b>(<a href=\"#shedulers\">5.4<\/a> \u0438 <a href=\"#buildfactory\">5.5<\/a>)<\/b>.<\/p>\n<p>  \u0415\u0449\u0435 \u0431\u043e\u043b\u0435\u0435 \u0438\u0437\u044f\u0449\u043d\u044b\u043c \u043c\u0435\u0442\u043e\u0434\u043e\u043c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u044f\u043c\u0430\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u043d \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d, \u043a <b>BuildMaster<\/b>-\u0443 \u043e\u0431 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u0434\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u0412 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u0441\u0434\u0435\u043b\u0430\u0435\u0442 <i>commit<\/i>, \u0441\u0435\u0440\u0432\u0435\u0440 \u0441 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u043e\u0448\u043b\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 <b>BuildMaster<\/b>-\u0443. \u0410 \u0442\u043e\u0442, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0435\u0433\u043e \u043f\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0438\u0442 \u0441\u043e\u0437\u0434\u0430\u0432 \u043e\u0431\u044a\u0435\u043a\u0442 <i>PBChangeSource<\/i>. \u0414\u0430\u043b\u0435\u0435 \u044d\u0442\u043e\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u043d \u0432 <i>Scheduler<\/i>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u0448\u0430\u0433\u0438 \u043f\u043e \u0441\u0431\u043e\u0440\u043a\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0438 \u0435\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044e. \u0412\u0430\u0436\u043d\u0430\u044f \u0447\u0430\u0441\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u044d\u0442\u0430 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 <i>hook<\/i>-\u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438. \u0412 \u0441\u043a\u0440\u0438\u043f\u0442\u0435 <i>hook<\/i>-\u0430, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0435\u0433\u043e \u0437\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u043f\u0440\u0438 <i>commit<\/i>-\u0435, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0443\u0442\u0438\u043b\u0438\u0442\u0443 <i>sendchange <\/i>\u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0430\u0434\u0440\u0435\u0441 <b>BuildMaster<\/b>-\u0430. \u0423\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u043e \u0438 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043f\u043e\u0440\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0441\u043b\u0443\u0448\u0430\u0442\u044c <i>PBChangeSource<\/i>. <i>PBChangeSource<\/i>, \u043a\u0441\u0442\u0430\u0442\u0438, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0447\u0430\u0441\u0442\u044c\u044e <b>BuildMaster<\/b>-\u0430. \u042d\u0442\u043e \u043c\u0435\u0442\u043e\u0434 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043f\u0440\u0430\u0432\u0430 <i>admin<\/i>-a \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0433\u0434\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c backup \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.<\/p>\n<p>  <a name=\"shedulers\"><\/a><u><\/p>\n<h4>5.4 shedulers<\/h4>\n<p><\/u>  <\/p>\n<pre><code class=\"python\"> c['schedulers'] = [] c['schedulers'].append(schedulers.SingleBranchScheduler(         name=&quot;all&quot;,         change_filter=util.ChangeFilter(branch='master'),         treeStableTimer=None,         builderNames=[&quot;runtests&quot;])) c['schedulers'].append(schedulers.ForceScheduler(         name=&quot;force&quot;,         builderNames=[&quot;runtests&quot;])) <\/code><\/pre>\n<p>  <i>schedulers <\/i>\u2013 \u044d\u0442\u043e \u044d\u043b\u0435\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b\u0441\u0442\u0443\u043f\u0430\u0435\u0442 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u043e\u043c, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0449\u0438\u043c \u0432\u0441\u044e \u0446\u0435\u043f\u043e\u0447\u043a\u0443 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/sh\/1j\/jo\/sh1jjoo3rog47fsyjgqgorizyfs.png\" alt=\"BuildBot Shedulers\"\/><\/p>\n<p>  \u0422\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u044b\u043b\u0438 \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u044b <i>change_source<\/i>, \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u043b\u0438\u0441\u044c \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u044b <b>BuildBot<\/b>-a \u0432 \u043e\u0431\u044a\u0435\u043a\u0442 <i>Change <\/i>\u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u043a\u0430\u0436\u0434\u043e\u0435 <i>Sheduler <\/i>\u043d\u0430 \u0438\u0445 \u043e\u0441\u043d\u043e\u0432\u0435 \u0441\u0442\u0440\u043e\u0438\u0442 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041e\u0434\u043d\u0430\u043a\u043e \u043e\u043d \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u0442 \u0438 \u0442\u043e, \u043a\u043e\u0433\u0434\u0430 \u044d\u0442\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0434\u0430\u043b\u044c\u0448\u0435 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u041e\u0431\u044a\u0435\u043a\u0442 <a name=\"builder\"><\/a><i>Builder <\/i>\u0445\u0440\u0430\u043d\u0438\u0442 \u0443 \u0441\u0435\u0431\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432 \u0438 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u043c <b>Worker<\/b>-e. <i>Builder <\/i>\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442 \u0438 \u043d\u0430 <b>BuildMaster<\/b>-e \u0438 \u043d\u0430 <b>Worker<\/b>-e. \u041e\u043d \u0436\u0435 \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 \u0441 <b>BuildMaster<\/b>-\u0430 \u043d\u0430 <b>Worker<\/b>-\u0430 \u0443\u0436\u0435 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 <i>build <\/i> \u2014 \u0441\u0435\u0440\u0438\u044e \u0448\u0430\u0433\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c.<br \/>  \u041c\u044b \u0432\u0438\u0434\u0438\u043c, \u0447\u0442\u043e \u0432 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0442\u0430\u043a\u0438\u0445 <i>schedulers <\/i>\u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f 2 \u0448\u0442\u0443\u043a\u0438. \u041f\u0440\u0438\u0447\u0435\u043c, \u043a\u0430\u0436\u0434\u0430\u044f \u0438\u043c\u0435\u0435\u0442 \u0441\u0432\u043e\u0439 \u0442\u0438\u043f.<\/p>\n<p>  <i>SingleBranchScheduler <\/i>\u2013 \u043e\u0434\u0438\u043d \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u043a\u043b\u0430\u0441\u0441\u043e\u0432 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f. \u041e\u043d \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0435\u0442 \u0437\u0430 \u043e\u0434\u043d\u043e\u0439 \u0432\u0435\u0442\u043a\u043e\u0439 \u0438 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e \u0437\u0430\u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044e \u0432 \u043d\u0435\u0439. \u041a\u043e\u0433\u0434\u0430 \u043e\u043d \u0432\u0438\u0434\u0438\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0437\u0430\u043f\u0440\u043e\u0441\u0430 \u043d\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 (\u043e\u0442\u043b\u043e\u0436\u0438\u0442\u044c \u043d\u0430 \u043f\u0435\u0440\u0438\u043e\u0434, \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 <i>treeStableTimer<\/i>). \u0412 <i>name <\/i>\u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0438\u043c\u044f \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 <b>BuildBot<\/b>-web-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0435. \u0412 <i>ChangeFilter <\/i>\u0437\u0430\u0434\u0430\u0435\u0442\u0441\u044f \u0444\u0438\u043b\u044c\u0442\u0440, \u043f\u0440\u043e\u0439\u0434\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u0432\u0435\u0442\u043a\u0435 \u043f\u043e\u0431\u0443\u0436\u0434\u0430\u044e\u0442 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0430\u0442\u044c \u0437\u0430\u043f\u0440\u043e\u0441 \u043d\u0430 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435. \u0412 <i>builderNames <\/i>\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0438\u043c\u044f <i>builder<\/i>-a, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0437\u0430\u0434\u0430\u0434\u0438\u043c \u0447\u0443\u0442\u044c \u043f\u043e\u0437\u0436\u0435. \u0418\u043c\u044f \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0431\u0443\u0434\u0435\u0442 \u0442\u043e \u0436\u0435, \u0447\u0442\u043e \u0438 \u0438\u043c\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430: <i>yourProject<\/i>.<\/p>\n<p>  <i>ForceScheduler <\/i>\u0432\u0435\u0441\u044c\u043c\u0430 \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u0448\u0442\u0443\u043a\u0430. \u042d\u0442\u043e\u0442 \u0432\u0438\u0434 \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u043f\u043e \u0449\u0435\u043b\u0447\u043a\u0443 \u043c\u044b\u0448\u0438 \u0447\u0435\u0440\u0435\u0437 <b>BuildBot<\/b>-web-\u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438\u043c\u0435\u044e\u0442 \u0442\u0443 \u0436\u0435 \u0441\u0443\u0442\u044c, \u0447\u0442\u043e \u0438 \u0432 <i>SingleBranchScheduler<\/i>.<\/p>\n<p>  <b>P.S. \u21163. \u0412\u0434\u0440\u0443\u0433 \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f<\/b><br \/>  <i>Periodic <\/i> \u2014 \u044d\u0442\u043e \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u043d\u043e\u0441\u0442\u044c\u044e. \u0412\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0432\u044b\u0437\u043e\u0432 \u0435\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u043d\u043e \u0442\u0430\u043a  <\/p>\n<pre><code class=\"python\"> from buildbot.plugins import schedulers nightly = schedulers.Periodic(name=&quot;daily&quot;,                               builderNames=[&quot;full-solaris&quot;],                               periodicBuildTimer=24*60*60) c['schedulers'] = [nightly]                     <\/code><\/pre>\n<p>  <a name=\"buildfactory\"><\/a><u><\/p>\n<h4>5.5 BuildFactory<\/h4>\n<p><\/u>  <\/p>\n<pre><code class=\"python\"> factory = util.BuildFactory()                          factory.addStep(steps.Git(repourl='git:\/\/github.com\/buildbot\/hello-world.git', mode='incremental')) factory.addStep(steps.ShellCommand(command=[&quot;trial&quot;, &quot;hello&quot;],                                    env={&quot;PYTHONPATH&quot;: &quot;.&quot;})) <\/code><\/pre>\n<p>  <i>periodicBuildTimer <\/i>\u0437\u0430\u0434\u0430\u0435\u0442 \u0432\u0440\u0435\u043c\u044f \u044d\u0442\u043e\u0439 \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u043d\u043e\u0441\u0442\u0438 \u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445.<\/p>\n<p>  <i>BuildFactory <\/i>\u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 <i>build<\/i>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0442\u043e\u043c <i>builder <\/i>\u043e\u0442\u0441\u044b\u043b\u0430\u0435\u0442 \u043d\u0430 <b>Worker<\/b>. \u0412 <i>BuildFactory <\/i>\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0448\u0430\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c <b>Worker<\/b>-\u0443. \u0428\u0430\u0433\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u0430 <i>addStep<br \/>  <\/i><\/p>\n<p>  \u041f\u0435\u0440\u0432\u044b\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0448\u0430\u0433 \u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u2014 <i>git clean -d -f -f \u2013x<\/i>, \u0437\u0430\u0442\u0435\u043c <i>git checkout<\/i>. \u042d\u0442\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0437\u0430\u043b\u043e\u0436\u0435\u043d\u044b \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0435 <i>method<\/i>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0433\u043b\u044f\u0434\u043d\u043e \u043d\u0435 \u0443\u043a\u0430\u0437\u0430\u043d, \u043d\u043e \u043f\u043e\u0434\u0440\u0430\u0437\u0443\u043c\u0435\u0432\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e <i>fresh<\/i>. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <i>mode=&#8217;incremental&#8217;<\/i> \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0444\u0430\u0439\u043b\u044b \u0438\u0437 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438, \u043a\u0443\u0434\u0430 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f <i>chechout<\/i>, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438, \u043e\u0441\u0442\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u0442\u0440\u043e\u043d\u0443\u0442\u044b\u043c\u0438.<\/p>\n<p>  \u0412\u0442\u043e\u0440\u043e\u0439 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0448\u0430\u0433 \u2014 \u044d\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 <i>trial <\/i>c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u043c <i>hello <\/i>\u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 <b>Worker<\/b>-\u0430 \u0438\u0437 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <i>\/home\/habr\/worker\/yourProject\/build <\/i>c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f PATHONPATH=\u2026 \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0432\u043e\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0438\u0445 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 <b>Worker<\/b>-a \u0447\u0435\u0440\u0435\u0437 \u0448\u0430\u0433 <i>util.ShellCommand<\/i>. \u0414\u0430\u043d\u043d\u044b\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u044c \u043f\u0440\u044f\u043c\u043e \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439. \u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u0438 <i>chechout<\/i>-\u0435 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u043f\u0430\u0434\u0430\u0442\u044c \u0432 <i>\/home\/habr\/worker\/yourProject\/build<\/i>. \u041e\u0434\u043d\u0430\u043a\u043e \u0442\u043e\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u00ab\u043d\u043e\u00bb:  <\/p>\n<ol>\n<li><b>Worker <\/b>\u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u043d \u0441 \u043a\u043b\u044e\u0447\u0435\u043c <a href=\"#umask\"><i>&#8212;umask<\/i><\/a> \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u043d \u043d\u0435 \u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043b \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u043e\u0441\u043b\u0435 <i>checkout<\/i>-a. <\/li>\n<li>\u041f\u0440\u0438 <i>git push<\/i>-\u0435 \u044d\u0442\u0438\u0445 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e <i>exacutable<\/i>, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0442\u043e\u043c \u043f\u0440\u0438 <i>chechout<\/i>-e \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0441\u043a\u0440\u0438\u043f\u0442\u0430 Git \u043d\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u043b.<\/li>\n<\/ol>\n<p>  <a name=\"builders\"><\/a><u><\/p>\n<h4>5.6 builders<\/h4>\n<p><\/u>  <\/p>\n<pre><code class=\"python\"> c['builders'] = [] c['builders'].append(util.BuilderConfig(name=&quot;runtests&quot;,                                         workernames=[&quot;example-worker&quot;],                                         factory=factory)) <\/code><\/pre>\n<p>  \u041e \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 <i>Builder <\/i>\u0431\u044b\u043b\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043d\u043e <a href=\"#builder\">\u0437\u0434\u0435\u0441\u044c<\/a>. \u0421\u0435\u0439\u0447\u0430\u0441 \u044f \u043f\u043e\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u0435\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c. <i>BuilderConfig <\/i>\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u043c <i>builder<\/i>. \u0422\u0430\u043a\u0438\u0445 \u043a\u043e\u043d\u0441\u0442\u0440\u0443\u043a\u0442\u043e\u0440\u043e\u0432 \u0432 <i>c[&#8216;builders&#8217;] <\/i>\u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u044d\u0442\u043e \u043b\u0438\u0441\u0442 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 <i>builder <\/i>\u0442\u0438\u043f\u0430. \u0421\u0435\u0439\u0447\u0430\u0441 \u0447\u0443\u0442\u044c \u043f\u0435\u0440\u0435\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440 \u043e\u0442 <b>BuildBot<\/b>, \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0432 \u0435\u0433\u043e \u043a \u043d\u0430\u0448\u0435\u0439 \u0437\u0430\u0434\u0430\u0447\u0435.   <\/p>\n<pre><code class=\"python\"> c['builders'] = [] c['builders'].append(util.BuilderConfig(name=&quot;yourProject&quot;,                                             workernames=[&quot;yourWorkerName&quot;],                                             factory=factory)) <\/code><\/pre>\n<p>  \u0422\u0435\u043f\u0435\u0440\u044c \u0440\u0430\u0441\u043a\u0430\u0436\u0443 \u043e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 <i>BuilderConfig<\/i>. <\/p>\n<p>  <i>name <\/i>\u0437\u0430\u0434\u0430\u0435\u0442 \u0438\u043c\u044f <i>builder<\/i>-a. \u0417\u0434\u0435\u0441\u044c \u043c\u044b \u043d\u0430\u0437\u0432\u0430\u043b\u0438 \u0435\u0433\u043e <i>yourProject<\/i>. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e \u043d\u0430 <b>Worker<\/b>-\u0435 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u043d \u044d\u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u043f\u0443\u0442\u044c <i>\/home\/habr\/worker\/yourProject\/build<\/i>. <i>Sheduler <\/i>\u043e\u0442\u044b\u0441\u043a\u0438\u0432\u0430\u0435\u0442 <i>builder <\/i>\u043a\u0430\u043a \u0440\u0430\u0437 \u043f\u043e \u044d\u0442\u043e\u043c\u0443 \u0438\u043c\u0435\u043d\u0438.<\/p>\n<p>  <i>workernames <\/i>\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u0438\u0441\u0442 <b>Worker<\/b>-\u043e\u0432. \u041a\u0430\u0436\u0434\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d \u0432 <i>c[&#8216;workers&#8217;]<\/i>.<\/p>\n<p>  <i>factory <\/i> \u2014 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 <i>build<\/i>, \u0441 \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d <i>builder<\/i>. \u041e\u043d \u043f\u043e\u0448\u043b\u0435\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 <i>build <\/i>\u043d\u0430 <b>Worker <\/b>\u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0445 \u0448\u0430\u0433\u043e\u0432, \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u0432 \u0441\u043e\u0441\u0442\u0430\u0432 \u044d\u0442\u043e\u0433\u043e <i>build<\/i>-a.<\/p>\n<p>  <a name=\"myconfig\"><\/a><\/p>\n<h3>6. \u041f\u0440\u0438\u043c\u0435\u0440 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438<\/h3>\n<hr\/>\n<p>  \u0412\u043e\u0442 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u044f \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 <b>BuildBot<br \/>  <\/b>.<\/p>\n<p>  \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044f \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <i>svn<\/i>. \u0421\u0430\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0432 \u043d\u0435\u043a\u043e\u0435\u043c \u043e\u0431\u043b\u0430\u043a\u0435. \u0412\u043e\u0442 \u0430\u0434\u0440\u0435\u0441 \u044d\u0442\u043e\u0433\u043e \u043e\u0431\u043b\u0430\u043a\u0430 <i><a href=\"https:\/\/svn.host\/svn\/yourProject\/trunk\">svn.host\/svn\/yourProject\/trunk<\/a><\/i>. \u0412 \u043e\u0431\u043b\u0430\u043a\u0435 \u043f\u043e\u0434 <i>svn <\/i>\u0435\u0441\u0442\u044c \u0443\u0447\u0451\u0442\u043a\u0430 username: <i>user<\/i>, passwd: <i>password<\/i>. \u0421\u043a\u0440\u0438\u043f\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0438\u0437 \u0441\u0435\u0431\u044f \u0448\u0430\u0433\u0438 <i>build<\/i>-a \u0431\u0443\u0434\u0443\u0442 \u0442\u0430\u043a\u0436\u0435 \u043b\u0435\u0436\u0430\u0442\u044c \u0432 \u0432\u0435\u0442\u043a\u0435 <i>svn<\/i>, \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u043f\u0430\u043f\u043a\u0435 <i>buildbot\/worker_linux<\/i>. \u042d\u0442\u0438 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043b\u0435\u0436\u0430\u0442 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0441 \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u043c \u0441\u0432\u043e\u0439\u0441\u0442\u0432\u043e\u043c <i>executable<\/i>.<\/p>\n<p>  <b>BuildMaster <\/b>\u0438 <b>Worker <\/b>\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u0430 \u043e\u0434\u043d\u043e\u043c \u0445\u043e\u0441\u0442\u0435 <i>project.host <\/i>.<b>BuildMaster <\/b>\u0445\u0440\u0430\u043d\u0438\u0442 \u0441\u0432\u043e\u0438 \u0444\u0430\u0439\u043b\u044b \u0432 \u043f\u0430\u043f\u043a\u0435 <i>\/home\/habr\/master<\/i>. <b>Worker <\/b>\u0436\u0435 \u0445\u0440\u0430\u043d\u0438\u0442 \u043f\u043e \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u043f\u0443\u0442\u0438 <i>\/home\/habr\/worker<\/i>. \u0421\u0432\u044f\u0437\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432 <b>BuildMaster<\/b>-\u0430 \u0438 <b>Worker<\/b>-\u0430 \u0432\u0435\u0434\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 4000 \u043f\u043e\u0440\u0442 \u043f\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0443 <b>BuildBot<\/b>-a, \u0442\u043e \u0435\u0441\u0442\u044c <i>&#8216;pb&#8217; <\/i>\u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b.<\/p>\n<p>  \u0426\u0435\u043b\u0435\u0432\u043e\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0430 python-\u0435. \u0417\u0430\u0434\u0430\u0447\u0430 \u043e\u0442\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0435\u0433\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f, \u0441\u043e\u0437\u0434\u0430\u0442\u044c executable \u0444\u0430\u0439\u043b, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u043f\u0440\u043e\u0432\u0435\u0441\u0442\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 failure \u043d\u0443\u0436\u043d\u043e \u0432\u0441\u0435\u043c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0430\u043c \u043e\u0442\u043e\u0441\u043b\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u043e\u0447\u0442\u0443 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0441\u0442\u044c \u043d\u0435\u0443\u0434\u0430\u0447\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435.<\/p>\n<p>  Web \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 <b>BuildBot <\/b>\u043c\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u043d\u0430 80 \u043f\u043e\u0440\u0442 \u0434\u043b\u044f <i>project.host<\/i>. Apatch \u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e. \u0412 \u0441\u043e\u0441\u0442\u0430\u0432\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <i>twisted <\/i>\u0443\u0436\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442 web \u0441\u0435\u0440\u0432\u0435\u0440, <b>BuildBot <\/b>\u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442. <\/p>\n<p>  \u0414\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f <b>BuildBot <\/b>\u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <i>sqlite<\/i>.<\/p>\n<p>  \u0414\u043b\u044f \u043f\u043e\u0447\u0442\u043e\u0432\u043e\u0439 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0443\u0436\u0435\u043d \u0445\u043e\u0441\u0442 <i>smtp.your.domain <\/i> \u2014 \u043d\u0430 \u043d\u0435\u043c \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u0438\u0441\u0435\u043c \u0441 \u043f\u043e\u0447\u0442\u044b <i>projectHost@your.domain <\/i>\u0431\u0435\u0437 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u0422\u0430\u043a \u0436\u0435 \u043d\u0430 \u0445\u043e\u0441\u0442\u0435 \u2018<i>smtp <\/i>\u2018 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u0441\u043b\u0443\u0448\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043f\u043e\u0441\u0442\u0443 1025.<\/p>\n<p>  \u0417\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u043b\u0438\u0446 \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0434\u0432\u043e\u0435: <i>admin <\/i>\u0438 <i>user<\/i>. admin \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 <b>BuildBot<\/b>. user \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043b\u0438\u0446\u043e\u043c, \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u044e\u0449\u0438\u043c <i>commit<\/i>-\u044b.<\/p>\n<p>  Exacutable \u0444\u0430\u0439\u043b \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <i>pyinstaller<\/i>. \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <i>doxygen<\/i>.<\/p>\n<p>  \u0414\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b \u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0432\u043e\u0442 \u0442\u0430\u043a\u043e\u0439 <i>master.cfg<\/i>:<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">master.cfg<\/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('yourWorkerName', 'password') ] c['protocols'] = {'pb': {'port': 4000}}    svn_poller = changes.SVNPoller(repourl=&quot;https:\/\/svn.host\/svn\/yourProject\/trunk&quot;,                                 svnuser=&quot;user&quot;,                                 svnpasswd=&quot;password&quot;,                                 pollinterval=60, \t\t\t\tsplit_file=util.svn.split_file_alwaystrunk                                 )  c['change_source'] =  svn_poller  hourlyscheduler = schedulers.SingleBranchScheduler(                                 name=&quot;your-project-schedulers&quot;, \t\t\t\tchange_filter=util.ChangeFilter(branch=None),                                 builderNames=[&quot;yourProject&quot;], \t\t\t\tproperties = {'owner': 'admin'}                                 )  c['schedulers'] = [hourlyscheduler]  checkout = steps.SVN(repourl='https:\/\/svn.host\/svn\/yourProject\/trunk',                         mode='full',                         method='fresh',                         username=&quot;user&quot;,                         password=&quot;password&quot;,                         haltOnFailure=True)  \t projectHost_build = util.BuildFactory()     cleanProject = steps.ShellCommand(name=&quot;Clean&quot;,                  command=[&quot;buildbot\/worker_linux\/pyinstaller_project&quot;, &quot;clean&quot;]                                 ) buildProject = steps.ShellCommand(name=&quot;Build&quot;,                  command=[&quot;buildbot\/worker_linux\/pyinstaller_project&quot;, &quot;build&quot;]                                 ) doxyProject = steps.ShellCommand(name=&quot;Update Docs&quot;,                                 command=[&quot;buildbot\/worker_linux\/gendoc&quot;, []]                                 ) testProject = steps.ShellCommand(name=&quot;Tests&quot;,                                 command=[&quot;python&quot;,&quot;tests\/utest.py&quot;],                                 env={'PYTHONPATH': '.'}                                 )  projectHost_build.addStep(checkout) projectHost_build.addStep(cleanProject) projectHost_build.addStep(buildProject) projectHost_build.addStep(doxyProject) projectHost_build.addStep(testProject)   c['builders'] = [         util.BuilderConfig(name=&quot;yourProject&quot;, workername='yourWorkerName', factory=projectHost_build) ]   template_html=u'''\\ &lt;h4&gt;\u0421\u0442\u0430\u0442\u0443\u0441 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430: {{ summary }}&lt;\/h4&gt; &lt;p&gt;\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u0430\u0435\u043d\u0438\u044f: {{ workername }}&lt;\/p&gt; &lt;p&gt;\u041f\u0440\u043e\u0435\u043a\u0442: {{ projects }}&lt;\/p&gt; &lt;p&gt;\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0439\u0434\u0438\u0442\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435: {{ buildbot_url }}&lt;\/p&gt; &lt;p&gt;\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0439\u0434\u0438\u0442\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435: {{ build_url }}&lt;\/p&gt; &lt;p&gt;\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f WinSCP \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 c ip:xxx.xx.xxx.xx. \u0412\u043e\u0439\u0434\u044f \u043f\u043e\u0434 habr\/password, \u0437\u0430\u0431\u0440\u0430\u0442\u044c \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 executable \u0444\u0430\u0439\u043b \u0441 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 ~\/worker\/yourProject\/build\/dist.&lt;\/p&gt; &lt;p&gt;&lt;b&gt;\u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u043e \u0447\u0435\u0440\u0435\u0437 Buildbot&lt;\/b&gt;&lt;\/p&gt; '''  sendMessageToAll = reporters.MailNotifier(fromaddr=&quot;projectHost@your.domain&quot;, \t\t\t\t\tsendToInterestedUsers=True, \t\t\t\t\tlookup=&quot;your.domain&quot;, \t\t\t\t\trelayhost=&quot;smtp.your.domain&quot;, \t\t\t\t\tsmtpPort=1025, \t\t\t\t\tmode=&quot;warnings&quot;, \t\t\t\t\textraRecipients=['user@your.domain'],               messageFormatter=reporters.MessageFormatter( \t\t\t\t\t\ttemplate=template_html, \t\t\t\t\t\ttemplate_type='html', \t\t\t\t\t\twantProperties=True,                                                  wantSteps=True) \t\t\t\t\t) c['services'] = [sendMessageToAll]  c['title'] = &quot;The process of bulding&quot; c['titleURL'] = &quot;http:\/\/project.host:80\/&quot;  c['buildbotURL'] = &quot;http:\/\/project.host&quot;  c['www'] = dict(port=80,                 plugins=dict(waterfall_view={}, console_view={}, grid_view={}))   c['db'] = {     'db_url' : &quot;sqlite:\/\/\/state.sqlite&quot; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e <a href=\"#master\">\u0441\u043e\u0437\u0434\u0430\u0442\u044c<\/a> <b>BuildMaster<\/b>-\u0430 \u0438 <b>Worker<\/b>-a. \u0417\u0430\u0442\u0435\u043c \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b <i>master.cfg <\/i>\u0432 <i>\/home\/habr\/master<\/i>.<\/p>\n<p>  \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u043c \u0448\u0430\u0433\u043e\u043c \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043b\u0443\u0436\u0431\u0443 <b>BuildMaster<\/b>-\u0430  <\/p>\n<pre><code class=\"bash\"> sudo buildbot start \/home\/habr\/master <\/code><\/pre>\n<p>  \u0417\u0430\u0442\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u043b\u0443\u0436\u0431\u0443 <b>Worker<\/b>-a  <\/p>\n<pre><code class=\"bash\"> buildbot-worker start \/home\/habr\/worker <\/code><\/pre>\n<p>  \u0413\u043e\u0442\u043e\u0432\u043e! \u0422\u0435\u043f\u0435\u0440\u044c <b>Buildbot <\/b>\u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0438 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c \u043f\u043e <i>commit<\/i>-\u0443 \u0432 <i>svn<\/i>, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u0448\u0430\u0433\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0441 \u0432\u044b\u0448\u0435\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u043e\u0439.<\/p>\n<p>  \u041d\u0438\u0436\u0435 \u044f \u0440\u0430\u0441\u043f\u0438\u0448\u0443 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u0432\u044b\u0448\u0435\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e <i>master.cfg.<br \/>  <\/i><\/p>\n<p>  <a name=\"fails\"><\/a><u><\/p>\n<h4>6.1 \u041d\u0430 \u043f\u0443\u0442\u0438 \u043a \u0441\u0432\u043e\u0435\u043c\u0443 master.cfg<\/h4>\n<p><\/u><br \/>  \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044f \u0441\u0432\u043e\u0435\u0433\u043e <i>master.cfg<\/i> \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043e \u043d\u0435\u043c\u0430\u043b\u043e \u043e\u0448\u0438\u0431\u043e\u043a, \u043f\u043e\u0442\u043e\u043c\u0443 \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0447\u0442\u0435\u043d\u0438\u0435 log-\u0444\u0430\u0439\u043b\u0430. \u041e\u043d \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u043a\u0430\u043a \u043d\u0430 <b>BuildMaster<\/b>-e c \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u043c \u043f\u0443\u0442\u0435\u043c <i>\/home\/habr\/master\/twistd.log<\/i>, \u0442\u0430\u043a \u0438 \u043d\u0430 \u0441\u0442\u043e\u0440\u043e\u043d\u0435 <b>Worker<\/b>-a \u0441 \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u043c \u043f\u0443\u0442\u0435\u043c <i>\/home\/habr\/worker\/twistd.log<\/i>. \u041f\u043e \u043c\u0435\u0440\u0435 \u0447\u0442\u0435\u043d\u0438\u044f \u043e\u0448\u0438\u0431\u043a\u0438 \u0438 \u0435\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u043b\u0443\u0436\u0431\u044b <b>BuildMaster<\/b>-a. \u0412\u043e\u0442 \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f:  <\/p>\n<pre><code class=\"bash\"> sudo buildbot stop \/home\/habr\/master sudo buildbot upgrade-master \/home\/habr\/master sudo buildbot start \/home\/habr\/master <\/code><\/pre>\n<p>  <a name=\"svn\"><\/a><u><\/p>\n<h4>6.2 \u0420\u0430\u0431\u043e\u0442\u0430 \u0441 svn<\/h4>\n<p><\/u>  <\/p>\n<pre><code class=\"python\"> svn_poller = changes.SVNPoller(repourl=&quot;https:\/\/svn.host\/svn\/yourProject\/trunk&quot;,                                svnuser=&quot;user&quot;,                                svnpasswd=&quot;password&quot;,                                pollinterval=60,                                split_file=util.svn.split_file_alwaystrunk                         )  c['change_source'] =  svn_poller  hourlyscheduler = schedulers.SingleBranchScheduler(                             name=&quot;your-project-schedulers&quot;,                             change_filter=util.ChangeFilter(branch=None),                             builderNames=[&quot;yourProject&quot;],                             properties = {'owner': 'admin'}                         )  c['schedulers'] = [hourlyscheduler]  checkout = steps.SVN(repourl='https:\/\/svn.host\/svn\/yourProject\/trunk',                      mode='full',                      method='fresh',                      username=&quot;user&quot;,                      password=&quot;password&quot;,                      haltOnFailure=True) <\/code><\/pre>\n<p>  \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u0437\u0433\u043b\u044f\u043d\u0435\u043c \u043d\u0430 <i>svn_poller<\/i>. \u042d\u0442\u043e \u0432\u0441\u0435 \u0442\u043e\u0442 \u0436\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u0440\u0435\u0433\u0443\u043b\u044f\u0440\u043d\u043e \u043e\u043f\u0440\u0430\u0448\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0440\u0430\u0437 \u0432 \u043c\u0438\u043d\u0443\u0442\u0443. \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 <i>svn_poller <\/i>\u043e\u0431\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u043a \u0432\u0435\u0442\u043a\u0435 <i>trunk<\/i>. \u0417\u0430\u0433\u0430\u0434\u043e\u0447\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <i>split_file=util.svn.split_file_alwaystrunk <\/i>\u0437\u0430\u0434\u0430\u0435\u0442 \u043f\u0440\u0430\u0432\u0438\u043b\u0430: \u043a\u0430\u043a \u0440\u0430\u0437\u0431\u0438\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043f\u0430\u043f\u043e\u043a <i>svn <\/i>\u043d\u0430 \u0432\u0435\u0442\u043a\u0438. \u041e\u043d \u0436\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u0438\u043c \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0443\u0442\u0438. \u0412 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c <i>split_file_alwaystrunk <\/i>\u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0433\u043e\u0432\u043e\u0440\u044f \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0442\u043e\u043b\u044c\u043a\u043e <i>trunk<\/i>.<\/p>\n<p>  \u0412 <i>Schedulers <\/i>\u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <i>ChangeFilter<\/i>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0438\u0434\u0438\u0442 <i>None <\/i>\u0438 \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u0443\u0435\u0442 \u0441 \u043d\u0438\u043c \u0432\u0435\u0442\u043a\u0443 <i>trunk <\/i>\u043f\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0439 \u0430\u0441\u0441\u043e\u0446\u0438\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 <i>split_file_alwaystrunk<\/i>. \u0420\u0435\u0430\u0433\u0438\u0440\u0443\u044f \u043d\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 <i>trunk<\/i>, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 <i>builder <\/i>c \u0438\u043c\u0435\u043d\u0435\u043c <i>yourProject<\/i>. <\/p>\n<p>  <i>properties <\/i>\u0437\u0434\u0435\u0441\u044c \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0430\u0434\u043c\u0438\u043d \u043f\u043e\u043b\u0443\u0447\u0430\u043b \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0443 \u0443 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u0445 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043a\u0430\u043a \u0432\u043b\u0430\u0434\u0435\u043b\u0435\u0446 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430.<\/p>\n<p>  \u0428\u0430\u0433 <i>build<\/i>-a <i>checkout <\/i>\u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043b\u044e\u0431\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432, \u043b\u0435\u0436\u0430\u0449\u0438\u0445 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f <b>Worker<\/b>-\u0430. A \u0437\u0430\u0442\u0435\u043c \u0434\u0435\u043b\u0430\u0442\u044c \u043f\u043e\u043b\u043d\u044b\u0439 <i>svn update<\/i>. \u0420\u0435\u0436\u0438\u043c \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <i>mode=full<\/i>, <i>method=fresh<\/i>. \u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <i>haltOnTailure <\/i>\u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 <i>svn update <\/i>\u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u0442\u043e \u0432\u0435\u0441\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043d\u0435 \u0438\u043c\u0435\u044e\u0442 \u0441\u043c\u044b\u0441\u043b\u0430.<\/p>\n<p>  <a name=\"reporter\"><\/a><u><\/p>\n<h4>6.3 \u0412\u0430\u043c \u043f\u0438\u0441\u044c\u043c\u043e: reporters \u0443\u043f\u043e\u043b\u043d\u043e\u043c\u043e\u0447\u0435\u043d \u0437\u0430\u044f\u0432\u0438\u0442\u044c<\/h4>\n<p><\/u><br \/>  <i>reporters <\/i> \u2014 \u044d\u0442\u043e \u0441\u0435\u0440\u0432\u0438\u0441 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u043f\u043e\u0447\u0442\u0443.  <\/p>\n<pre><code class=\"python\"> template_html=u'''\\ &lt;h4&gt;\u0421\u0442\u0430\u0442\u0443\u0441 \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0435\u043b\u0438\u0437\u0430: {{ summary }}&lt;\/h4&gt; &lt;p&gt;\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f \u043f\u043e\u0441\u0442\u0440\u0430\u0435\u043d\u0438\u044f: {{ workername }}&lt;\/p&gt; &lt;p&gt;\u041f\u0440\u043e\u0435\u043a\u0442: {{ projects }}&lt;\/p&gt; &lt;p&gt;\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0439\u0434\u0438\u0442\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435: {{ buildbot_url }}&lt;\/p&gt; &lt;p&gt;\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e \u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0439\u0434\u0438\u0442\u0435 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435: {{ build_url }}&lt;\/p&gt; &lt;p&gt;\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f WinSCP \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 c ip:xxx.xx.xxx.xx. \u0412\u043e\u0439\u0434\u044f \u043f\u043e\u0434 habr\/password, \u0437\u0430\u0431\u0440\u0430\u0442\u044c \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 executable \u0444\u0430\u0439\u043b \u0441 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 ~\/worker\/yourProject\/build\/dist.&lt;\/p&gt; &lt;p&gt;&lt;b&gt;\u041f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0435\u043d\u043e \u0447\u0435\u0440\u0435\u0437 Buildbot&lt;\/b&gt;&lt;\/p&gt; '''                          sendMessageToAll = reporters.MailNotifier(fromaddr=&quot;projectHost@your.domain&quot;,                                           sendToInterestedUsers=True,                                           lookup=&quot;your.domain&quot;,                                           relayhost=&quot;smtp.your.domain&quot;,                                           smtpPort=1025,                                           mode=&quot;warnings&quot;,                                           extraRecipients=['user@your.domain'],                                     messageFormatter=reporters.MessageFormatter(                                                     template=template_html,                                                     template_type='html',                                                     wantProperties=True,                                                      wantSteps=True)                                         ) c['services'] = [sendMessageToAll]  <\/code><\/pre>\n<p>  \u041e\u043d \u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0441\u0441\u044b\u043b\u0430\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f <a href=\"http:\/\/docs.buildbot.net\/current\/manual\/configuration\/reporters.html\">\u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u0441\u043f\u043e\u0441\u043e\u0431\u0430\u043c\u0438<\/a>. <\/p>\n<p>  <i>MailNotifier <\/i>\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043f\u043e\u0447\u0442\u0443 \u0434\u043b\u044f \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438 \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439.<\/p>\n<p>  <i>template_html <\/i>\u0437\u0430\u0434\u0430\u0435\u0442 \u0448\u0430\u0431\u043b\u043e\u043d \u0442\u0435\u043a\u0441\u0442\u0430 \u0434\u043b\u044f \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438. \u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f html. \u041e\u043d \u043c\u043e\u0434\u0438\u0444\u0438\u0446\u0438\u0440\u043e\u0432\u0430\u043d \u0434\u0432\u0438\u0436\u043a\u043e\u043c <a href=\"http:\/\/jinja.pocoo.org\/docs\/dev\/templates\/\"><i>jinja2 <\/i><\/a>(\u043c\u043e\u0436\u043d\u043e \u0441\u0440\u0430\u0432\u043d\u0438\u0442\u044c \u0441 <i>django<\/i>). <b>BuildBot <\/b>\u0438\u043c\u0435\u0435\u0442 \u043d\u0430\u0431\u043e\u0440 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0432 \u0448\u0430\u0431\u043b\u043e\u043d \u0432 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0442\u0435\u043a\u0441\u0442\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f. \u042d\u0442\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u043f\u0438\u0441\u0430\u043d\u044b \u0432 {{ \u0434\u0432\u043e\u0439\u043d\u044b\u0435 \u0444\u0438\u0433\u0443\u0440\u043d\u044b\u0435 \u0441\u043a\u043e\u0431\u043a\u0438 }}. \u0422\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <i>summary <\/i>\u0432\u044b\u0432\u043e\u0434\u0438\u0442 \u0441\u0442\u0430\u0442\u0443\u0441 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u0442\u043e \u0435\u0441\u0442\u044c success \u0438\u043b\u0438 failure. \u0410 <i>projects <\/i>\u0432\u044b\u0432\u0435\u0434\u0435\u0442 <i>yourProject<\/i>. \u0422\u0430\u043a, \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0432 <i>jinja2<\/i>, \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 <b>BuildBot<\/b>-\u0430 \u0438 \u0441\u0440\u0435\u0434\u0441\u0442\u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0440\u043e\u043a python \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u043f\u043e\u043b\u043d\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435.<\/p>\n<p>  <i>MailNotifier <\/i>\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b. <\/p>\n<p>  <i>fromaddr <\/i>\u2013 \u0430\u0434\u0440\u0435\u0441, \u0441 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u0441\u0435\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0430. <\/p>\n<p>  <i>sendToInterestedUsers<\/i>=True \u043e\u0442\u0441\u044b\u043b\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0443 \u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0434\u0435\u043b\u0430\u043b <i>commit<\/i>. <\/p>\n<p>  <i>lookup <\/i> \u2014 \u0441\u0443\u0444\u0444\u0438\u043a\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430\u0434\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u0438\u043c\u0435\u043d\u0430\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439, \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0449\u0438\u043c \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0443. \u0422\u0430\u043a <i>admin <\/i>\u043a\u0430\u043a \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0443 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 admin@your.domain. <\/p>\n<p>  <i>relayhost <\/i>\u0437\u0430\u0434\u0430\u0435\u0442 \u0438\u043c\u044f \u0445\u043e\u0441\u0442\u0430, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043e\u0442\u043a\u0440\u044b\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 <i>smtp<\/i>, a <i>smptPort <\/i>\u0437\u0430\u0434\u0430\u0435\u0442 \u043d\u043e\u043c\u0435\u0440 \u043f\u043e\u0440\u0442\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043b\u0443\u0448\u0430\u0435\u0442 <i>smtp <\/i>\u0441\u0435\u0440\u0432\u0435\u0440. <\/p>\n<p>  <i>mode=\u00abwarning\u00bb <\/i>\u0433\u043e\u0432\u043e\u0440\u0438\u0442, \u0447\u0442\u043e \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0443\u0436\u043d\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e\u0433\u043e \u0448\u0430\u0433\u0430 <i>build<\/i>-\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u043b\u0441\u044f \u0441\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u043c failure \u0438\u043b\u0438 warning. \u0412 \u0441\u043b\u0443\u0447\u0430\u0435 success \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0443 \u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f.<\/p>\n<p>  <i>extraRecipients <\/i>\u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u043b\u0438\u0446, \u043a\u043e\u043c\u0443 \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0443 \u043f\u043e\u043c\u0438\u043c\u043e \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 \u0438 \u043b\u0438\u0446\u0430, \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0438\u0432\u0448\u0435\u0433\u043e <i>commit<\/i>.<\/p>\n<p>  <i>messageFormatter <\/i>\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u043c, \u0437\u0430\u0434\u0430\u044e\u0449\u0438\u043c \u0444\u043e\u0440\u043c\u0430\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0435\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d, \u0438 \u043d\u0430\u0431\u043e\u0440 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0438\u0437 <i>jinja2<\/i>. \u0422\u0430\u043a\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b, \u043a\u0430\u043a <i>wantProperties=True <\/i>\u0438 <i>wantSteps=True <\/i>\u0437\u0430\u0434\u0430\u044e\u0442 \u044d\u0442\u043e\u0442 \u043d\u0430\u0431\u043e\u0440 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.<\/p>\n<p>  <i>\u0441[&#8216;services&#8217;]=[sendMessageToAll]<\/i> \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u043f\u0438\u0441\u043e\u043a \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, \u0441\u0440\u0435\u0434\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438 \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0448 <i>reporter<\/i>.<\/p>\n<p>  <a name=\"goodboy\"><\/a><\/p>\n<h3>\u041c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u044d\u0442\u043e! \u041c\u043e\u0438 \u043f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f<\/h3>\n<hr\/>\n<p>  \u041c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0438 \u0443\u0432\u0438\u0434\u0435\u043b\u0438 \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b, \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d <b>BuildBot<\/b>. \u042d\u0442\u043e\u0433\u043e, \u0434\u0443\u043c\u0430\u044e, \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u044f\u0442\u044c, \u043d\u0443\u0436\u0435\u043d \u043b\u0438 \u044d\u0442\u043e\u0442 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041e\u043d \u0432\u0430\u043c \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0435\u043d? \u041e\u043d \u0432\u0430\u043c \u043f\u0440\u0438\u0433\u043e\u0434\u0438\u0442\u0441\u044f? \u0421 \u043d\u0438\u043c \u0443\u0434\u043e\u0431\u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c? \u0422\u043e\u0433\u0434\u0430 \u044f \u043f\u0438\u0441\u0430\u0442\u044c \u044d\u0442\u0443 \u0441\u0442\u0430\u0442\u044c\u044e \u043d\u0435 \u0437\u0440\u044f. <\/p>\n<p>  \u0418 \u0435\u0449\u0435. \u0425\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b, \u0447\u0442\u043e\u0431\u044b \u043f\u0440\u043e\u0444\u0435\u0441\u0441\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0435\u0435 <b>BuildBot<\/b>, \u0441\u0442\u0430\u043b\u043e \u0448\u0438\u0440\u0435, \u043c\u0430\u043d\u0443\u0430\u043b\u044b \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u043b\u0438\u0441\u044c, \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u043e\u0441\u044c \u0435\u0449\u0435 \u0431\u043e\u043b\u044c\u0448\u0435. <\/p>\n<p>  \u0412\u0441\u0435\u043c \u0441\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435. \u0423\u0434\u0430\u0447\u0438.<\/p><\/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\/460501\/\"> https:\/\/habr.com\/ru\/post\/460501\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"\n<div class=\"post__text post__text-html js-mediator-article\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/webt\/jj\/-4\/-g\/jj-4-gindpovkdi6rbmzxax4yqu.jpeg\" alt=\"BuildBot \u043f\u0440\u043e\u0431\u043d\u0430\u044f \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f\"\/><br \/>  <i>(Image by <a href=\"https:\/\/pixabay.com\/users\/Computerizer-4588466\/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=2301646\">Computerizer<\/a> from <a href=\"https:\/\/pixabay.com\/?utm_source=link-attribution&amp;amp;utm_medium=referral&amp;amp;utm_campaign=image&amp;amp;utm_content=2301646\">Pixabay)<\/a><br \/>  <\/i><br \/>  \u041f\u0440\u0438\u0432\u0435\u0442! <\/p>\n<p>  \u041c\u0435\u043d\u044f \u0437\u043e\u0432\u0443\u0442 <b>\u0415\u0432\u0433\u0435\u043d\u0438\u0439 \u0427\u0435\u0440\u043a\u0438\u043d<\/b>, \u044f \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0432 \u0433\u043e\u0440\u043d\u043e\u0434\u043e\u0431\u044b\u0432\u0430\u044e\u0449\u0435\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 <b>Polymetal<\/b>. <\/p>\n<p>  \u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u044f \u043a \u043b\u044e\u0431\u043e\u043c\u0443 \u043a\u0440\u0443\u043f\u043d\u043e\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0448\u044c \u0437\u0430\u0434\u0443\u043c\u044b\u0432\u0430\u0442\u044c\u0441\u044f: \u00ab\u041a\u0430\u043a\u043e\u0439 \u0436\u0435 \u0441\u043e\u0444\u0442 \u043b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0435\u0433\u043e \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f?\u00bb. IT-\u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u043f\u0443\u0441\u043a\u043e\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u0440\u044f\u0434 \u044d\u0442\u0430\u043f\u043e\u0432. \u0425\u043e\u0440\u043e\u0448\u043e, \u043a\u043e\u0433\u0434\u0430 \u0446\u0435\u043f\u043e\u0447\u043a\u0430 \u044d\u0442\u0438\u0445 \u044d\u0442\u0430\u043f\u043e\u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u0430. \u0421\u0430\u043c \u043f\u043e \u0441\u0435\u0431\u0435 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0432\u044b\u043f\u0443\u0441\u043a\u0430 \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 IT-\u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <i>Continuous Integration<\/i>. <b>BuildBot <\/b>\u0434\u043b\u044f \u043d\u0430\u0441 \u043e\u043a\u0430\u0437\u0430\u043b\u0441\u044f \u0445\u043e\u0440\u043e\u0448\u0438\u043c \u043f\u043e\u043c\u043e\u0449\u043d\u0438\u043a\u043e\u043c, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u043c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441.<\/p>\n<p>  \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0440\u0435\u0448\u0438\u043b \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043e\u0431\u0437\u043e\u0440 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0435\u0439 <b>BuildBot<\/b>. \u041d\u0430 \u0447\u0442\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0435\u043d \u044d\u0442\u043e\u0442 \u0441\u043e\u0444\u0442? \u041a\u0430\u043a \u043a \u043d\u0435\u043c\u0443 \u043f\u043e\u0434\u0441\u0442\u0443\u043f\u0438\u0442\u044c\u0441\u044f \u0438 \u043a\u0430\u043a \u0432\u044b\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441 \u043d\u0438\u043c \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u044b\u0435 \u042d\u0424\u0424\u0415\u041a\u0422\u0418\u0412\u041d\u042b\u0415 \u0420\u0410\u0411\u041e\u0427\u0418\u0415 \u041e\u0422\u041d\u041e\u0428\u0415\u041d\u0418\u042f? \u041d\u0430\u0448 \u043e\u043f\u044b\u0442 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0438 \u0443 \u0441\u0435\u0431\u044f, \u0441\u043e\u0437\u0434\u0430\u0432 \u043d\u0430 \u0441\u0432\u043e\u0435\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0435\u0440\u0432\u0438\u0441 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.   <\/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-292227","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/292227","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=292227"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/292227\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=292227"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=292227"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=292227"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}