{"id":466149,"date":"2025-07-05T21:00:07","date_gmt":"2025-07-05T21:00:07","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=466149"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=466149","title":{"rendered":"<span>BASS: CI, \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u0432\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u043d\u0438\u0431\u0443\u0434\u044c continuous integration \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f (BuildBot, Jenkins, TravisCI, &#8230;) \u2014 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043e\u043d\u0441\u0442\u0440\u0443\u043e\u0437\u043d\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0434 \u0437\u0430\u043f\u0443\u0441\u043a \u043d\u0435\u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438. \u0417\u0430\u0439\u0442\u0438 \u043d\u0430 slave \u0438 \u043f\u043e\u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u2014 \u043d\u0435 \u0434\u0430\u0434\u0443\u0442. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0434\u0430\u0436\u0435 \u0442\u0435 \u0436\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 BuildBot \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0443\u0436\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f web-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u0430 \u043d\u0435 HTML \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438, \u0447\u0442\u043e \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u043e\u0435 \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e.<\/p>\n<p> \u0410 \u043c\u043e\u0436\u043d\u043e \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u043f\u0440\u043e\u0449\u0435 \u0438 \u043f\u043e\u043b\u0435\u0433\u0447\u0435? \u0418 \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u043c: GNU\/Linux \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439, <a href=\"https:\/\/habr.com\/ru\/articles\/490408\/\">\u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e<\/a>, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u0444\u0442\u0430.<\/p>\n<p> <a name=\"habracut\"><\/a> <\/p>\n<h2>BASS<\/h2>\n<p> <a href=\"http:\/\/www.bass.cypherpunks.su\/\" rel=\"nofollow noopener noreferrer\">BASS: Build Automation Steady System<\/a> \u2014 Simple as bass guitar with only a few strings, yet as powerful!<\/p>\n<p> \u0427\u0442\u043e \u043d\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e? \u041d\u0435\u043a\u0438\u0439 master \u0441\u0435\u0440\u0432\u0435\u0440, \u0446\u0435\u043d\u0442\u0440\u0430\u043b\u044c\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430, \u0440\u0430\u0437\u0434\u0430\u044e\u0449\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0438. Slave-\u044b, \u0437\u0430\u0431\u0438\u0440\u0430\u044e\u0449\u0438\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0435 \u0438 \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u044e\u0449\u0438\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b. \u0417\u0430\u0434\u0430\u0447\u0435\u0439 (task), \u0432 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f shell-\u0441\u043a\u0440\u0438\u043f\u0442, \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0447\u0442\u043e \u043d\u0430\u0434\u043e \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u0442\u044c (slave input). \u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 (job) \u2014 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0441\u043e \u0432\u0441\u044f\u043a\u0438\u043c\u0438 \u0436\u0443\u0440\u043d\u0430\u043b\u0430\u043c\u0438, \u0438\u0442\u043e\u0433\u0430\u043c\u0438 \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u0430\u043c\u0438 \u0441\u0431\u043e\u0440\u043a\u0438.<\/p>\n<p> \u0414\u043b\u044f \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e \u043d\u0435 \u043d\u0443\u0436\u043d\u043e \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0431\u0430\u0437 \u0434\u0430\u043d\u043d\u044b\u0445, \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e API\/RPC \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430, \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0430 \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439\/\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u043e\u043a \u0438\u043b\u0438 \u0447\u0435\u0433\u043e-\u043b\u0438\u0431\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0433\u043e. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b NFS. \u0410 \u0435\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u043a \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440\u0435 (\u0434\u043b\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u0438), \u0442\u043e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u043c\u0435\u0448\u0430\u0435\u0442 \u0438 \u0431\u0435\u0437 \u043d\u0435\u0451 \u043e\u0431\u043e\u0439\u0442\u0438\u0441\u044c, \u0430 \u0442\u043e\u043b\u044c\u043a\u043e nullfs \u0441 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 Jail-\u0430\u043c\u0438 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440.<\/p>\n<pre>      \u250c\u2500\u2500\u2500\u2510          \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510          \u250c\u2500\u2500\u2500\u2510              \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510          \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510                    \u2502git\u2502          \u2502task-maker\u2502          \u2502NFS\u2502              \u2502task-taker\u2502          \u2502job-starter\u2502                    \u2514\u2500\u252c\u2500\u2518          \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518          \u2514\u2500\u252c\u2500\u2518              \u2514\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518          \u2514\u2500\u2500\u2500\u2500\u2500\u252c\u2500\u2500\u2500\u2500\u2500\u2518                      \u2502           revs\/$COMMIT             \u2502                     \u2502                      \u2502                            \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;\u2502                     \u2502                      \u2502                            \u2502                 \u2502                  \u2502                     \u2502                      \u2502                            \u2502                 \u2502   revs\/$COMMIT   \u2502                     \u2502                      \u2502                            \u2502                 \u2502 &lt;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502                     \u2502                      \u2502                            \u2502                 \u2502                  \u2502                     \u2502                      \u2502                            \u2502                 \u2502  mkdir $CTR\/+1   \u2502                     \u2502                      \u2502                            \u2502                 \u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;\u2502                     \u2502                      \u2502                            \u2502                 \u2502                  \u2502                     \u2502                      \u2502                            \u2502                 \u2502       rc=0       \u2502                     \u2502                      \u2502                            \u2502                 \u2502 &lt;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502                     \u2502                      \u2502                            \u2502                 \u2502                  \u2502                     \u2502                      \u2502                            \u2502                 \u2502 $TASKS\/$CTR:task \u2502                     \u2502                      \u2502                            \u2502                 \u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;\u2502                     \u2502                      \u2502                            \u2502                 \u2502                  \u2502                     \u2502                      \u2502                            \u2502                 \u2502                  \u2502  $TASKS\/$CTR:task   \u2502                      \u2502                            \u2502                 \u2502                  \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;                      \u2502                            \u2502                 \u2502                  \u2502                     \u2502                      \u2502                            \u2502                 \u2502                  \u2502mkdir $JOBS\/$CTR:task\u2502                      \u2502                            \u2502                 \u2502                  \u2502&lt;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500                      \u2502                            \u2502                 \u2502                  \u2502                     \u2502                      \u2502                            \u2502                 \u2502                  \u2502        rc=0         \u2502                      \u2502                            \u2502                 \u2502                  \u2502\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;                      \u2502                            \u2502                 \u2502                  \u2502                     \u2502                      \u2502                            \u2502                 \u2502                  \u2502                     \u2502   $JOBS\/$CTR:task    \u2502                            \u2502                 \u2502                  \u2502                     \u2502 \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500&gt;\u2502                            \u2502                 \u2502                  \u2502                     \u2502                      \u2502                            \u2502                 \u2502                  \u2502        touch $JOBS\/$CTR:task\/alive         \u2502                            \u2502                 \u2502                  \u2502&lt;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502                            \u2502                 \u2502                  \u2502                     \u2502                      \u2502                            \u2502                 \u2502                  \u2502                     \u2502                      \u2502\u2500\u2500\u2500\u2500\u2510                       \u2502                 \u2502                  \u2502                     \u2502                      \u2502    \u2502 \"steps-runner\"        \u2502                 \u2502                  \u2502                     \u2502                      \u2502&lt;\u2500\u2500\u2500\u2518                       \u2502                 \u2502                  \u2502                     \u2502                      \u2502                            \u2502                 \u2502                  \u2502      touch $JOBS\/$CTR:task\/finished        \u2502                            \u2502                 \u2502                  \u2502&lt;\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2502                            \u2502                 \u2502                  \u2502                     \u2502                      \u2502                            \u2502                 \u2502                  \u2502                     \u2502                      \u2502                     <\/pre>\n<p> \u0421\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e, \u043d\u0430 master \u0443\u0437\u043b\u0435 \u0443 \u043d\u0430\u0441 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043d\u0435\u043a\u0438\u0439 task-maker: \u0441\u043e\u0437\u0434\u0430\u0442\u0435\u043b\u044c task-\u043e\u0432. Task \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442: <\/p>\n<ul>\n<li>code.tar, code-revision.txt, code-version.txt \u0444\u0430\u0439\u043b\u044b \u2014 \u0441\u0436\u0430\u0442\u044b\u0439 tarball \u0441 \u043a\u043e\u0434\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c. \u0417\u0430\u0447\u0430\u0441\u0442\u0443\u044e, \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u0434\u0435\u043b\u0430\u043d \u043a\u0430\u043a\u0438\u043c-\u043d\u0438\u0431\u0443\u0434\u044c \u00abgit archive\u00bb.<\/li>\n<li>steps.tar, steps-revision.txt, steps-version.txt \u2014 \u0430\u0440\u0445\u0438\u0432 \u0441\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/li>\n<\/ul>\n<p> \u0421\u0436\u0430\u0442\u0438\u0435 \u0430\u0440\u0445\u0438\u0432\u043e\u0432 \u0436\u0435\u043b\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u043e \u0441\u0435\u0442\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u0435\u043d\u044c\u0448\u0435 \u0434\u0430\u043d\u043d\u044b\u0445, \u044d\u043a\u043e\u043d\u043e\u043c\u044f \u0432\u0440\u0435\u043c\u044f \u043d\u0430 \u0437\u0430\u043f\u0443\u0441\u043a \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e\u0433\u043e. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0446\u0435\u043b\u0435\u0441\u043e\u043e\u0431\u0440\u0430\u0437\u0435\u043d Zstandard, \u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0449\u0438\u0439 \u0431\u0435\u0437\u0443\u043c\u043d\u043e\u0439 \u0441\u043a\u043e\u0440\u043e\u0441\u0442\u044c\u044e \u0434\u0435\u043a\u043e\u043c\u043f\u0440\u0435\u0441\u0441\u0438\u0438.<\/p>\n<p> \u0418\u043c\u044f task \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438: NUM:PROJ:VERSION:ARCH[:HOST]. \u0423\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u0440\u044f\u0434\u043a\u043e\u0432\u044b\u0439 \u043d\u043e\u043c\u0435\u0440 \u0437\u0430\u0434\u0430\u0447\u0438, \u043f\u0440\u043e\u0435\u043a\u0442, \u0432\u0435\u0440\u0441\u0438\u044f, \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0430 (\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\/\u041e\u0421), \u041e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e \u0438\u043c\u044f \u0445\u043e\u0441\u0442\u0430 \u0434\u043b\u044f \u0446\u0435\u043b\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0430 \u043d\u0451\u043c.<\/p>\n<p> $TASKS \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442: <\/p>\n<ul>\n<li>ctr\/ \u2014 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u0439\u0441\u044f \u0441\u0447\u0451\u0442\u0447\u0438\u043a \u0437\u0430\u0434\u0430\u0447.<\/li>\n<li>tmp\/ \u2014 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0445 task, \u043f\u043e\u0437\u0436\u0435 \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u044f \u0432 cur\/.<\/li>\n<li>cur\/ \u2014 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0434\u043b\u044f \u0432\u0437\u044f\u0442\u0438\u044f slave-\u0430\u043c\u0438 \u0437\u0430\u0434\u0430\u0447\u0438.<\/li>\n<li>old\/ \u2014 \u0430\u0440\u0445\u0438\u0432\u043d\u044b\u0435 \u0437\u0430\u0434\u0430\u0447\u0438, \u043d\u0435 \u0432\u0437\u044f\u0442\u044b\u0435, \u0437\u0430\u0432\u0435\u0440\u0448\u0451\u043d\u043d\u044b\u0435.<\/li>\n<\/ul>\n<p> Job \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442: <\/p>\n<ul>\n<li>alive \u2014 \u0444\u0430\u0439\u043b \u0441 \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c\u044b\u043c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c mtime (touch alive), \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430 \u00ab\u0436\u0438\u0432\u0430\u00bb.<\/li>\n<li>host.txt \u2014 \u0438\u043c\u044f slave, \u0432\u0437\u044f\u0432\u0448\u0435\u0433\u043e \u0437\u0430\u0434\u0430\u0447\u0443.<\/li>\n<li>tmp-path.txt \u2014 \u043f\u0443\u0442\u044c \u043a \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043d\u0430 slave, \u0433\u0434\u0435 \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f.<\/li>\n<li>pkg.txt \u2014 \u0441\u043f\u0438\u0441\u043e\u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432.<\/li>\n<li>env.txt \u2014 \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.<\/li>\n<li>steps\/ \u2014 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u043e\u0434\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043d\u0430\u0437\u0432\u0430\u043d\u043d\u044b\u0435 \u043f\u043e \u0438\u043c\u0435\u043d\u0438 step \u0438\u0437 steps.tar. \u041a\u0430\u0436\u0434\u0430\u044f \u0442\u0430\u043a\u0430\u044f \u043f\u043e\u0434\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442:<br \/> \n<ul>\n<li>started \u2014 \u043f\u0443\u0441\u0442\u043e\u0439 \u0444\u0430\u0439\u043b \u0441 mtime-\u043e\u043c \u0440\u0430\u0432\u043d\u044b\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0448\u0430\u0433\u0430.<\/li>\n<li>stdout.txt, stderr.txt \u2014 stdout\/stderr \u0448\u0430\u0433\u0430.<\/li>\n<li>exitcode.txt \u2014 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0448\u0430\u0433\u0430. \u0421\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0438\u043b\u0438 ASCII decimal \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u0438\u043b\u0438 \u00abtimeout\u00bb \u0441\u0442\u0440\u043e\u0447\u043a\u0443, \u0435\u0441\u043b\u0438 \u0448\u0430\u0433 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u043b\u0441\u044f \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0434\u043e\u043b\u0433\u043e.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p> \u041a\u0430\u043a \u0431\u0435\u0437 \u0421\u0423\u0411\u0414 \u0438\u043b\u0438 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0430\u0440\u0431\u0438\u0442\u0440\u0430, slave \u043c\u043e\u0436\u0435\u0442 \u0435\u0434\u0438\u043d\u043e\u043b\u0438\u0447\u043d\u043e \u0432\u0437\u044f\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443? \u041d\u0430 POSIX \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u0438 \u043d\u0430 NFS, \u0435\u0441\u0442\u044c \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u0430\u044f \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f: mkdir. \u0422\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d slave \u0441\u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0437\u0434\u0430\u0442\u044c $JOBS\/$CTR:task. \u0410\u043d\u0430\u043b\u043e\u0433\u0438\u0447\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430 \u0437\u0430\u0434\u0430\u0447 \u043d\u0430 master \u0441\u0435\u0440\u0432\u0435\u0440\u0435: \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c mkdir $CTR+1, \u043f\u043e\u043a\u0430 \u0443 \u043d\u0430\u0441 \u044d\u0442\u043e \u043d\u0435 \u0432\u044b\u0439\u0434\u0435\u0442. \u0412\u0441\u0451 \u044d\u0442\u043e \u043f\u043e\u043a\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0432\u0435\u0440\u0448\u0435\u043d\u043d\u043e \u043e\u0431\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0431\u0435\u0437 \u0447\u0435\u0433\u043e-\u043b\u0438\u0431\u043e \u043a\u0440\u043e\u043c\u0435 shell-\u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432.<\/p>\n<p> \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0439 \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 NFS, \u043c\u043e\u0436\u043d\u043e \u0443\u0442\u0438\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c 10+GbE \u043a\u0430\u043d\u0430\u043b\u044b \u0441\u0432\u044f\u0437\u0438, \u043d\u0435 \u0443\u043f\u0438\u0440\u0430\u044f\u0441\u044c \u0432 \u043e\u0434\u043d\u043e \u044f\u0434\u0440\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440\u0430 \u0438\u043b\u0438 TCP \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435.<\/p>\n<h2>task-maker<\/h2>\n<p> \u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0434\u0435\u043b\u0430\u0435\u043c task-maker \u0434\u043b\u044f \u043d\u0435\u043a\u043e\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 <a href=\"https:\/\/habr.com\/ru\/articles\/517490\/\">goredo<\/a>.<\/p>\n<p> \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u0438\u043c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043d\u0430 NFS \u0441\u0435\u0440\u0432\u0435\u0440\u0435. \u041a\u0441\u0442\u0430\u0442\u0438, NFS \u0441\u0435\u0440\u0432\u0435\u0440 \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c master-\u043e\u043c: \u0441\u043a\u0440\u0438\u043f\u0442\u044b task-maker \u043c\u043e\u0433\u0443\u0442 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0433\u0434\u0435 \u0443\u0433\u043e\u0434\u043d\u043e. <\/p>\n<pre> $ mkdir -p \/nfs\/revs\/goredo $ mkdir -p \/nfs\/tasks\/ctr\/0 $ mkdir -p \/nfs\/tasks\/{cur,old,tmp} $ mkdir \/nfs\/jobs <\/pre>\n<p> \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c Git post-receive hook, \u0441\u043e\u0437\u0434\u0430\u044e\u0449\u0438\u0439 \u0444\u0430\u0439\u043b\u044b \u0441 \u0445\u044d\u0448\u043e\u043c \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0437\u0430\u043f\u0443\u0448\u0435\u043d\u043d\u044b\u043c: <\/p>\n<pre> $ cat &gt;goredo.git\/hooks\/post-receive &lt;&lt;EOF #!\/bin\/sh -e REVS=\/nfs\/revs\/goredo ZERO=\"0000000000000000000000000000000000000000\" read prev curr ref [ \"$curr\" != $ZERO ] || exit 0 [ \"$prev\" != $ZERO ] || prev=$curr^ git rev-list $prev..$curr | while read rev ; do     mkdir -p $REVS\/$ref     echo BASSing $ref\/$rev... &gt;&amp;2     touch $REVS\/$ref\/$rev done EOF <\/pre>\n<p> \u0417\u0430\u0442\u0435\u043c \u043f\u0438\u0448\u0435\u043c \u0441\u0430\u043c task-maker, \u0441\u043f\u0435\u0446\u0438\u0444\u0438\u0447\u043d\u044b\u0439 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0441\u0431\u043e\u0440\u043a\u0438\/\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043c\u043e\u0433\u0443\u0442 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0442\u043b\u0438\u0447\u0430\u0442\u044c\u0441\u044f. <\/p>\n<pre> #!\/bin\/sh -e sname=\"$0\" . $BASS_ROOT\/lib\/rc [ -n \"$REVS\" ] [ -n \"$PROJ\" ] [ -n \"$STEPS\" ] [ -n \"$ARCHS\" ]  cd $REVS rev=$(find . -type f | sed -n 1p) [ -n \"$rev\" ] rev_path=$(realpath $rev) rev=$(basename $rev)  task_proj=goredo task_version=$(cd $PROJ ; $BASS_ROOT\/master\/bin\/version-for-git $rev) [ -n \"$task_version\" ] task=\":$task_proj:$task_version:\" mkdir $TASKS\/tmp\/$task trap \"rm -fr $TASKS\/tmp\/${task}*\" HUP PIPE INT QUIT TERM EXIT  cd $STEPS $BASS_ROOT\/master\/bin\/version-for-git &gt;$TASKS\/tmp\/$task\/steps-version.txt git rev-parse  &gt;$TASKS\/tmp\/$task\/steps-revision.txt # $TAR cf - --posix * | $COMPRESSOR &gt;$TASKS\/tmp\/$task\/steps.tar git archive | $COMPRESSOR &gt;$TASKS\/tmp\/$task\/steps.tar  cd $PROJ echo $task_version &gt;$TASKS\/tmp\/$task\/code-version.txt git show --no-patch --pretty=fuller $rev &gt;&gt;$TASKS\/tmp\/$task\/code-version.txt echo $rev &gt;$TASKS\/tmp\/$task\/code-revision.txt git archive $rev | $COMPRESSOR &gt;$TASKS\/tmp\/$task\/code.tar  tasks=$($BASS_ROOT\/master\/bin\/clone-with-ctr $task     $(for arch in $ARCH ; do echo ${task}${arch} ; done)) [ -n \"$tasks\" ] for t in $tasks ; do     echo $t     mv $t ..\/cur done  rm $rev_path <\/pre>\n<p> \u0421\u043a\u0440\u0438\u043f\u0442 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u0440\u044f\u0434 \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440 \u0438 \u043f\u0440\u043e\u0447\u0435\u0433\u043e. \u041f\u043e\u0447\u0435\u043c\u0443 \u0432 \u043d\u0451\u043c \u043d\u0435 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u00abcp -a\u00bb \u0434\u043b\u044f \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u044b? \u041f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044d\u0442\u043e \u0437\u0430\u0439\u043c\u0451\u0442 \u043c\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430. clone-with-ctr \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0436\u0451\u0441\u0442\u043a\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435 \u0441 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e \u0438\u043d\u043a\u0440\u0435\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u044e\u0449\u0438\u043c\u0441\u044f (\u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 mkdir $CTR+1) \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0447\u0451\u0442\u0447\u0438\u043a\u0430. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043e\u043d \u0434\u0435\u043b\u0430\u0435\u0442 fsync, \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0440\u0443\u044f, \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u043e\u043a\u0430\u0436\u0435\u0442\u0441\u044f \u0432 $TASKS\/cur\/, \u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442 \u043e\u043d\u0430 \u0442\u0430\u043c \u0442\u043e\u0447\u043d\u043e \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c, \u0430 \u043d\u0435 \u043e\u0441\u0435\u043b\u0430 \u0432 \u0431\u0443\u0444\u0435\u0440\u0430\u0445 \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b.<\/p>\n<p> \u0410 \u0435\u0441\u043b\u0438 \u0432\u0430\u043c \u043d\u0430\u0434\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u0441\u0431\u043e\u0440\u043a\u0438\/\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435 \u043f\u043e push \u0432 Git, \u0430 \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u0430\u0436\u0434\u0443\u044e \u043d\u043e\u0447\u044c? \u0412\u044b\u0437\u044b\u0432\u0430\u0439\u0442\u0435 task-maker \u043f\u043e cron, \u043a\u0430\u043a \u0437\u0430\u0431\u043b\u0430\u0433\u043e\u0440\u0430\u0441\u0441\u0443\u0434\u0438\u0442\u0441\u044f!<\/p>\n<p> \u0428\u0430\u0433\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 steps.tar \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u044b\u043c\u0438: <\/p>\n<pre> -- steps\/00prerequisites -- #!\/bin\/sh -ex cd .. $BASS_ROOT\/build\/bin\/pkg-inst go-stringer-0.18.0 sharness-1.2.0 go1.22.6 perl-5.32.1  -- steps\/01stringer -- #!\/bin\/sh -ex go generate  -- steps\/02build -- #!\/bin\/sh -ex go build .\/goredo -symlinks  -- steps\/03t -- #!\/bin\/sh -ex PATH=\"$(realpath .):$PATH\" export SHARNESS_TEST_SRCDIR=\"$(realpath ..\/local\/share\/sharness)\" cd t prove . <\/pre>\n<h2>task-taker<\/h2>\n<p> \u041d\u0430 slave \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f task-taker \u0441\u043a\u0440\u0438\u043f\u0442. \u041e\u043d \u043f\u0435\u0440\u0438\u043e\u0434\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u043f\u043e\u0434\u043c\u043e\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043f\u043e NFS \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e $TASKS \u0438 \u0430\u0442\u043e\u043c\u0430\u0440\u043d\u043e (mkdir) \u0431\u0435\u0440\u0451\u0442 \u0437\u0430\u0434\u0430\u0447\u0438 \u043f\u043e\u0434 \u0441\u0442\u0430\u0442\u044c \u0441\u0432\u043e\u0435\u0439 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0435. \u0425\u043e\u0447\u0435\u0442\u0441\u044f \u043d\u0430 \u043c\u043e\u0449\u043d\u043e\u043c slave \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u0434\u0430\u0447 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e? \u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e task-taker!<\/p>\n<p> \u042d\u0442\u043e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u0434\u043b\u044f \u0432\u0437\u044f\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 job-starter. <\/p>\n<ul>\n<li>code.tar \u0438 steps.tar \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 $JOBS\/cur\/$task.<\/li>\n<li>\u0412 \u0444\u043e\u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f heartbeat \u043f\u0440\u043e\u0446\u0435\u0441\u0441, \u0434\u0435\u043b\u0430\u044e\u0449\u0438\u0439 \u0435\u0436\u0435\u0441\u0435\u043a\u0443\u043d\u0434\u043d\u044b\u0439 \u00abtouch $job\/alive\u00bb.<\/li>\n<li>\u041f\u043e\u0440\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f tmux, \u0432\u043d\u0443\u0442\u0440\u0438 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f steps.<\/li>\n<li>\u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0448\u0430\u0433\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0444\u043e\u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u043f\u0440\u043e\u0433\u0440\u0435\u0441\u0441\u0430 \u0432 \u0436\u0443\u0440\u043d\u0430\u043b\u0430\u0445. \u0415\u0441\u043b\u0438 \u043d\u0435\u0442 \u043d\u0438\u043a\u0430\u043a\u043e\u0433\u043e \u0432\u044b\u0432\u043e\u0434\u0430 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u0431\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043f\u043e\u043c\u0435\u0442\u043a\u043e\u0439 timeout \u0432 \u0435\u0433\u043e $job\/steps\/$step\/exitcode.txt.<\/li>\n<li>stdout\/stderr \u0432\u044b\u0432\u043e\u0434 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0430\u043a, \u0430 \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u044f \u0447\u0435\u0440\u0435\u0437 tai64n \u0443\u0442\u0438\u043b\u0438\u0442\u0443, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0449\u0443\u044e TAI64 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0448\u0442\u0430\u043c\u043f \u043a \u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u0440\u043e\u0447\u043a\u0435 \u0432\u044b\u0432\u043e\u0434\u0430.<\/li>\n<\/ul>\n<p> \u041d\u0430\u043b\u0438\u0447\u0438\u0435 tmux-\u0430 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e: \u043c\u043e\u0436\u043d\u043e \u0443\u0434\u0430\u043b\u0451\u043d\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a slave \u0438 \u0432\u043e\u043e\u0447\u0438\u044e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0442\u043e \u0436\u0435 \u0442\u0430\u043c \u0432 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442. \u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u043d\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0430\u0441\u044c \u0443\u0441\u043f\u0435\u0448\u043d\u043e (\u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u0448\u0430\u0433 (step) \u0443\u043f\u0430\u043b), \u0442\u043e tmux \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0432\u0438\u0441\u0435\u0442\u044c \u0432 \u0444\u043e\u043d\u0435 \u0432 \u0442\u0435\u0447\u0435\u043d\u0438\u0438 \u043a\u0430\u043a\u043e\u0433\u043e-\u0442\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u2014 \u043a \u043d\u0435\u043c\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u0438 \u0437\u0430\u043d\u044f\u0442\u044c\u0441\u044f \u043e\u0442\u043b\u0430\u0434\u043a\u043e\u0439 \u0431\u0443\u043a\u0432\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0432 \u0442\u043e\u043c \u0436\u0435 \u0441\u0430\u043c\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438, \u0433\u0434\u0435 \u0432\u0441\u0451 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b\u043e\u0441\u044c. \u0418\u043d\u0430\u0447\u0435 \u043e\u043d \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0435\u0442\u0441\u044f \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0435\u0439 \u0434\u043b\u044f \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432.<\/p>\n<h2>\u0414\u0435\u043c\u043e\u043d\u044b<\/h2>\n<p> \u0414\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0445 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0432, \u0438\u043c\u0435\u0435\u0442\u0441\u044f reporter \u0441\u043a\u0440\u0438\u043f\u0442 \u043d\u0430 Z shell (\u0443\u0436 \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e \u043d\u0430 \u043d\u0451\u043c \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c). \u042d\u0442\u043e web-\u0441\u0435\u0440\u0432\u0435\u0440, \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u044e\u0449\u0438\u0439 dashboard \u043f\u043e\u0445\u043e\u0436\u0438\u0439 \u043d\u0430 BuildBot \u0432\u044b\u0432\u043e\u0434: \u043a\u0442\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d, \u0433\u0434\u0435, \u043a\u043e\u0433\u0434\u0430, \u0436\u0438\u0432\/\u043c\u0451\u0440\u0442\u0432, \u043a\u0430\u043a\u0438\u0435 \u0448\u0430\u0433\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u044b\/\u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f, \u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u0430\u043d\u0438\u043c\u0430\u044e\u0442 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u0438\u0445 stdout\/stderr, \u0441\u0441\u044b\u043b\u043a\u0430 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a tmux-\u0443. \u0412\u0441\u044f \u044d\u0442\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 plaintext \u0444\u0430\u0439\u043b\u043e\u0432 \u0438 \u0438\u0445 mtime \u0438\u0437 NFS \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438.<\/p>\n<p> notify-non-started \u0438 notify-non-taken shell-\u0441\u043a\u0440\u0438\u043f\u0442\u044b \u043d\u0430 \u043f\u0430\u0440\u0443 \u0434\u0435\u0441\u044f\u0442\u043a\u043e\u0432 \u0441\u0442\u0440\u043e\u0447\u0435\u043a \u043a\u043e\u0434\u0430, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043e\u043f\u043e\u0432\u0435\u0449\u0430\u0442\u044c \u043e \u043d\u0435 \u0432\u0437\u044f\u0442\u044b\u0445 \u0438\u043b\u0438 \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c\u044b\u0445 \u0437\u0430\u0434\u0430\u0447\u0430\u0445.<\/p>\n<p> \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u043f\u043e\u0441\u0442\u043e\u044f\u043d\u043d\u043e \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u0434\u0435\u043c\u043e\u043d\u044b: task-maker, task-taker, reporter, \u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e notify-non-started, notify-non-taken. \u0414\u043b\u044f \u0438\u0445 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043d\u0443\u0436\u043d\u044b \u0441\u0440\u0435\u0434\u0438 \u043a\u0440\u043e\u0441\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0432\u044b\u0434\u0435\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u043e\u0439 <a href=\"http:\/\/cr.yp.to\/daemontools.html\" rel=\"nofollow noopener noreferrer\">daemontools<\/a>, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0445\u043e\u0436\u0438\u0435 (\u0430 \u0442\u043e \u0438 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0435): <a href=\"http:\/\/smarden.org\/runit\/\" rel=\"nofollow noopener noreferrer\">runit<\/a>, <a href=\"http:\/\/www.skarnet.org\/software\/s6\/\" rel=\"nofollow noopener noreferrer\">s6<\/a>. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c daemontools \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e (\u043b\u044e\u0431\u0438\u0442\u0435\u043b\u0438 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 GNU\/Linux \u043c\u043e\u0433\u0443\u0442 \u0445\u043e\u0442\u044c systemd \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c), \u043d\u043e \u0438\u0445 \u00abrun\u00bb \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0431\u0443\u0434\u0443\u0442, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b \u0438 \u043d\u0430 BSD \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0438 \u043d\u0430 GNU\/Linux.<\/p>\n<h2>\u0421\u0431\u043e\u0440\u043a\u0430 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439<\/h2>\n<p> \u0420\u0430\u0437 \u043c\u044b \u0437\u0430\u0432\u043e\u0434\u0438\u043c \u0440\u0430\u0437\u0433\u043e\u0432\u043e\u0440 \u043e \u043a\u0440\u043e\u0441\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u043e\u0441\u0442\u0438, \u0442\u043e \u0440\u043e\u0436\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u043e\u043f\u0440\u043e\u0441: \u0430 \u043a\u0430\u043a \u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432 \u043d\u0430 Python, Go, \u0438 \u0442.\u0434.? \u0414\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0432\u0441\u0451 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432 \u0440\u043e\u0434\u043d\u043e\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u043f\u0430\u043a\u0435\u0442\u043d\u043e\u043c \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440\u0435 \u041e\u0421, \u043a\u0430\u043a \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0440\u0430\u0437\u043d\u044b\u0445 \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442\u0443\u044e\u0449\u0438\u0445 \u0432\u0435\u0440\u0441\u0438\u0439.<\/p>\n<p> \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u043a\u0440\u043e\u0441\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440, \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0441\u0431\u043e\u0440\u043a\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0433\u043b\u0430 \u0431\u044b \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0432 \u0441\u0432\u043e\u0435\u0439 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0439 \u043e\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u041e\u0421 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438. \u0415\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0439 \u043a\u0440\u043e\u0441\u0441-\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u0439 \u043f\u0430\u043a\u0435\u0442\u043d\u044b\u0439 \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043c\u043d\u0435 \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0439: <a href=\"https:\/\/www.pkgsrc.org\/\" rel=\"nofollow noopener noreferrer\">NetBSD&#8217;s pkgsrc<\/a>. \u0422\u043e\u0442 \u0436\u0435 Nix \u0443\u0436\u0435 \u0434\u0430\u0432\u043d\u043e \u043f\u0435\u0440\u0435\u0441\u0442\u0430\u043b \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0430 FreeBSD. \u041d\u043e, \u0441\u0443\u0434\u044f \u043f\u043e \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, pkgsrc \u043d\u0435 \u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438, \u0447\u0442\u043e \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439.<\/p>\n<p> \u0412 \u0447\u0451\u043c \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b? \u041a\u0430\u043a-\u0442\u043e \u0434\u043e\u0431\u044b\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434. \u0420\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e, \u0441\u0431\u043e\u0440\u043a\u0443, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443, \u00ab\u043e\u043f\u0430\u043a\u0435\u0447\u0438\u0432\u0430\u043d\u0438\u0435\u00bb.<\/p>\n<p> \u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u00ab\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c\u00bb \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439? \u0412 \u043f\u0440\u0435\u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0449\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u2014 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0441\u0438\u043c\u0432\u043e\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0441\u044b\u043b\u043e\u043a. <a href=\"https:\/\/www.gnu.org\/software\/stow\/\" rel=\"nofollow noopener noreferrer\">GNU Stow<\/a> \u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u0441\u0438\u043c\u0432\u043e\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0441\u044b\u043b\u043e\u043a \u043f\u0440\u0435\u0432\u043e\u0441\u0445\u043e\u0434\u043d\u043e \u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0432 \u044d\u0442\u043e\u043c.<\/p>\n<p> \u041c\u043d\u043e\u0433\u043e \u0441\u043e\u0444\u0442\u0430 \u0432\u0448\u0438\u0432\u0430\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043e\u0447\u043d\u044b\u0435 \u043f\u0443\u0442\u0438 \u0432\u043e \u0432\u0440\u0435\u043c\u044f \u0441\u0431\u043e\u0440\u043a\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043a\u0430\u043a \u044d\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0438 \u0432 Nix, \u043c\u044b \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0442\u044c \u0441\u043e\u0444\u0442 \u0432 \u043f\u0435\u0440\u043c\u0430\u043d\u0435\u043d\u0442\u043d\u044b\u0435 \u043f\u0443\u0442\u0438.<\/p>\n<p> \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c Perl \u0432: \/perm\/perl-5.32.1-zP3IpCa_XY7pGHCNYQxp_1KjQQNCyUl84LqSrWLErjA \u0433\u0434\u0435 \u0445\u044d\u0448 \u043f\u043e\u0441\u043b\u0435 \u0438\u043c\u0435\u043d\u0438 \u044d\u0442\u043e \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0445\u044d\u0448 \u043e\u0442 \u0432\u0441\u044f\u043a\u043e\u0439 \u043c\u0435\u0442\u0430\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0431\u043e\u0440\u043a\u0438. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \/tmp\/tmp.whatever \u0438 \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u043c GNU Stow \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0430\u043c Perl \u0438 GNU Make. \u0411\u0443\u0434\u0443\u0442 \u0441\u0434\u0435\u043b\u0430\u043d\u044b \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u0441\u044b\u043b\u043a\u0438: <\/p>\n<pre> \/tmp\/tmp.whatever\/local\/bin\/gmake -&gt; \/perm\/gmake-4.4-$hsh1\/bin\/gmake \/tmp\/tmp.whatever\/local\/bin\/perl5 -&gt; \/perm\/perl5-$hsh0\/bin\/perl5 \/tmp\/tmp.whatever\/local\/lib\/site_perl -&gt; \/perm\/perl5-$hsh0\/lib\/site_perl \/tmp\/tmp.whatever\/local\/share\/info -&gt; \/perm\/gmake-4.4-$hsh1\/share\/info <\/pre>\n<p> \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c local\/bin \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0432 $PATH, local\/lib \u0432 $LD_LIBRARY_PATH \u0438 \u0432 \u043f\u0440\u0435\u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0449\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u044d\u0442\u043e\u0433\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e. \u0412 tmp.whatever environment-\u0435 \u0431\u0443\u0434\u0443\u0442 \u043a\u0430\u043a-\u0431\u044b \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 Perl \u0438 Make.<\/p>\n<h2>skel \u0438 skelbin<\/h2>\n<p> \u0421\u043a\u0440\u0438\u043f\u0442 \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u043a\u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u044b \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u00abskel\u00bb-\u043e\u043c (\u0441\u043e\u043a\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043e\u0442 skeleton). \u0411\u0438\u043d\u0430\u0440\u043d\u044b\u0439 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b skel-\u0430 \u044d\u0442\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0441\u043e\u0444\u0442, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 skelbin.<\/p>\n<p> skel-\u044b, \u043a\u043e\u0433\u0434\u0430 BASS \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0438\u0441\u0430\u043b\u0441\u044f, \u0431\u044b\u043b\u0438 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e pure POSIX shell \u0441\u043a\u0440\u0438\u043f\u0442\u0430\u043c\u0438. \u041e\u0434\u043d\u0430\u043a\u043e, \u043a\u043e\u0433\u0434\u0430 \u043c\u0435\u0436\u0434\u0443 \u043d\u0438\u043c\u0438 \u043d\u0430\u0447\u0430\u043b\u0438 \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0442\u043e \u043a\u0430\u043a-\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c lock-\u0430\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430\u043c\u0438 \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u043f\u043e\u043d\u0438\u043c\u0430\u0442\u044c \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u0441\u043e\u0431\u0440\u0430\u043d\u043e, \u0430 \u0447\u0442\u043e \u043d\u0435\u0442. \u0412\u0441\u0451 \u044d\u0442\u043e \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u0430\u044f \u0437\u0430\u0434\u0430\u0447\u0430 \u0434\u043b\u044f \u0442\u0430\u043a\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u043a\u0430\u043a redo. \u041f\u0435\u0440\u0435\u0439\u0434\u044f \u043d\u0430 \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435, \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0440\u0435\u0448\u0430\u044e\u0442\u0441\u044f \u0432\u0441\u0435 \u044d\u0442\u0438 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b, \u043f\u043b\u044e\u0441 \u043f\u043e\u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0441\u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u0438\u0432\u0430\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u043a\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0442\u0435\u043f\u0435\u0440\u044c skel \u044d\u0442\u043e redo \u0446\u0435\u043b\u044c.<\/p>\n<p> \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0431\u0430\u043b\u0430\u043d\u0441 \u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u043e\u0439\/\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u044c\u044e \u0438 \u043f\u043e\u0440\u043e\u0433\u043e\u043c \u0432\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f, \u043a\u043e\u0433\u043d\u0438\u0442\u0438\u0432\u043d\u043e\u0439 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u043e\u0439. \u0411\u0430\u043b\u0430\u043d\u0441 \u043c\u0435\u0436\u0434\u0443 simplicity \u0438 easiness of usage. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u0431\u043e\u0440\u043a\u0438 \u043c\u043d\u043e\u0433\u0438\u0445 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043d\u0430 \u0421\u0438 \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u043f\u0440\u043e\u0446\u0435\u0434\u0443\u0440\u0435: <\/p>\n<pre> $ .\/configure --prefix=$SKELBINS\/... &amp;&amp; make &amp;&amp; make install <\/pre>\n<p> \u0438 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443\/\u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0442\u0438\u043f\u0430 <\/p>\n<pre> $ do-standard-configure-make-make-install-procedure <\/pre>\n<p> \u041d\u043e \u044f \u043e\u0441\u043e\u0437\u043d\u0430\u043d\u043d\u043e \u043e\u0442\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0441\u044c \u043e\u0442 \u044d\u0442\u043e\u0433\u043e. \u041a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u0442\u043e-\u043b\u0438\u0431\u043e, \u043d\u0435\u0437\u043d\u0430\u043a\u043e\u043c\u044b\u0439 \u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439, \u0432\u0438\u0434\u0438\u0442 \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0443\u044e \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0443\u044e \u043f\u0440\u0435\u0436\u0434\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u0443, \u0442\u043e \u0432\u044b\u043d\u0443\u0436\u0434\u0435\u043d \u0438\u0434\u0442\u0438 \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e\/\u043a\u043e\u0434 \u0438 \u0432\u044b\u044f\u0441\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u0436\u0435 \u044d\u0442\u043e \u0437\u0430 \u043c\u0430\u0433\u0438\u044f \u0442\u0443\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f. \u041a\u043e\u0433\u0434\u0430 \u044f \u0432\u0438\u0436\u0443 \u0432\u044b\u0437\u043e\u0432 \u0448\u0442\u0430\u0442\u043d\u044b\u0445 \u0432\u0441\u0435\u043c \u0438\u0437\u0432\u0435\u0441\u0442\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434 \u0438 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u043a\u0430\u043a \u044f \u0431\u044b \u0435\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u2014 \u0442\u043e \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u043e\u0447\u0442\u0438 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442, \u0432\u0441\u0451 \u044f\u0441\u043d\u043e \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u043e, \u043f\u0443\u0441\u043a\u0430\u0439 \u0438 \u0431\u0443\u0434\u0435\u0442 \u043c\u043d\u043e\u0433\u043e copy-paste \u043c\u0435\u0436\u0434\u0443 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 skel-\u0430\u043c\u0438. \u041d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0440\u0430\u0437\u0443\u043c\u043d\u044b\u0439 \u043c\u0438\u043d\u0438\u043c\u0443\u043c.<\/p>\n<p> \u041a\u0430\u043a \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u043f\u0440\u043e\u0441\u0442\u0435\u0439\u0448\u0438\u0439 skel? <\/p>\n<pre> [ -n \"$BASS_ROOT\" ] || BASS_ROOT=\"$(dirname \"$(realpath -- \"$0\")\")\"\/..\/..\/.. sname=$1.do . \"$BASS_ROOT\"\/lib\/rc . \"$BASS_ROOT\"\/build\/skel\/common.rc  mkdir -p \"$SKELBINS\"\/$ARCH\/$NAME\/bin cd \"$SKELBINS\"\/$ARCH cp ~\/src\/misc\/hw\/hw.pl $NAME\/bin \"$BASS_ROOT\"\/build\/lib\/mk-pkg $NAME <\/pre>\n<p> \u041f\u0435\u0440\u0432\u044b\u0435 \u0442\u0440\u0438 \u0441\u0442\u0440\u043e\u0447\u043a\u0438 \u044d\u0442\u043e copy-paste \u0438\u0434\u0435\u043d\u0442\u0438\u0447\u043d\u044b\u0439 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 skel-\u043e\u0432, \u0432\u044b\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0449\u0438\u0439 \u043d\u0435\u043c\u043d\u043e\u0433\u043e\u0447\u0438\u0441\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f. \u0414\u0430\u043b\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438, \u043d\u0430\u0445\u043e\u0434\u044f\u0449\u0430\u044f\u0441\u044f \u0432 \u043f\u0435\u0440\u043c\u0430\u043d\u0435\u043d\u0442\u043d\u043e\u043c $SKELBINS. \u0422\u0443\u0434\u0430 \u043a\u043e\u043f\u0438\u0440\u0443\u0435\u0442\u0441\u044f hw.pl \u0443\u0442\u0438\u043b\u0438\u0442\u0430. \u0410 \u0434\u0430\u043b\u044c\u0448\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u043a\u0440\u0438\u043f\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430.<\/p>\n<h2>skelpkg<\/h2>\n<p> skelbin \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0442\u044b\u0441\u044f\u0447\u0438 \u0444\u0430\u0439\u043b\u043e\u0432, \u0438\u043c\u0435\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438 \u043f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0447\u0435\u0440\u0435\u0437 NFS, \u043f\u043b\u044e\u0441 \u043d\u0443\u0436\u043d\u044b \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0435 \u043c\u0435\u0442\u0430\u0434\u0430\u043d\u043d\u044b\u0435. \u0415\u0441\u043b\u0438 \u043a\u0430\u043a\u043e\u0439-\u0442\u043e skel \u0445\u043e\u0447\u0435\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e, \u0442\u043e \u0445\u043e\u0442\u0435\u043b\u043e\u0441\u044c \u0431\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0447\u0435\u043b\u043e\u0432\u0435\u043a\u043e\u0447\u0438\u0442\u0430\u0435\u043c\u043e\u0435 \u0438\u043c\u044f, \u0430 \u043d\u0435 \u0432\u0435\u0441\u044c $name-$hash, \u043f\u0440\u0438 \u0441\u043c\u0435\u043d\u0435 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0431\u044b \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0442\u044c \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u043e \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 skel.<\/p>\n<p> \u041f\u043e \u0430\u043d\u0430\u043b\u043e\u0433\u0438\u0438 \u0441 Arch Linux \u0438 Gentoo, \u0441\u043e\u0437\u0434\u0430\u043d \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u0430\u043a\u0435\u0442\u0430: skelpkg. \u042d\u0442\u043e POSIX pax \u0430\u0440\u0445\u0438\u0432 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438: <\/p>\n<ul>\n<li>name, name.meta4 \u2014 \u043f\u043e\u043b\u043d\u043e\u0435 \u0438\u043c\u044f ($name-$hash) \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u043f\u0430\u043a\u0435\u0442\u0430 \u043f\u043e\u0441\u043b\u0435 \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0438<\/li>\n<li>buildinfo, buildinfo.meta4 \u2014 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u0430\u044f \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u0441\u0431\u043e\u0440\u043a\u0435<\/li>\n<li>bin.meta4, bin \u2014 \u0435\u0449\u0451 \u043e\u0434\u0438\u043d PAX \u0430\u0440\u0445\u0438\u0432, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f $name-$hash \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f \u0441 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c skelbin<\/li>\n<\/ul>\n<p> \u0422\u0430\u043a \u043a\u0430\u043a \u044d\u0442\u043e tar \u0430\u0440\u0445\u0438\u0432, \u0442\u043e \u0443 \u043d\u0435\u0433\u043e \u043d\u0435\u0442 \u0438\u043d\u0434\u0435\u043a\u0441\u0430 \u0441 \u0444\u0430\u0439\u043b\u0430\u043c\u0438, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e \u0438\u043c\u0435\u0442\u044c \u0441\u0430\u043c\u044b\u0439 \u0442\u044f\u0436\u0451\u043b\u044b\u0439 bin \u0444\u0430\u0439\u043b \u0432 \u043a\u043e\u043d\u0446\u0435 \u0430\u0440\u0445\u0438\u0432\u0430. \u0412\u0441\u044f \u043c\u0435\u0442\u0430\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u0439\u0434\u0435\u043d\u0430 \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0430\u0440\u0445\u0438\u0432\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0430\u043c skelpkg, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u0432 \u043d\u0435\u0433\u043e bin, \u043d\u0435 \u0441\u0436\u0430\u0442. bin \u0436\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u0436\u0438\u043c\u0430\u0435\u0442\u0441\u044f Zstandard-\u043e\u043c.<\/p>\n<p> .meta4 \u044d\u0442\u043e <a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/rfc5854\" rel=\"nofollow noopener noreferrer\">Metalink4<\/a> XML, \u0433\u0434\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u0441\u044f \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b. \u0414\u043b\u044f \u0443\u0434\u043e\u0432\u043b\u0435\u0442\u0432\u043e\u0440\u0435\u043d\u0438\u044f \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u0446\u0438\u0440\u0443\u044e\u0449\u0438\u0445 \u043e\u0440\u0433\u0430\u043d\u043e\u0432 \u0420\u0424, \u043d\u0430\u0440\u044f\u0434\u0443 \u0441 \u0431\u044b\u0441\u0442\u0440\u044b\u043c\u0438 BLAKE*\/Skein, \u0435\u0441\u0442\u044c \u0438 \u0421\u0442\u0440\u0438\u0431\u043e\u0433.<\/p>\n<p> \u0427\u0442\u043e\u0431\u044b \u0441\u0431\u043e\u0440\u043a\u0430 \u0431\u044b\u043b\u0430 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e\u0439 (reproducible), \u043a\u0440\u043e\u043c\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u044b\u0445 \u0444\u043b\u0430\u0433\u043e\u0432 \u0441\u0431\u043e\u0440\u043a\u0438, \u043d\u0430\u043c \u0442\u0430\u043a\u0436\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c \u0438 \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0439 \u0430\u0440\u0445\u0438\u0432. \u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043d\u0438 GNU tar, \u043d\u0438 libarchive-based BSD tar \u043d\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u044d\u0442\u043e\u0433\u043e \u0432 \u043f\u043e\u043b\u043d\u043e\u0439 \u043c\u0435\u0440\u0435 \u0441\u0434\u0435\u043b\u0430\u0442\u044c, \u0440\u0430\u0437\u0432\u0435 \u0447\u0442\u043e \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f ustar \u0444\u043e\u0440\u043c\u0430\u0442\u0430. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0430 build\/contrib\/detpax \u0443\u0442\u0438\u043b\u0438\u0442\u0430 \u043d\u0430 Go, \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e, \u0441 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c timestamp, \u0431\u0435\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435\u0432, \u0441\u043e\u0437\u0434\u0430\u0442\u044c pax \u0430\u0440\u0445\u0438\u0432. \u0412 \u043d\u0435\u0439 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043a\u0430\u0437\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u0430 \u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u043a\u0438 \u0444\u0430\u0439\u043b\u043e\u0432\/\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 skelpkg \u043f\u043e\u0434\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0441 hook-\u0430\u043c\u0438 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0430\u0440\u0445\u0438\u0432\u0430, \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0451\u0448\u0435\u0432\u043e \u0443\u0437\u043d\u0430\u0432\u0430\u044f \u043a\u0430\u043a\u0438\u0435 \u0443 \u043d\u0435\u0433\u043e \u0435\u0441\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0438 \u043e\u0441\u043e\u0431\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u0440\u0438 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435\/\u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438.<\/p>\n<p> \u0421\u0431\u043e\u0440\u043a\u0430 \u043e\u0434\u043d\u043e\u0433\u043e \u0438 \u0442\u043e\u0433\u043e \u0436\u0435 skel \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0434\u043b\u044f \u0440\u0430\u0437\u043d\u044b\u0445 \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0434\u0435\u043b\u0430\u0435\u043c pkg\/$ARCH \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0434\u043b\u044f \u0438\u0445 \u0434\u0438\u0444\u0444\u0435\u0440\u0435\u043d\u0446\u0438\u0430\u0446\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0436\u0451\u0441\u0442\u043a\u0438\u043c\u0438 \u0441\u0441\u044b\u043b\u043a\u0430\u043c\u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u043c \u043d\u0430\u0448\u0438 skel-\u044b. <\/p>\n<pre> $ cd build $ pkg\/mk-arch $ARCH0 $ pkg\/mk-arch $ARCH1 $ redo pkg\/FreeBSD-whatever\/sysutils\/parallel-20240122 $ redo pkg\/GNU_Linux-whatever\/sysutils\/parallel-20240122 <\/pre>\n<p> \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435, parallel-20240122 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u043c skelpkg.<\/p>\n<h2>hooks<\/h2>\n<p> \u0412 \u043e\u0431\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 \u0437\u0430\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0441\u0442\u043e \u0432 \u0435\u0433\u043e \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u043a\u0435 \u0432 $SKELBINS. \u041d\u043e \u043c\u043e\u0433\u0443\u0442 \u043f\u043e\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0448\u0430\u0433\u0438. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u00abpre install\u00bb (preinst), \u00abpost install\u00bb (postinst), \u00abpre remove\u00bb (prerm), \u00abpost remove\u00bb (postrm) hook-\u043e\u0432. Hook \u044d\u0442\u043e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0430\u044f \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u0438\u043d \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u043c\u044b\u0439 \u0444\u0430\u0439\u043b. \u0418\u043c\u0435\u043d\u0430 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439 \u043b\u0435\u043a\u0441\u0438\u043a\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0442\u0441\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b. \u0420\u0430\u0437\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0432\u043d\u0443\u0442\u0440\u0438 skelpkg \u0432 $NAME-$hsh\/skelpkg\/$NAME-$hsh\/hooks\/$hook. \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u0441\u0430\u043c\u044b\u0445 \u0447\u0430\u0441\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0445 hook-\u043e\u0432 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u044b\u0437\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432: <\/p>\n<pre> $ tar xfO $SKELPKGS\/$ARCH\/curl-8.6.0 name | read namenhash  $ tar xfO $SKELPKGS\/$ARCH\/curl-8.6.0 bin |     tar tf - $namenhash\/skelpkg\/$namenhash\/hooks\/preinst $namenhash\/skelpkg\/$namenhash\/hooks\/preinst\/010-rdeps  $ tar xfO $SKELPKGS\/$ARCH\/curl-8.6.0 bin |     tar xfO - $namenhash\/skelpkg\/$namenhash\/hooks\/preinst\/010-rdeps #!\/bin\/sh -e exec \"$BASS_ROOT\"\/build\/bin\/pkg-inst openssl-1.1.1w <\/pre>\n<h2>skelenv<\/h2>\n<p> \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u043e\u0432, \u0430 \u0442\u043e\u0447\u043d\u0435\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0441\u044b\u043b\u043e\u043a \u0434\u043e \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0445 skelbin-\u043e\u0432, \u043f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u0435\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438, \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u043c\u043e\u0439 skelenv (environment). \u0412 \u043d\u0435\u0439 \u0435\u0441\u0442\u044c, \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c, local\/ \u043f\u043e\u0434\u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f, \u043a\u0443\u0434\u0430 \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u044e\u0442\u0441\u044f \u0441\u0441\u044b\u043b\u043a\u0438. \u0417\u0430\u0447\u0430\u0441\u0442\u0443\u044e \u0442\u0430\u043a\u0436\u0435 \u0435\u0441\u0442\u044c \u0438 \u00abrc\u00bb \u0444\u0430\u0439\u043b, \u043c\u0435\u043d\u044f\u044e\u0449\u0438\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u00ab\u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f\u00bb skelenv-\u0430.<\/p>\n<p> \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0430\u043a\u0435\u0442\u0430 pkgconf \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u044d\u0442\u043e\u0442 skelenv\/rc \u0444\u0430\u0439\u043b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f: <\/p>\n<pre> $ tar xfO $SKELPKGS\/$ARCH\/pkgconf-2.1.1 name | read namenhash $ tar xfO $SKELPKGS\/$ARCH\/pkgconf-2.1.1 bin |     tar xfO - $namenhash\/skelpkg\/$namenhash\/hooks\/postinst\/01rc-add #!\/bin\/sh -e _localpath=\"$(realpath local)\" cat &gt;&gt;rc &lt;&lt;EOF PKG_CONFIG_PATH=\"$_localpath\/lib\/pkgconfig:\\$PKG_CONFIG_PATH\" PKG_CONFIG_PATH=\"$_localpath\/libdata\/pkgconfig:\\$PKG_CONFIG_PATH\" export PKG_CONFIG_PATH EOF <\/pre>\n<p> \u0414\u0430\u0436\u0435 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 skelenv\/rc \u0444\u0430\u0439\u043b\u0430 \u0434\u0435\u043b\u0430\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 rc-paths \u043f\u0430\u043a\u0435\u0442\u0430, \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0435\u0433\u043e \u043d\u0438\u0447\u0435\u0433\u043e, \u043a\u0440\u043e\u043c\u0435 hook: <\/p>\n<pre> $ cat skel\/rc-paths.do [ -n \"$BASS_ROOT\" ] || BASS_ROOT=\"$(dirname \"$(realpath -- \"$0\")\")\"\/..\/..\/.. sname=$1.do . \"$BASS_ROOT\"\/lib\/rc . \"$BASS_ROOT\"\/build\/skel\/common.rc hsh=$(\"$BASS_ROOT\"\/build\/bin\/cksum $BASS_REV $SPATH) \"$BASS_ROOT\"\/bin\/rm-r \"$SKELBINS\"\/$ARCH\/$NAME-$hsh mkdir -p \"$SKELBINS\"\/$ARCH\/$NAME-$hsh cd \"$SKELBINS\"\/$ARCH\/$NAME-$hsh mkdir -p skelpkg\/$NAME-$hsh\/hooks\/postinst cat &gt;skelpkg\/$NAME-$hsh\/hooks\/postinst\/rc &lt;&lt;EOF _localpath=\"\\$(realpath local)\" PATH=\"\\$_localpath\/bin:\\$_localpath\/sbin:\\$PATH\" export MANPATH=\"\\$_localpath\/share\/man:\\$MANPATH\" export INFOPATH=\"\\$_localpath\/share\/info:\\$INFOPATH\" export LD_LIBRARY_PATH=\"\\$_localpath\/lib:\\$LD_LIBRARY_PATH\" export CFLAGS=\"-I\\$_localpath\/include \\$CFLAGS\" export CXXFLAGS=\"\\$CFLAGS \\$CXXFLAGS\" export LDFLAGS=\"-L\\$_localpath\/lib \\$LDFLAGS\" EOF cat &gt;skelpkg\/$NAME-$hsh\/hooks\/postinst\/01rc-inst &lt;&lt;EOF #!\/bin\/sh -e cp \"\\$SKELBINS\"\/\\$ARCH\/\\$NAMENHASH\/skelpkg\/\\$NAMENHASH\/hooks\/postinst\/rc . chmod +w rc EOF chmod +x skelpkg\/$NAME-$hsh\/hooks\/postinst\/01rc-inst cd .. COMPRESSOR=gzip \"$BASS_ROOT\"\/build\/lib\/mk-pkg $NAME-$hsh <\/pre>\n<p> \u041a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u043a\u0435\u0442\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0435 Zstandard \u0441\u0436\u0430\u0442\u0438\u0435, \u0430 gzip. \u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0434\u043e \u0441\u0438\u0445 \u043f\u043e\u0440 \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u044b \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u044e\u0449\u0438\u0435 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 zstd. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 skelpkg, \u043d\u043e \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0435\u0433\u043e \u043d\u0430\u0434\u043e \u0441\u043f\u0435\u0440\u0432\u0430 \u0447\u0435\u043c-\u0442\u043e \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p> pkg-inst \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u0442 \u043f\u0430\u043a\u0435\u0442: <\/p>\n<ul>\n<li>\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0435\u0441\u0442\u044c \u043b\u0438 \u043d\u0443\u0436\u043d\u044b\u0439 skelbin \u0432 $SKELBINS<\/li>\n<li>\u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u0440\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u0442 \u0435\u0433\u043e \u0438\u0437 skelpkg<\/li>\n<li>\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 preinst hook<\/li>\n<li>\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 stow, \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u0441\u044b\u043b\u043e\u043a<\/li>\n<li>\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 postinst<\/li>\n<\/ul>\n<p> \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u0432 skelenv\/skelpkgs\/$PKG \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u0441\u044f: <\/p>\n<ul>\n<li>\u00ablock\u00bb \u0444\u0430\u0439\u043b<\/li>\n<li>namenhash \u2014 \u0442\u043e\u0447\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 $NAME-$hsh \u043f\u0430\u043a\u0435\u0442\u0430<\/li>\n<li>$hook.done \u0444\u0430\u0439\u043b\u044b, \u0434\u043b\u044f \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f \u043a\u0430\u043a\u0438\u0435 hook-\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0438\u0441\u044c<\/li>\n<\/ul>\n<p> \u041d\u0430\u043a\u043e\u043d\u0435\u0446, \u0435\u0441\u0442\u044c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u0430 mk-skelenv: <\/p>\n<pre> % cat =mk-skelenv #!\/bin\/sh -e [ -n \"$BASS_ROOT\" ] || BASS_ROOT=\"$(dirname \"$(realpath -- \"$0\")\")\"\/..\/.. sname=\"$0\" . \"$BASS_ROOT\"\/lib\/rc mkdir local mkdir local\/service \"$BASS_ROOT\"\/build\/bin\/pkg-inst rc-paths stow <\/pre>\n<h2>\u0411\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0439 skel<\/h2>\n<p> <\/p>\n<pre> $ cat skel\/parallel-20240122.do [ -n \"$BASS_ROOT\" ] || BASS_ROOT=\"$(dirname \"$(realpath -- \"$0\")\")\"\/..\/..\/..\/.. sname=$1.do . \"$BASS_ROOT\"\/lib\/rc . \"$BASS_ROOT\"\/build\/skel\/common.rc  bdeps=\"rc-paths stow archivers\/zstd devel\/gmake-4.4.1\" rdeps=lang\/perl-5.32.1 redo-ifchange $bdeps \"$DISTFILES\"\/$name.tar.bz2 $rdeps hsh=$(\"$BASS_ROOT\"\/build\/bin\/cksum $BASS_REV $spath) . \"$BASS_ROOT\"\/build\/lib\/create-tmp-for-build.rc \"$BASS_ROOT\"\/build\/bin\/pkg-inst $bdeps $rdeps . .\/rc $TAR xf \"$DISTFILES\"\/$name.tar.bz2 \"$BASS_ROOT\"\/bin\/rm-r \"$SKELBINS\"\/$ARCH\/$NAME-$hsh  cd $NAME .\/configure --prefix=\"$SKELBINS\"\/$ARCH\/$NAME-$hsh --disable-documentation &gt;&amp;2 perl -i -ne 'print unless \/^\\s+citation_notice..;$\/' src\/parallel gmake -j$MAKE_JOBS &gt;&amp;2 gmake install &gt;&amp;2  cd \"$SKELBINS\"\/$ARCH \"$LIB\"\/prepare-preinst-010-rdeps $NAME-$hsh $rdeps mkdir -p $NAME-$hsh\/skelpkg\/$NAME-$hsh\/hooks\/postinst cat &gt;$NAME-$hsh\/skelpkg\/$NAME-$hsh\/hooks\/postinst\/01will-cite &lt;&lt;EOF #!\/bin\/sh echo yeah, yeah, will cite &gt;&amp;2 EOF chmod +x $NAME-$hsh\/skelpkg\/$NAME-$hsh\/hooks\/postinst\/01will-cite \"$BASS_ROOT\"\/build\/lib\/mk-pkg $NAME-$hsh <\/pre>\n<p> <\/p>\n<ul>\n<li>\u0423\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044f redo \u0446\u0435\u043b\u044c, \u0447\u0442\u043e \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0435 \u043f\u0430\u043a\u0435\u0442\u044b (rc-paths, stow, zstd, gmake, perl) \u0441\u043e\u0431\u0440\u0430\u043d\u044b<\/li>\n<li>\u0423\u0431\u0435\u0436\u0434\u0430\u0435\u043c\u0441\u044f, \u0447\u0442\u043e distfile \u0434\u043b\u044f GNU Parallel \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u0435\u0442, \u0441\u043a\u0430\u0447\u0430\u043d<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u0451\u043c \u0438 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438<\/li>\n<li>create-tmp-for-build.rc \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u043e\u043c \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 mk-skelenv<\/li>\n<li>\u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c $bdeps (build dependencies)<\/li>\n<li>\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u043c skelenv<\/li>\n<li>\u0420\u0430\u0441\u043f\u0430\u043a\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434<\/li>\n<li>\u0423\u0434\u0430\u043b\u044f\u0435\u043c \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0443\u044e \u0441\u0431\u043e\u0440\u043a\u0443, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043c\u043e\u0433\u043b\u0430 \u043e\u0441\u0442\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u043a\u0430\u043a\u043e\u0439-\u0442\u043e \u043d\u0435\u0448\u0442\u0430\u0442\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f rm-r \u0441\u043a\u0440\u0438\u043f\u0442, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u00abrm -r\u00bb, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u0432 skelbin \u0443\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u043f\u0440\u0430\u0432\u0430 \u043d\u0430 \u0437\u0430\u043f\u0438\u0441\u044c, \u0447\u0442\u043e \u043c\u0435\u0448\u0430\u0435\u0442 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e<\/li>\n<li>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c .\/configure<\/li>\n<li>\u041c\u043e\u0436\u0435\u043c \u0438 \u043f\u0430\u0442\u0447\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c, \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u043f\u0440\u0430\u0432\u0438\u0442\u044c<\/li>\n<li>\u0421\u043e\u0431\u0438\u0440\u0430\u0435\u043c \u0438 \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432 &#171;$SKELBINS&#187;\/$ARCH\/$NAME-$hsh<\/li>\n<li>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f hook-\u0430 \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 $rdeps (runtime dependencies) \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432. \u0423\u0436 \u0431\u043e\u043b\u044c\u043d\u043e \u0447\u0430\u0441\u0442\u043e\u0435 \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435<\/li>\n<li>\u0412\u0440\u0443\u0447\u043d\u0443\u044e \u0441\u043e\u0437\u0434\u0430\u0451\u043c hook, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0438\u0442 \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0438\u0442 \u0430\u0432\u0442\u043e\u0440 GNU Parallel, \u0447\u0442\u043e \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u0442\u044c \u0435\u0433\u043e \u041f\u041e<\/li>\n<li>\u0421\u043e\u0437\u0434\u0430\u0451\u043c skelpkg \u043f\u0430\u043a\u0435\u0442. \u0412 skelbin \u0431\u0443\u0434\u0443 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b \u043f\u0440\u0430\u0432\u0430 \u0438 \u0441\u0434\u0435\u043b\u0430\u043d fsync<\/li>\n<\/ul>\n<h2>distfiles<\/h2>\n<p> \u0421\u0431\u043e\u0440\u043a\u0430 \u041e\u0411\u042f\u0417\u0410\u041d\u0410 \u043d\u0435 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430. \u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u0432 \u043f\u043e\u043b\u043d\u043e\u0439 \u043c\u0435\u0440\u0435 \u043f\u0440\u0438\u0441\u0443\u0442\u0441\u0442\u0432\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u044b\u043c. \u0412 \u043f\u0440\u0435\u043e\u0431\u043b\u0430\u0434\u0430\u044e\u0449\u0435\u043c \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0435 \u0441\u043b\u0443\u0447\u0430\u0435\u0432 \u044d\u0442\u043e \u0441\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u043a \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044e tarball, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0441\u043e\u043f\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0438\u0445 \u043a\u0440\u0438\u043f\u0442\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u0434\u043f\u0438\u0441\u0435\u0439. \u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0446\u0435\u043b\u043e\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u041f\u043e\u044d\u0442\u043e\u043c\u0443, \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0446\u0435\u043b\u044c \u0434\u043b\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f tarball-\u043e\u0432 \u043e\u0436\u0438\u0434\u0430\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e Metalink4 \u0444\u0430\u0439\u043b\u0430, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0431\u0443\u0434\u0443\u0442 \u0441\u0441\u044b\u043b\u043a\u0438 (\u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043d\u0430 \u0437\u0435\u0440\u043a\u0430\u043b\u0430) \u0434\u043b\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f \u0438 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u044c\u043d\u044b\u0435 \u0441\u0443\u043c\u043c\u044b. \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u044f \u0446\u0435\u043b\u044c redo-ifchange &#171;$DISTFILES&#187;\/parallel-20240122.do.tar.bz2 \u043c\u044b \u0438\u0449\u0435\u043c parallel-20240122.do.tar.bz2.meta4 \u0444\u0430\u0439\u043b, \u0430 \u0434\u0430\u043b\u044c\u0448\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043b\u0438\u0431\u043e aria2c, \u043b\u0438\u0431\u043e wget, \u043b\u0438\u0431\u043e meta4ra-check \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u0434\u043b\u044f \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p> <a href=\"http:\/\/www.meta4ra.stargrave.org\/\" rel=\"nofollow noopener noreferrer\">meta4ra<\/a> \u0443\u0442\u0438\u043b\u0438\u0442\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c, \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u0442\u044c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c .meta4. <\/p>\n<pre> $ wget https:\/\/ftpmirror.gnu.org\/parallel\/parallel-20240122.tar.bz2 $ wget https:\/\/ftpmirror.gnu.org\/parallel\/parallel-20240122.tar.bz2.sig $ gpg --verify parallel-20240122.tar.bz2.sig # its .sig file contains non-signature related commentary, that we strip off: $ perl -i -ne 'print if \/BEGIN\/..\/END\/' parallel-20240122.tar.bz2.sig $ meta4ra-create \\     -fn parallel-20240122.tar.bz2 \\     -sig-pgp parallel-20240122.tar.bz2.sig \\     https:\/\/ftpmirror.gnu.org\/parallel\/parallel-20240122.tar.bz2 \\     &lt;parallel-20240122.tar.bz2 &gt;parallel-20240122.tar.bz2.meta4 <\/pre>\n<p> \u0410 \u0435\u0441\u043b\u0438 \u043d\u0430\u0434\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c tarball \u0438\u0437 \u043a\u043e\u043c\u043c\u0438\u0442\u0430 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f? <\/p>\n<pre> % cat distfiles\/vim-v9.1.1267.tar.zst.do [ -n \"$BASS_ROOT\" ] || BASS_ROOT=\"$(dirname \"$(realpath -- \"$0\")\")\"\/..\/.. sname=$1.do . \"$BASS_ROOT\"\/lib\/rc [ -d vim.git ] || git clone --depth 1 --bare https:\/\/github.com\/vim\/vim.git &gt;&amp;2 cd vim.git commit=de8f8f732ac1bcf69899df6ffd27dca9a4e66f3c git fetch origin $commit &gt;&amp;2 git archive --prefix=${1%.tar.zst}\/ $commit | $COMPRESSOR <\/pre>\n<p> \u0421\u043a\u0430\u0447\u0430\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u0430\u043a\u0435\u0442\u043e\u0432? <\/p>\n<pre> $ cat build\/distfiles\/all.do .\/list | xargs redo-ifchange $ cat build\/distfiles\/list #!\/bin\/sh -e cd \"$(dirname \"$(realpath -- \"$0\")\")\" sed -n \"\/[^\\\/]$\/p\" &lt;.gitignore | sed \"s#^\/##\" <\/pre>\n<p> \u0414\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u043d\u0430 \u0434\u0440\u0443\u0433\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 (\u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043e\u0442 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u0438\u043b\u0438 \u0432\u043e\u043e\u0431\u0449\u0435 \u0441\u0435\u0442\u0435\u0439) \u0432\u0441\u0451 \u0441\u043a\u0430\u0447\u0430\u043d\u043d\u043e\u0435, \u0443\u0434\u043e\u0431\u043d\u043e \u0431\u044b \u0431\u044b\u043b\u043e \u043e\u0444\u043e\u0440\u043c\u0438\u0442\u044c \u0430\u0440\u0445\u0438\u0432, \u0431\u0435\u0437 \u043d\u0435\u043d\u0443\u0436\u043d\u044b\u0445 \u0441\u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432: <\/p>\n<pre> % cat distfiles\/pack #!\/bin\/sh -e [ -n \"$BASS_ROOT\" ] || BASS_ROOT=\"$(dirname \"$(realpath -- \"$0\")\")\"\/..\/.. sname=\"$0\" . \"$BASS_ROOT\"\/lib\/rc cd \"$DISTFILES\" {     .\/list     find . -type f -name \"*.meta4\" } | $TAR cfT - -  $ distfiles\/pack | ssh remote \"tar xfC - \/path\/to\/distfiles\" <\/pre>\n<h2>prepare-deps<\/h2>\n<p> \u0421\u0431\u043e\u0440\u043e\u0447\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442: <\/p>\n<ul>\n<li>bsdtar (libarchive-based), \u0442\u0430\u043a \u043a\u0430\u043a GNU tar \u043d\u0435 \u0443\u043c\u0435\u0435\u0442 \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e \u0440\u0430\u0437\u0436\u0438\u043c\u0430\u0442\u044c \u043d\u0430 \u043b\u0435\u0442\u0443 \u0430\u0440\u0445\u0438\u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0435 \u0447\u0435\u0440\u0435\u0437 stdin<\/li>\n<li>meta4ra, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 Go<\/li>\n<li>Perl, \u043a\u0443\u0434\u0430 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e, \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0440\u0442\u0430\u0431\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u043f\u0440\u0435\u0442\u0438\u0440\u0443\u0435\u043c\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u043c\u0435\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 Unix-like \u0441\u0438\u0441\u0442\u0435\u043c\u0435<\/li>\n<li>redo. \u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c goredo, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 Go<\/li>\n<li>setlock, lockf, flock \u2014 \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e<\/li>\n<li>detpax, \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0439 \u0432 \u043a\u043e\u0434 BASS, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 Go<\/li>\n<\/ul>\n<p> \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0438\u0437 \u044d\u0442\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439, \u0432\u043a\u043b\u044e\u0447\u0430\u044f Go, \u0438\u043c\u0435\u0435\u0442\u0441\u044f contrib\/prepare-deps \u0441\u043a\u0440\u0438\u043f\u0442, \u0441\u043a\u0430\u0447\u0438\u0432\u0430\u044e\u0449\u0438\u0439 \u0438\u0445 \u0438\u0437 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0430 \u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0449\u0438\u0439 \u0432 local\/ \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043b\u0438\u0448\u044c \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c local\/bin \u0432 $PATH. \u0410 contrib\/go-debash \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0441\u043a\u0440\u0438\u043f\u0442\u044b \u0434\u043b\u044f \u0438\u0437\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f Go \u043e\u0442 bash \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<h2>\u0418\u0442\u043e\u0433<\/h2>\n<p> \u041f\u0440\u043e\u0435\u043a\u0442 BASS, \u043a\u0430\u043a \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0432\u043e\u0441\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u043c\u044b\u0445 \u0441\u0431\u043e\u0440\u043e\u043a \u0443 \u043d\u0430\u0441 \u0441 \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c\u0438 \u0430\u043a\u0442\u0438\u0432\u043d\u043e \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0433\u043e\u0434\u0430, \u0441\u043e\u0431\u0438\u0440\u0430\u044f \u043c\u0430\u0441\u0441\u0443 \u041f\u041e, \u0432\u043a\u043b\u044e\u0447\u0430\u044f Python \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u0434\u043b\u044f virtualenv. \u0426\u0435\u043b\u0435\u0432\u044b\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438 \u0431\u044b\u043b\u0438 Astra Linux \u0438 FreeBSD \u2014 \u0441 \u043c\u0438\u043d\u0438\u043c\u0443\u043c\u043e\u043c if-\u043e\u0432 \u0432 skel-\u0430\u0445.<\/p>\n<p> \u041a\u0430\u043a \u0442\u0430\u043a\u043e\u0432\u044b\u0445 release tarball-\u043e\u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043d\u0435\u0442 \u2014 \u0432\u0441\u0451 \u043b\u0435\u0436\u0438\u0442 \u0432 Git \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438. \u0412 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0431\u043e\u043b\u0435\u0435 \u0434\u0432\u0443\u0445\u0441\u043e\u0442 skel. \u041a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u0432\u0441\u0451 \u044d\u0442\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u043e\u0435 \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435.<\/p><\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><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\/articles\/925292\/\"> https:\/\/habr.com\/ru\/articles\/925292\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-1\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\u041f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u044c\u0442\u0435, \u0447\u0442\u043e \u0432\u0430\u043c \u043d\u0430\u0434\u043e \u043f\u043e\u0434\u043d\u044f\u0442\u044c \u043a\u0430\u043a\u0443\u044e-\u043d\u0438\u0431\u0443\u0434\u044c continuous integration \u0441\u0438\u0441\u0442\u0435\u043c\u0443. \u0420\u0430\u0441\u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0451\u043d\u043d\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f (BuildBot, Jenkins, TravisCI, &#8230;) \u2014 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043c\u043e\u043d\u0441\u0442\u0440\u0443\u043e\u0437\u043d\u044b\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b, \u0437\u0430\u0442\u043e\u0447\u0435\u043d\u043d\u044b\u0435 \u043f\u043e\u0434 \u0437\u0430\u043f\u0443\u0441\u043a \u043d\u0435\u0434\u043e\u0432\u0435\u0440\u0435\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u0432 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438. \u0417\u0430\u0439\u0442\u0438 \u043d\u0430 slave \u0438 \u043f\u043e\u043e\u0442\u043b\u0430\u0436\u0438\u0432\u0430\u0442\u044c \u0441\u043a\u0440\u0438\u043f\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u2014 \u043d\u0435 \u0434\u0430\u0434\u0443\u0442. \u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u0434\u0430\u0436\u0435 \u0442\u0435 \u0436\u0435 \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 BuildBot \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430 \u0443\u0436\u0435 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f web-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c, \u0430 \u043d\u0435 HTML \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430\u043c\u0438, \u0447\u0442\u043e \u0441\u0435\u0440\u044c\u0451\u0437\u043d\u043e\u0435 \u043d\u0435\u0443\u0434\u043e\u0431\u0441\u0442\u0432\u043e.<\/p>\n<p> \u0410 \u043c\u043e\u0436\u043d\u043e \u0447\u0442\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u043f\u043e\u043f\u0440\u043e\u0449\u0435 \u0438 \u043f\u043e\u043b\u0435\u0433\u0447\u0435? \u0418 \u0447\u0442\u043e\u0431\u044b \u0431\u044b\u043b\u043e \u043a\u0440\u043e\u0441\u0441\u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435\u043d\u043d\u044b\u043c: GNU\/Linux \u0434\u0430\u043b\u0435\u043a\u043e \u043d\u0435 \u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 \u043d\u0430 \u043a\u043e\u0442\u043e\u0440\u043e\u0439, <a href=\"https:\/\/habr.com\/ru\/articles\/490408\/\">\u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e<\/a>, \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u043e\u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0441\u043e\u0444\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-466149","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/466149","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=466149"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/466149\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=466149"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=466149"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=466149"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}