{"id":93638,"date":"2020-09-08T07:42:38","date_gmt":"2020-09-08T05:42:38","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/probuem-novye-instrumenty-dlya-sborki-i-avtomatizaczii-deploya-v-kubernetes"},"modified":"2020-09-08T07:42:38","modified_gmt":"2020-09-08T05:42:38","slug":"probuem-novye-instrumenty-dlya-sborki-i-avtomatizaczii-deploya-v-kubernetes","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/probuem-novye-instrumenty-dlya-sborki-i-avtomatizaczii-deploya-v-kubernetes","title":{"rendered":"Wir testen neue Werkzeuge zur Erstellung und Automatisierung von Deployments in Kubernetes","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes\" src=\"\/wp-content\/uploads\/2020\/09\/f48e464b540e8b5f876cfe8dcfe1b961.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u0417\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0448\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0430\u043a \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 Docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0442\u0430\u043a \u0438 \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0433\u0438\u0442\u043b\u0430\u0431\u043e\u043c, \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d.<\/p>\n<p><\/p>\n<p>\u0412\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0442\u0430\u043b \u0441\u0430\u0439\u0442 <noindex><a rel=\"nofollow\" href=\"https:\/\/kubernetes.io\/\" rel=\"nofollow\">kubernetes.io<\/a><\/noindex>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437 <noindex><a rel=\"nofollow\" href=\"http:\/\/github.com\/kubernetes\/website\" rel=\"nofollow\">\u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u0434\u043e\u0432<\/a><\/noindex> \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438\u0441\u043b\u0430\u043d\u043d\u044b\u0439 \u043f\u0443\u043b \u0440\u0435\u043a\u0432\u0435\u0441\u0442 \u0440\u043e\u0431\u043e\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442 preview-\u0432\u0435\u0440\u0441\u0438\u044e \u0441\u0430\u0439\u0442\u0430 \u0441 \u0432\u0430\u0448\u0438\u043c\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c\u0438 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0441\u044b\u043b\u043a\u0443 \u0434\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430.<\/p>\n<p><\/p>\n<p>\u042f \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u043b\u0441\u044f \u0432\u044b\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u043e\u0434\u043e\u0431\u043d\u044b\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441 \u043d\u0443\u043b\u044f, \u043d\u043e \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 Gitlab CI \u0438 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u044f \u043f\u0440\u0438\u0432\u044b\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 Kubernetes. \u0421\u0435\u0433\u043e\u0434\u043d\u044f \u044f, \u043d\u0430\u043a\u043e\u043d\u0435\u0446, \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u0432\u0430\u043c \u043e \u043d\u0438\u0445 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435.<\/p>\n<p><\/p>\n<p>\u0412 \u0441\u0442\u0430\u0442\u044c\u0435 \u0431\u0443\u0434\u0443\u0442 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0442\u0430\u043a\u0438\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u043a\u0430\u043a:<br \/>\n<strong>Hugo<\/strong>, <strong>qbec<\/strong>, <strong>kaniko<\/strong>, <strong>git-crypt<\/strong> \u0438 <strong>GitLab CI<\/strong> \u0441 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439.<\/p>\n<p><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1 id=\"coderzhanie\">C\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435<\/h1>\n<p><\/p>\n<ol>\n<li><noindex><a rel=\"nofollow\" href=\"#hugo\"><strong>\u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 Hugo<\/strong><\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#dockerfile\"><strong>\u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 Dockerfile<\/strong><\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#kaniko\"><strong>\u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 kaniko<\/strong><\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#qbec\"><strong>\u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 qbec<\/strong><\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#gitlab-runner\"><strong>\u041f\u0440\u043e\u0431\u0443\u0435\u043c Gitlab-runner \u0441 Kubernetes-executor<\/strong><\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#qbec-helm\"><strong>\u0414\u0435\u043f\u043b\u043e\u0439 Helm-\u0447\u0430\u0440\u0442\u043e\u0432 \u0441 qbec<\/strong><\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#git-crypt\"><strong>\u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 git-crypt<\/strong><\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#toolbox\"><strong>\u0421\u043e\u0437\u0434\u0430\u0451\u043c toolbox-\u043e\u0431\u0440\u0430\u0437<\/strong><\/a><\/noindex> <\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#pipeline-build\"><strong>\u041d\u0430\u0448 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0438 \u0441\u0431\u043e\u0440\u043a\u0430 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043f\u043e \u0442\u044d\u0433\u0430\u043c<\/strong><\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#pipeline-deploy\"><strong>\u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0435\u043f\u043b\u043e\u044f<\/strong><\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#artifacts\"><strong>\u0410\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u0438 \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u0438 push \u0432 master<\/strong><\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#dynamic-environments\"><strong>Dynamic environments<\/strong><\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"#review-apps\"><strong>Review Apps<\/strong><\/a><\/noindex><\/li>\n<\/ol>\n<h1 id=\"1-znakomstvo-s-hugoanchorhugoanchor\">1. \u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 Hugo<noindex><a rel=\"nofollow\" name=\"hugo\"><\/a><\/noindex><\/h1>\n<p><\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0430\u0439\u0442 \u0434\u043b\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438, \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 Hugo. Hugo \u2014 \u044d\u0442\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440 \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430.<\/p>\n<p><\/p>\n<p>\u0414\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043d\u0435 \u0437\u043d\u0430\u043a\u043e\u043c \u0441\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u0430\u043c\u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0443 \u043e \u043d\u0438\u0445 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435. \u0412 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 \u043e\u0442 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0434\u0432\u0438\u0436\u043a\u043e\u0432 \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0431\u0430\u0437\u043e\u0439 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043a\u0430\u043a\u0438\u043c-\u043d\u0438\u0431\u0443\u0434\u044c php, \u043a\u043e\u0442\u043e\u0440\u044b\u0435, \u043f\u0440\u0438 \u0437\u0430\u043f\u0440\u043e\u0441\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u044e\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043d\u0430 \u043b\u0435\u0442\u0443, \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0433\u0435\u043d\u0435\u0440\u0430\u0442\u043e\u0440\u044b \u0443\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u043d\u0430\u0447\u0435. \u041e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u0432\u0437\u044f\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 Markdown-\u0440\u0430\u0437\u043c\u0435\u0442\u043a\u0435 \u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0442\u0435\u043c, \u0437\u0430\u0442\u0435\u043c \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u0445 \u0432 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0433\u043e\u0442\u043e\u0432\u044b\u0439 \u0441\u0430\u0439\u0442.<\/p>\n<p><\/p>\n<p>\u0422\u043e \u0435\u0441\u0442\u044c \u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0439 \u0438 \u043d\u0430\u0431\u043e\u0440 \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 html-\u0444\u0430\u0439\u043b\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u0437\u0430\u043b\u0438\u0442\u044c \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u0434\u0435\u0448\u0451\u0432\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u0441\u0430\u0439\u0442.<\/p>\n<p><\/p>\n<p>Hugo \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0438 \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u0434\u0435\u043b\u0435:<\/p>\n<p><\/p>\n<p>\u0418\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0439 \u0441\u0430\u0439\u0442:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">hugo new site docs.example.org<\/code><\/pre>\n<p><\/p>\n<p>\u0418 \u0437\u0430\u043e\u0434\u043d\u043e git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">cd docs.example.org\ngit init<\/code><\/pre>\n<p><\/p>\n<p>\u041f\u043e\u043a\u0430 \u0447\u0442\u043e \u043d\u0430\u0448 \u0441\u0430\u0439\u0442 \u0434\u0435\u0432\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0447\u0438\u0441\u0442 \u0438 \u0447\u0442\u043e\u0431\u044b \u043d\u0430 \u043d\u0451\u043c \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u044f\u0432\u0438\u043b\u043e\u0441\u044c \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0442\u0435\u043c\u0443, \u0442\u0435\u043c\u0430 \u2014 \u0432\u0441\u0435\u0433\u043e \u043b\u0438\u0448\u044c \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0442\u0435\u043c\u043f\u043b\u0435\u0439\u0442\u043e\u0432 \u0438 \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0440\u0430\u0432\u0438\u043b \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u0448 \u0441\u0430\u0439\u0442.<\/p>\n<p><\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u0435\u043c\u044b \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <noindex><a rel=\"nofollow\" href=\"https:\/\/themes.gohugo.io\/hugo-theme-learn\/\" rel=\"nofollow\"><strong>Learn<\/strong><\/a><\/noindex>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f, \u043d\u0430 \u043c\u043e\u0439 \u0432\u0437\u0433\u043b\u044f\u0434, \u043a\u0430\u043a \u043d\u0435\u043b\u044c\u0437\u044f \u043b\u0443\u0447\u0448\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u0430 \u0441 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0435\u0439.<\/p>\n<p><\/p>\n<p>\u041e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0443\u0434\u0435\u043b\u0438\u0442\u044c \u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0444\u0430\u0439\u043b\u044b \u0442\u0435\u043c\u044b \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <strong>git submodule<\/strong>:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">git submodule add https:\/\/github.com\/matcornic\/hugo-theme-learn themes\/learn<\/code><\/pre>\n<p><\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432 \u043d\u0430\u0448\u0435\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0431\u0443\u0434\u0443\u0442 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u044c\u0441\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0444\u0430\u0439\u043b\u044b \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a \u043d\u0430\u0448\u0435\u043c\u0443 \u043f\u0440\u043e\u0435\u043a\u0442\u0443, \u0430 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u0430\u044f \u0442\u0435\u043c\u0430 \u043e\u0441\u0442\u0430\u043d\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u0441\u0441\u044b\u043b\u043a\u0438 \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438 \u043a\u043e\u043c\u043c\u0438\u0442 \u0432 \u043d\u0451\u043c, \u0442\u043e \u0435\u0441\u0442\u044c \u0435\u0451 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0442\u044f\u043d\u0443\u0442\u044c \u0438\u0437 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 \u0438 \u043d\u0435 \u0431\u043e\u044f\u0442\u044c\u0441\u044f \u043d\u0435\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439.<\/p>\n<p><\/p>\n<p>\u041f\u043e\u0434\u043f\u0440\u0430\u0432\u0438\u043c \u043a\u043e\u043d\u0444\u0438\u0433 <strong>config.toml<\/strong>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">baseURL = \"http:\/\/docs.example.org\/\"\nlanguageCode = \"en-us\"\ntitle = \"My Docs Site\"\ntheme = \"learn\"<\/code><\/pre>\n<p><\/p>\n<p>\u0423\u0436\u0435 \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">hugo server<\/code><\/pre>\n<p><\/p>\n<p>\u0418 \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 <noindex><a rel=\"nofollow\" href=\"http:\/\/localhost:1313\/\" rel=\"nofollow\">http:\/\/localhost:1313\/<\/a><\/noindex> \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u043d\u0430\u0448 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0439 \u0441\u0430\u0439\u0442, \u0432\u0441\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0438\u0437\u0432\u0435\u0434\u0451\u043d\u043d\u044b\u0435 \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u044f\u044e\u0442 \u0438 \u043e\u0442\u043a\u0440\u044b\u0442\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0443 \u0432 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0435, \u043e\u0447\u0435\u043d\u044c \u0443\u0434\u043e\u0431\u043d\u043e!<\/p>\n<p><\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0442\u0438\u0442\u0443\u043b\u044c\u043d\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0432 <strong>content\/_index.md<\/strong>:<\/p>\n<p><\/p>\n<pre><code class=\"markdown\"># My docs site\n\n## Welcome to the docs!\n\nYou will be very smart :-)<\/code><\/pre>\n<p>\n<b class=\"spoiler_title\">\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b<\/b><\/p>\n<p><img decoding=\"async\" alt=\"\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes\" src=\"\/wp-content\/uploads\/2020\/09\/919c801353d62e562b6bec4b55fa2470.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0414\u043b\u044f \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438 \u0441\u0430\u0439\u0442\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">hugo<\/code><\/pre>\n<p><\/p>\n<p>\u0421\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <strong>public\/<\/strong> \u0438 \u0431\u0443\u0434\u0435\u0442 \u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0432\u0430\u0448\u0438\u043c \u0441\u0430\u0439\u0442\u043e\u043c.<br \/>\n\u0414\u0430, \u043a\u0441\u0442\u0430\u0442\u0438, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u0440\u0430\u0437\u0443 \u0432\u043d\u0435\u0441\u0451\u043c \u0435\u0451 \u0432 <strong>.gitignore<\/strong>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">echo \/public &gt; .gitignore<\/code><\/pre>\n<p><\/p>\n<p>\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442\u044c \u043d\u0430\u0448\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">git add .\ngit commit -m \"New site created\"<\/code><\/pre>\n<h1 id=\"2-podgotovka-dockerfileanchordockerfileanchor\">2. \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 Dockerfile<noindex><a rel=\"nofollow\" name=\"dockerfile\"><\/a><\/noindex><\/h1>\n<p><\/p>\n<p>\u041d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443 \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f. \u041e\u0431\u044b\u0447\u043d\u043e \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e \u0447\u0442\u043e-\u0442\u043e \u0432\u0440\u043e\u0434\u0435:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">.\n\u251c\u2500\u2500 deploy\n\u2502   \u251c\u2500\u2500 app1\n\u2502   \u2514\u2500\u2500 app2\n\u2514\u2500\u2500 dockerfiles\n    \u251c\u2500\u2500 image1\n    \u2514\u2500\u2500 image2<\/code><\/pre>\n<p><\/p>\n<ul>\n<li><strong>dockerfiles\/<\/strong> \u2014 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0441 Dockerfiles \u0438 \u0432\u0441\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043d\u0430\u0448\u0438\u0445 docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432.<\/li>\n<li><strong>deploy\/<\/strong> \u2014 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u0432 Kubernetes<\/li>\n<\/ul>\n<p><\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043d\u0430\u0448 \u043f\u0435\u0440\u0432\u044b\u0439 Dockerfile \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043f\u043e \u043f\u0443\u0442\u0438 <strong>dockerfiles\/website\/Dockerfile<\/strong><\/p>\n<p><\/p>\n<pre><code class=\"bash\">FROM alpine:3.11 as builder\nARG HUGO_VERSION=0.62.0\nRUN wget -O- https:\/\/github.com\/gohugoio\/hugo\/releases\/download\/v${HUGO_VERSION}\/hugo_${HUGO_VERSION}_linux-64bit.tar.gz | tar -xz -C \/usr\/local\/bin\nADD . \/src\nRUN hugo -s \/src\n\nFROM alpine:3.11\nRUN apk add --no-cache darkhttpd\nCOPY --from=builder \/src\/public \/var\/www\nENTRYPOINT [ \"\/usr\/bin\/darkhttpd\" ]\nCMD [ \"\/var\/www\" ]<\/code><\/pre>\n<p><\/p>\n<p>\u041a\u0430\u043a \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, Dockerfile \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0434\u0432\u0430 <strong>FROM<\/strong>, \u044d\u0442\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043d\u0430\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.docker.com\/develop\/develop-images\/multistage-build\/\" rel=\"nofollow\"><strong>multi-stage build<\/strong><\/a><\/noindex> \u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0441\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0438\u0437 \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u043e\u0433\u043e docker-\u043e\u0431\u0440\u0430\u0437\u0430 \u0432\u0441\u0451 \u043d\u0435\u043d\u0443\u0436\u043d\u043e\u0435.<br \/>\n\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0444\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 \u0443 \u043d\u0430\u0441 \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e <strong>darkhttpd<\/strong> (\u043b\u0435\u0433\u043a\u043e\u0432\u0435\u0441\u043d\u044b\u0439 HTTP-\u0441\u0435\u0440\u0432\u0435\u0440) \u0438 <strong>public\/<\/strong> \u2014 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0441\u0433\u0435\u043d\u0438\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0430\u0439\u0442\u0430.<\/p>\n<p><\/p>\n<p>\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442\u044c \u043d\u0430\u0448\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">git add dockerfiles\/website\ngit commit -m \"Add Dockerfile for website\"<\/code><\/pre>\n<h1 id=\"3-znakomstvo-s-kanikoanchorkanikoanchor\">3. \u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 kaniko<noindex><a rel=\"nofollow\" name=\"kaniko\"><\/a><\/noindex><\/h1>\n<p><\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0431\u043e\u0440\u0449\u0438\u043a\u0430 docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u044f \u0440\u0435\u0448\u0438\u043b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c <strong><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/GoogleContainerTools\/kaniko\" rel=\"nofollow\">kaniko<\/a><\/noindex><\/strong>, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u043b\u044f \u0435\u0433\u043e \u0440\u0430\u0431\u043e\u0442\u044b \u043d\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043d\u0430\u043b\u0438\u0447\u0438\u0435 docker-\u0434\u0435\u043c\u043e\u043d\u0430, \u0430 \u0441\u0430\u043c\u0443 \u0441\u0431\u043e\u0440\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u043d\u0430 \u043b\u044e\u0431\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 \u0438 \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u043a\u044d\u0448 \u043f\u0440\u044f\u043c\u043e \u0432 registry, \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0441\u044c, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c, \u043e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u043c\u0435\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u043e\u0435 persistent-\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435.<\/p>\n<p><\/p>\n<p>\u0414\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0441 <strong>kaniko executor<\/strong> \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0435\u043c\u0443 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442 \u0441\u0431\u043e\u0440\u043a\u0438, \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043c\u043e\u0436\u043d\u043e \u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e, \u0447\u0435\u0440\u0435\u0437 docker:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">docker run -ti --rm \n  -v $PWD:\/workspace \n  -v ~\/.docker\/config.json:\/kaniko\/.docker\/config.json:ro \n  gcr.io\/kaniko-project\/executor:v0.15.0 \n  --cache \n  --dockerfile=dockerfiles\/website\/Dockerfile \n  --destination=registry.gitlab.com\/kvaps\/docs.example.org\/website:v0.0.1<\/code><\/pre>\n<p><\/p>\n<p>\u0413\u0434\u0435 <strong>registry.gitlab.com\/kvaps\/docs.example.org\/website<\/strong> \u2014 \u0438\u043c\u044f \u0432\u0430\u0448\u0435\u0433\u043e docker-\u043e\u0431\u0440\u0430\u0437\u0430, \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0437\u0430\u043f\u0443\u0448\u0435\u043d \u0432 docker-\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438.<\/p>\n<p><\/p>\n<p>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 <strong>&#8212;cache<\/strong> \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043a\u044d\u0448\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u043e\u0438 \u0432 docker registry, \u0434\u043b\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u043e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u044e\u0442\u044c\u0441\u044f \u0432 <strong>registry.gitlab.com\/kvaps\/docs.example.org\/website\/cache<\/strong>, \u043d\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0443\u0442\u044c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 <strong>&#8212;cache-repo<\/strong>.<\/p>\n<p>\n<b class=\"spoiler_title\">\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 docker-registry<\/b><\/p>\n<p><img decoding=\"async\" alt=\"\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes\" src=\"\/wp-content\/uploads\/2020\/09\/86587e86ecff09607de12fb7219b98c6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h1 id=\"4-znakomstvo-s-qbecanchorqbecanchor\">4. \u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 qbec<noindex><a rel=\"nofollow\" name=\"qbec\"><\/a><\/noindex><\/h1>\n<p><\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/qbec.io\/\" rel=\"nofollow\">Qbec<\/a><\/noindex> \u2014 \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u0434\u0435\u043f\u043b\u043e\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u0438\u0445 \u0432 Kubernetes. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 Jsonnet \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u0441\u0438\u043b\u044c\u043d\u043e \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u0439 \u0434\u043b\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0447\u0442\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0438\u0437\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0442 \u043f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u043e\u0441\u0442\u0438 \u043a\u043e\u0434\u0430.<\/p>\n<p><\/p>\n<p>\u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u043e \u0432 \u0442\u0435\u0445 \u0441\u043b\u0443\u0447\u0430\u044f\u0445, \u043a\u043e\u0433\u0434\u0430 \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 \u0441 \u0440\u0430\u0437\u043d\u044b\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0434\u0435\u043a\u043b\u0430\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0438\u0445 \u0432 Git.<\/p>\n<p><\/p>\n<p>Qbec \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c Helm-\u0447\u0430\u0440\u0442\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u044f \u0438\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0438 \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u0438 \u0442\u0430\u043a\u0436\u0435 \u043a\u0430\u043a \u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0430\u043c\u0438, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0442\u044c \u043d\u0430 \u043d\u0438\u0445 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u043c\u0443\u0442\u0430\u0446\u0438\u0438, \u0430 \u044d\u0442\u043e, \u0432 \u0441\u0432\u043e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0438\u0437\u0431\u0430\u0432\u0438\u0442\u044c\u0441\u044f \u043e\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c ChartMuseum. \u0422\u043e \u0435\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c \u0447\u0430\u0440\u0442\u044b \u043f\u0440\u044f\u043c\u043e \u0438\u0437 git, \u0433\u0434\u0435 \u0438\u043c \u0438 \u0441\u0430\u043c\u043e\u0435 \u043c\u0435\u0441\u0442\u043e.<\/p>\n<p><\/p>\n<p>\u041a\u0430\u043a \u044f \u0433\u043e\u0432\u043e\u0440\u0438\u043b \u0440\u0430\u043d\u044c\u0448\u0435, \u0432\u0441\u0435 \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u044b \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <strong>deploy\/<\/strong>:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">mkdir deploy\ncd deploy<\/code><\/pre>\n<p><\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043d\u0430\u0448\u0435 \u043f\u0435\u0440\u0432\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">qbec init website\ncd website<\/code><\/pre>\n<p><\/p>\n<p>\u0421\u0435\u0439\u0447\u0430\u0441 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">.\n\u251c\u2500\u2500 components\n\u251c\u2500\u2500 environments\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 base.libsonnet\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 default.libsonnet\n\u251c\u2500\u2500 params.libsonnet\n\u2514\u2500\u2500 qbec.yaml<\/code><\/pre>\n<p><\/p>\n<p>\u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0444\u0430\u0439\u043b <strong>qbec.yaml<\/strong>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">apiVersion: qbec.io\/v1alpha1\nkind: App\nmetadata:\n  name: website\nspec:\n  environments:\n    default:\n      defaultNamespace: docs\n      server: https:\/\/kubernetes.example.org:8443\n  vars: {}<\/code><\/pre>\n<p><\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c <strong>spec.environments<\/strong>, qbec \u0443\u0436\u0435 \u0441\u043e\u0437\u0434\u0430\u043b \u0437\u0430 \u043d\u0430\u0441 default \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0438 \u0432\u0437\u044f\u043b \u0430\u0434\u0440\u0435\u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u0430 \u0442\u0430\u043a\u0436\u0435 namespace \u0438\u0437 \u043d\u0430\u0448\u0435\u0433\u043e \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e kubeconfig.<br \/>\n\u0422\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438 \u0434\u0435\u043f\u043b\u043e\u0435 \u0432 <strong>default<\/strong> \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435, qbec \u0432\u0441\u0435\u0433\u0434\u0430 \u0431\u0443\u0434\u0435\u0442 \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0438 \u0432 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0439 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441, \u0442\u043e \u0435\u0441\u0442\u044c \u0432\u0430\u043c \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043f\u0440\u0438\u0434\u0451\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u043c\u0435\u0436\u0434\u0443 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u0430\u043c\u0438 \u0438 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441\u0430\u043c\u0438 \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0435\u043f\u043b\u043e\u0439.<br \/>\n\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u043e\u0431\u043e\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u0438 \u0432\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u0435\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0432 \u044d\u0442\u043e\u043c \u0444\u0430\u0439\u043b\u0435.<\/p>\n<p><\/p>\n<p>\u0412\u0441\u0435 \u0432\u0430\u0448\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442\u0441\u044f \u0432 <strong>qbec.yaml<\/strong>, \u0438 \u0432 \u0444\u0430\u0439\u043b\u0435 <strong>params.libsonnet<\/strong>, \u0433\u0434\u0435 \u0441\u043a\u0430\u0437\u0430\u043d\u043e \u043e\u0442\u043a\u0443\u0434\u0430 \u043d\u0443\u0436\u043d\u043e \u0431\u0440\u0430\u0442\u044c \u0434\u043b\u044f \u043d\u0438\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b.<\/p>\n<p><\/p>\n<p>\u0414\u0430\u043b\u044c\u0448\u0435 \u043c\u044b \u0432\u0438\u0434\u0438\u043c \u0434\u0432\u0435 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438:<\/p>\n<p><\/p>\n<ul>\n<li><strong>components\/<\/strong> \u2014 \u0437\u0434\u0435\u0441\u044c \u0431\u0443\u0434\u0443\u0442 \u0445\u0440\u0430\u043d\u0438\u0442\u044c\u0441\u044f \u0432\u0441\u0435 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043e\u043d\u0438 \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b \u043a\u0430\u043a \u0432 jsonnet \u0442\u0430\u043a \u0438 \u043e\u0431\u044b\u0447\u043d\u044b\u043c\u0438 yaml-\u0444\u0430\u0439\u043b\u0430\u043c\u0438<\/li>\n<li><strong>environments\/<\/strong> \u2014 \u0437\u0434\u0435\u0441\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0432\u0441\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 (\u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b) \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439.<\/li>\n<\/ul>\n<p><\/p>\n<p>\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u043c\u044b \u0438\u043c\u0435\u0435\u043c \u0434\u0432\u0430 \u0444\u0430\u0439\u043b\u0430:<\/p>\n<p><\/p>\n<ul>\n<li><strong>environments\/base.libsonnet<\/strong> \u2014 \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0431\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439<\/li>\n<li><strong>environments\/default.libsonnet<\/strong> \u2014 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0435\u0440\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f <strong>default<\/strong><\/li>\n<\/ul>\n<p><\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0442\u043a\u0440\u043e\u0435\u043c <strong>environments\/base.libsonnet<\/strong> \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0443\u0434\u0430 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430:<\/p>\n<p><\/p>\n<pre><code class=\"javascript\">{\n  components: {\n    website: {\n      name: 'example-docs',\n      image: 'registry.gitlab.com\/kvaps\/docs.example.org\/website:v0.0.1',\n      replicas: 1,\n      containerPort: 80,\n      servicePort: 80,\n      nodeSelector: {},\n      tolerations: [],\n      ingressClass: 'nginx',\n      domain: 'docs.example.org',\n    },\n  },\n}<\/code><\/pre>\n<p><\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0442\u0430\u043a\u0436\u0435 \u043d\u0430\u0448 \u043f\u0435\u0440\u0432\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 <strong>components\/website.jsonnet<\/strong>:<\/p>\n<p><\/p>\n<pre><code class=\"javascript\">local env = {\n  name: std.extVar('qbec.io\/env'),\n  namespace: std.extVar('qbec.io\/defaultNs'),\n};\nlocal p = import '..\/params.libsonnet';\nlocal params = p.components.website;\n\n[\n  {\n    apiVersion: 'apps\/v1',\n    kind: 'Deployment',\n    metadata: {\n      labels: { app: params.name },\n      name: params.name,\n    },\n    spec: {\n      replicas: params.replicas,\n      selector: {\n        matchLabels: {\n          app: params.name,\n        },\n      },\n      template: {\n        metadata: {\n          labels: { app: params.name },\n        },\n        spec: {\n          containers: [\n            {\n              name: 'darkhttpd',\n              image: params.image,\n              ports: [\n                {\n                  containerPort: params.containerPort,\n                },\n              ],\n            },\n          ],\n          nodeSelector: params.nodeSelector,\n          tolerations: params.tolerations,\n          imagePullSecrets: [{ name: 'regsecret' }],\n        },\n      },\n    },\n  },\n  {\n    apiVersion: 'v1',\n    kind: 'Service',\n    metadata: {\n      labels: { app: params.name },\n      name: params.name,\n    },\n    spec: {\n      selector: {\n        app: params.name,\n      },\n      ports: [\n        {\n          port: params.servicePort,\n          targetPort: params.containerPort,\n        },\n      ],\n    },\n  },\n  {\n    apiVersion: 'extensions\/v1beta1',\n    kind: 'Ingress',\n    metadata: {\n      annotations: {\n        'kubernetes.io\/ingress.class': params.ingressClass,\n      },\n      labels: { app: params.name },\n      name: params.name,\n    },\n    spec: {\n      rules: [\n        {\n          host: params.domain,\n          http: {\n            paths: [\n              {\n                backend: {\n                  serviceName: params.name,\n                  servicePort: params.servicePort,\n                },\n              },\n            ],\n          },\n        },\n      ],\n    },\n  },\n]<\/code><\/pre>\n<p><\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043c\u044b \u043e\u043f\u0438\u0441\u0430\u043b\u0438 \u0441\u0440\u0430\u0437\u0443 \u0442\u0440\u0438 Kubernetes-c\u0443\u0449\u043d\u043e\u0441\u0442\u0438, \u044d\u0442\u043e: <strong>Deployment<\/strong>, <strong>Service<\/strong> \u0438 <strong>Ingress<\/strong>. \u041f\u0440\u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0438 \u043c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u0432\u044b\u043d\u0435\u0441\u0442\u0438 \u0438\u0445 \u0432 \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043d\u043e \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u044d\u0442\u0430\u043f\u0435 \u043d\u0430\u043c \u0445\u0432\u0430\u0442\u0438\u0442 \u0438 \u043e\u0434\u043d\u043e\u0433\u043e.<\/p>\n<p><\/p>\n<p>\u0421\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441 <strong>jsonnet<\/strong> \u043e\u0447\u0435\u043d\u044c \u043f\u043e\u0445\u043e\u0436 \u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 json, \u0432 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 json \u0443\u0436\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c jsonnet, \u0442\u0430\u043a \u0447\u0442\u043e \u043f\u0435\u0440\u0432\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u0430\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0449\u0435 \u0432\u043e\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u043e\u043d\u043b\u0430\u0439\u043d-\u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u0432\u0440\u043e\u0434\u0435 <strong>yaml2json<\/strong> \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u043e\u043d\u0432\u0435\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0432\u044b\u0447\u043d\u044b\u0439 \u0432\u0430\u043c yaml \u0432 json, \u043b\u0438\u0431\u043e, \u0435\u0441\u043b\u0438 \u0432\u0430\u0448\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b \u043d\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u0442\u043e \u0438\u0445 \u0432\u043f\u043e\u043b\u043d\u0435 \u043c\u043e\u0436\u043d\u043e \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u0432\u0438\u0434\u0435 \u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e yaml.<\/p>\n<p><\/p>\n<blockquote><p>\u041f\u0440\u0438 \u0440\u0430\u0431\u043e\u0442\u0435 \u0441 <strong>jsonnet<\/strong> \u043e\u0447\u0435\u043d\u044c \u0441\u043e\u0432\u0435\u0442\u0443\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0432\u0430\u043c \u043f\u043b\u0430\u0433\u0438\u043d \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430<\/p>\n<p>\u041a \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u0434\u043b\u044f vim \u0435\u0441\u0442\u044c \u043f\u043b\u0430\u0433\u0438\u043d <strong>vim-jsonnet<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u043f\u043e\u0434\u0441\u0432\u0435\u0442\u043a\u0443 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 <strong>jsonnet fmt<\/strong> \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0438 (\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u043d\u0430\u043b\u0438\u0447\u0438\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u043e jsonnet).<\/p><\/blockquote>\n<p>\u0412\u0441\u0451 \u0433\u043e\u0442\u043e\u0432\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u043c \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c \u0434\u0435\u043f\u043b\u043e\u0439:<\/p>\n<p><\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0447\u0442\u043e \u0443 \u043d\u0430\u0441 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043c:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">qbec show default<\/code><\/pre>\n<p><\/p>\n<p>\u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0432\u044b \u0443\u0432\u0438\u0434\u0438\u0442\u0435 \u043e\u0442\u0440\u0435\u043d\u0434\u0435\u0440\u0435\u043d\u043d\u044b\u0435 yaml-\u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u043c\u0435\u043d\u0435\u043d\u044b \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 default.<\/p>\n<p><\/p>\n<p>\u041e\u0442\u043b\u0438\u0447\u043d\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">qbec apply default<\/code><\/pre>\n<p><\/p>\n<p>\u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u0432\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0443\u0432\u0438\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0434\u0435\u043b\u0430\u043d\u043d\u043e \u0432 \u0432\u0430\u0448\u0435\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435, qbec \u043f\u043e\u043f\u0440\u043e\u0441\u0438\u0442 \u0432\u0430\u0441 \u0441\u043e\u0433\u043b\u0430\u0441\u0438\u0442\u044c\u0441\u044f \u0441 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438, \u043d\u0430\u0431\u0440\u0430\u0432 <strong>y<\/strong> \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u044c \u0441\u0432\u043e\u0438 \u043d\u0430\u043c\u0435\u0440\u0435\u043d\u0438\u044f.<\/p>\n<p><\/p>\n<p>\u0413\u043e\u0442\u043e\u0432\u043e \u0442\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0435\u043d\u043e! <\/p>\n<p><\/p>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u043d\u0435\u0441\u0435\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">qbec diff default<\/code><\/pre>\n<p><\/p>\n<p>\u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u043a\u0430\u043a \u044d\u0442\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043e\u0442\u0440\u0430\u0437\u044f\u0442\u0441\u044f \u043d\u0430 \u0442\u0435\u043a\u0443\u0449\u0435\u043c \u0434\u0435\u043f\u043b\u043e\u0435<\/p>\n<p><\/p>\n<p>\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442\u044c \u043d\u0430\u0448\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">cd ..\/..\ngit add deploy\/website\ngit commit -m \"Add deploy for website\"<\/code><\/pre>\n<h1 id=\"5-probuem-gitlab-runner-s-kubernetes-executoranchorgitlab-runneranchor\">5. \u041f\u0440\u043e\u0431\u0443\u0435\u043c Gitlab-runner \u0441 Kubernetes-executor<noindex><a rel=\"nofollow\" name=\"gitlab-runner\"><\/a><\/noindex><\/h1>\n<p><\/p>\n<p>\u0414\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044b\u0447\u043d\u044b\u0439 <strong>gitlab-runner<\/strong> \u043d\u0430 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 (LXC-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0435) \u0441 shell- \u0438\u043b\u0438 docker-executor. \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u043c\u044b \u0438\u043c\u0435\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0442\u0430\u043a\u0438\u0445 \u0440\u0430\u043d\u043d\u0435\u0440\u043e\u0432 \u0433\u043b\u043e\u0431\u0430\u043b\u044c\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u044b\u0445 \u0432 \u043d\u0430\u0448\u0435\u043c \u0433\u0438\u0442\u043b\u0430\u0431\u0435. \u041e\u043d\u0438 \u0441\u043e\u0431\u0438\u0440\u0430\u043b\u0438 docker-\u043e\u0431\u0440\u0430\u0437\u044b \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432.<\/p>\n<p><\/p>\n<p>\u041d\u043e \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u0430 \u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0430 \u2014 \u044d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043d\u0435 \u0441\u0430\u043c\u044b\u0439 \u0438\u0434\u0435\u0430\u043b\u044c\u043d\u044b\u0439, \u043a\u0430\u043a \u0432 \u043f\u043b\u0430\u043d\u0435 \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u043e\u0441\u0442\u0438, \u0442\u0430\u043a \u0438 \u0432 \u043f\u043b\u0430\u043d\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u0413\u043e\u0440\u0430\u0437\u0434\u043e \u043b\u0443\u0447\u0448\u0435 \u0438 \u0438\u0434\u0435\u043e\u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0435\u0439 \u0438\u043c\u0435\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0430\u043d\u043d\u0435\u0440\u044b \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0435\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u0430 \u0442\u043e \u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f.<\/p>\n<p><\/p>\n<p>\u041a \u0441\u0447\u0430\u0441\u0442\u044c\u044e \u044d\u0442\u043e \u0432\u043e\u0432\u0441\u0435 \u043d\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c <strong>gitlab-runner<\/strong> \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u044c \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043f\u0440\u044f\u043c\u043e \u0432 Kubernetes.<\/p>\n<p><\/p>\n<p>Gitlab \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0433\u043e\u0442\u043e\u0432\u044b\u0439 helm-\u0447\u0430\u0440\u0442 \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f gitlab-runner \u0432 Kubernetes. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u0441\u0451 \u0447\u0442\u043e \u0432\u0430\u043c \u043d\u0443\u0436\u043d\u043e, \u044d\u0442\u043e \u0443\u0437\u043d\u0430\u0442\u044c <strong>registration token<\/strong> \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0432 <strong>Settings &#8212;&gt; CI \/ CD &#8212;&gt; Runners<\/strong> \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0435\u0433\u043e helm:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">helm repo add gitlab https:\/\/charts.gitlab.io\n\nhelm install gitlab-runner \n  --set gitlabUrl=https:\/\/gitlab.com \n  --set runnerRegistrationToken=yga8y-jdCusVDn_t4Wxc \n  --set rbac.create=true \n  gitlab\/gitlab-runner<\/code><\/pre>\n<p><\/p>\n<p>\u0413\u0434\u0435:<\/p>\n<p><\/p>\n<ul>\n<li><strong><noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\" rel=\"nofollow\">https:\/\/gitlab.com<\/a><\/noindex><\/strong> \u2014 \u0430\u0434\u0440\u0435\u0441 \u0432\u0430\u0448\u0435\u0433\u043e Gitlab-\u0441\u0435\u0440\u0432\u0435\u0440\u0430.<\/li>\n<li><strong>yga8y-jdCusVDn_t4Wxc<\/strong> \u2014 registration token \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/li>\n<li><strong>rbac.create=true<\/strong> \u2014 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0440\u0430\u043d\u043d\u0435\u0440\u0443 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u0438\u0432\u0438\u043b\u0435\u0433\u0438\u0439, \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u044b \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0438\u0445 \u0437\u0430\u0434\u0430\u0447 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e kubernetes-executor.<\/li>\n<\/ul>\n<p><\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u0441\u0451 \u0441\u0434\u0435\u043b\u0430\u043d\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e, \u0432\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u043d\u043d\u0435\u0440 \u0432 \u0441\u0435\u043a\u0446\u0438\u0438 <strong>Runners<\/strong>, \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430.<\/p>\n<p>\n<b class=\"spoiler_title\">\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0433\u043e \u0440\u0430\u043d\u043d\u0435\u0440\u0430<\/b><\/p>\n<p><img decoding=\"async\" alt=\"\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes\" src=\"\/wp-content\/uploads\/2020\/09\/e63e7b08bdb98c769ed901b754d2f6f3.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0412\u043e\u0442 \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e? \u2014 \u0434\u0430, \u0442\u0430\u043a \u043f\u0440\u043e\u0441\u0442\u043e! \u0411\u043e\u043b\u044c\u0448\u0435 \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u043c\u043e\u0440\u043e\u043a\u0438 \u0441 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0435\u0439 \u0440\u0430\u043d\u043d\u0435\u0440\u043e\u0432 \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0441 \u044d\u0442\u043e\u0439 \u043c\u0438\u043d\u0443\u0442\u044b \u0440\u0430\u043d\u043d\u0435\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0442\u044c\u0441\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438.<\/p>\n<h1 id=\"6-deploy-helm-chartov-s-qbecanchorqbec-helmanchor\">6. \u0414\u0435\u043f\u043b\u043e\u0439 Helm-\u0447\u0430\u0440\u0442\u043e\u0432 \u0441 QBEC<noindex><a rel=\"nofollow\" name=\"qbec-helm\"><\/a><\/noindex><\/h1>\n<p><\/p>\n<p>\u0422\u0430\u043a \u043a\u0430\u043a \u043c\u044b \u043f\u0440\u0438\u043d\u044f\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0441\u0447\u0438\u0442\u0430\u0442\u044c <strong>gitlab-runner<\/strong> \u0447\u0430\u0441\u0442\u044c\u044e \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430, \u043d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e \u0432 \u043d\u0430\u0448\u0435\u043c Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438.<\/p>\n<p><\/p>\n<p>\u041c\u044b \u043c\u043e\u0433\u043b\u0438 \u0431\u044b \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0435\u0433\u043e \u043a\u0430\u043a \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 <strong>website<\/strong>, \u043d\u043e \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u043c\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u0443\u0435\u043c \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u043a\u043e\u043f\u0438\u0438 <strong>website<\/strong> \u043e\u0447\u0435\u043d\u044c \u0447\u0430\u0441\u0442\u043e, \u0432 \u043e\u0442\u043b\u0438\u0447\u0438\u0438 <strong>gitlab-runner<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0435\u043d \u0432\u0441\u0435\u0433\u043e-\u043b\u0438\u0448\u044c \u043e\u0434\u0438\u043d \u0440\u0430\u0437 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 Kubernetes-\u043a\u043b\u0430\u0441\u0442\u0435\u0440. \u0422\u0430\u043a \u0447\u0442\u043e \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0434\u043b\u044f \u043d\u0435\u0433\u043e:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">cd deploy\nqbec init gitlab-runner\ncd gitlab-runner<\/code><\/pre>\n<p><\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043c\u044b \u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c Kubernetes-\u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0430 \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0433\u043e\u0442\u043e\u0432\u044b\u0439 Helm-\u0447\u0430\u0440\u0442. \u041e\u0434\u043d\u0438\u043c \u0438\u0437 \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432 qbec \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u0442\u044c Helm-\u0447\u0430\u0440\u0442\u044b \u043f\u0440\u044f\u043c\u043e \u0438\u0437 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.<\/p>\n<p><\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043c \u0435\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f git submodule:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">git submodule add https:\/\/gitlab.com\/gitlab-org\/charts\/gitlab-runner vendor\/gitlab-runner<\/code><\/pre>\n<p><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f <strong>vendor\/gitlab-runner<\/strong> \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0443 \u043d\u0430\u0441 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u0447\u0430\u0440\u0442\u043e\u043c \u0434\u043b\u044f gitlab-runner.<\/p>\n<p><\/p>\n<blockquote><p>\u041f\u043e\u0434\u043e\u0431\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c \u0438 \u0434\u0440\u0443\u0433\u0438\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0438 \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 \u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u0447\u0430\u0440\u0442\u0430\u043c\u0438 <strong><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/helm\/charts\" rel=\"nofollow\">https:\/\/github.com\/helm\/charts<\/a><\/noindex><\/strong><\/p><\/blockquote>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u043f\u0438\u0448\u0435\u043c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 <strong>components\/gitlab-runner.jsonnet<\/strong>:<\/p>\n<p><\/p>\n<pre><code class=\"javascript\">local env = {\n  name: std.extVar('qbec.io\/env'),\n  namespace: std.extVar('qbec.io\/defaultNs'),\n};\nlocal p = import '..\/params.libsonnet';\nlocal params = p.components.gitlabRunner;\n\nstd.native('expandHelmTemplate')(\n  '..\/vendor\/gitlab-runner',\n  params.values,\n  {\n    nameTemplate: params.name,\n    namespace: env.namespace,\n    thisFile: std.thisFile,\n    verbose: true,\n  }\n)<\/code><\/pre>\n<p><\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c \u043a <strong>expandHelmTemplate<\/strong> \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0451\u043c \u043f\u0443\u0442\u044c \u043a \u0447\u0430\u0440\u0442\u0443, \u0437\u0430\u0442\u0435\u043c <strong>params.values<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u044c\u043c\u0451\u043c \u0438\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u0437\u0430\u0442\u0435\u043c \u0438\u0434\u0451\u0442 \u043e\u0431\u044a\u0435\u043a\u0442 \u0441<\/p>\n<p><\/p>\n<ul>\n<li><strong>nameTemplate<\/strong> \u2014 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0440\u0435\u043b\u0438\u0437\u0430<\/li>\n<li><strong>namespace<\/strong> \u2014 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0439 \u0445\u0435\u043b\u044c\u043c\u0443<\/li>\n<li><strong>thisFile<\/strong> \u2014 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440, \u043f\u0435\u0440\u0435\u0434\u0430\u044e\u0449\u0438\u0439 \u043f\u0443\u0442\u044c \u043a \u0442\u0435\u043a\u0443\u0449\u0435\u043c\u0443 \u0444\u0430\u0439\u043b\u0443<\/li>\n<li><strong>verbose<\/strong> \u2014 \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 <strong>helm template<\/strong> \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043f\u0440\u0438 \u0440\u0435\u043d\u0434\u0435\u0440\u0438\u043d\u0433\u0435 \u0447\u0430\u0440\u0442\u0430<\/li>\n<\/ul>\n<p><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u043f\u0438\u0448\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 \u0432 <strong>environments\/base.libsonnet<\/strong>:<\/p>\n<p><\/p>\n<pre><code class=\"javascript\">local secrets = import '..\/secrets\/base.libsonnet';\n\n{\n  components: {\n    gitlabRunner: {\n      name: 'gitlab-runner',\n      values: {\n        gitlabUrl: 'https:\/\/gitlab.com\/',\n        rbac: {\n          create: true,\n        },\n        runnerRegistrationToken: secrets.runnerRegistrationToken,\n      },\n    },\n  },\n}<\/code><\/pre>\n<p><\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 <strong>runnerRegistrationToken<\/strong> \u043c\u044b \u0437\u0430\u0431\u0438\u0440\u0430\u0435\u043c \u0438\u0437 \u0432\u043d\u0435\u0448\u043d\u0435\u0433\u043e \u0444\u0430\u0439\u043b\u0430 <strong>secrets\/base.libsonnet<\/strong>, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0435\u0433\u043e:<\/p>\n<p><\/p>\n<pre><code class=\"javascript\">{\n  runnerRegistrationToken: 'yga8y-jdCusVDn_t4Wxc',\n}<\/code><\/pre>\n<p><\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0432\u0441\u0451 \u043b\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">qbec show default<\/code><\/pre>\n<p><\/p>\n<p>\u0435\u0441\u043b\u0438 \u0432\u0441\u0451 \u0432 \u043f\u043e\u0440\u044f\u0434\u043a\u0435, \u0442\u043e \u043c\u043e\u0436\u0435\u043c \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043d\u0430\u0448 \u0440\u0430\u043d\u0435\u0435, \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0435\u043d\u043d\u044b\u0439 \u0447\u0435\u0440\u0435\u0437 Helm, \u0440\u0435\u043b\u0438\u0437:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">helm uninstall gitlab-runner<\/code><\/pre>\n<p><\/p>\n<p>\u0438 \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c \u0435\u0433\u043e \u0436\u0435, \u043d\u043e \u0443\u0436\u0435 \u0447\u0435\u0440\u0435\u0437 qbec:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">qbec apply default<\/code><\/pre>\n<h1 id=\"7-znakomstvo-s-git-cryptanchorgit-cryptanchor\">7. \u0417\u043d\u0430\u043a\u043e\u043c\u0441\u0442\u0432\u043e \u0441 git-crypt<noindex><a rel=\"nofollow\" name=\"git-crypt\"><\/a><\/noindex><\/h1>\n<p><\/p>\n<p><strong><noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/AGWA\/git-crypt\" rel=\"nofollow\">Git-crypt<\/a><\/noindex><\/strong> \u2014 \u044d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0440\u043e\u0437\u0440\u0430\u0447\u043d\u043e\u0435 \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f.<\/p>\n<p><\/p>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043d\u0430\u0448\u0435\u0439 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 \u0434\u043b\u044f gitlab-runner \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">.\n\u251c\u2500\u2500 components\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 gitlab-runner.jsonnet\n\u251c\u2500\u2500 environments\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 base.libsonnet\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 default.libsonnet\n\u251c\u2500\u2500 params.libsonnet\n\u251c\u2500\u2500 qbec.yaml\n\u251c\u2500\u2500 secrets\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 base.libsonnet\n\u2514\u2500\u2500 vendor\n    \u2514\u2500\u2500 gitlab-runner (submodule)<\/code><\/pre>\n<p><\/p>\n<p>\u041d\u043e \u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u0432 Git \u043d\u0435\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e, \u043d\u0435 \u0442\u0430\u043a-\u043b\u0438? \u0422\u0430\u043a \u0447\u0442\u043e \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0434\u043e\u043b\u0436\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0438\u0445 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c.<\/p>\n<p><\/p>\n<blockquote><p>\u041e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0434\u0438 \u043e\u0434\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u044d\u0442\u043e \u043d\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u043c\u0435\u0435\u0442 \u0441\u043c\u044b\u0441\u043b. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u0432 <strong>qbec<\/strong> \u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0432\u0430\u0448\u0435\u0439 CI-\u0441\u0438\u0441\u0442\u0435\u043c\u044b.<br \/>\n\u041d\u043e \u0441\u0442\u043e\u0438\u0442 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u0431\u044b\u0432\u0430\u044e\u0442 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0433\u0443\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0433\u043e\u0440\u0430\u0437\u0434\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432, \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0438\u0445 \u0432\u0441\u0435 \u0447\u0435\u0440\u0435\u0437 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0435\u0442 \u043a\u0440\u0430\u0439\u043d\u0435 \u0437\u0430\u0442\u0440\u0443\u0434\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e. <\/p>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e \u0432 \u0442\u0430\u043a\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u043d\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0431\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0430\u043c \u043e \u0442\u0430\u043a\u043e\u043c \u0437\u0430\u043c\u0435\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0435 \u043a\u0430\u043a <strong>git-crypt<\/strong>.<\/p>\n<p><strong>git-crypt<\/strong> \u0435\u0449\u0451 \u0443\u0434\u043e\u0431\u0435\u043d \u0442\u0435\u043c, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0432\u0441\u044e \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u0441\u0435\u043a\u0440\u0435\u0442\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0442\u044c, \u043c\u0435\u0440\u0434\u0436\u0438\u0442\u044c \u0438 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0442\u044c \u043a\u043e\u0444\u043b\u0438\u043a\u0442\u044b \u0442\u0430\u043a-\u0436\u0435 \u043a\u0430\u043a \u043c\u044b \u043f\u0440\u0438\u0432\u044b\u043a\u043b\u0438 \u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u0441 Git.<\/p><\/blockquote>\n<p>\u041f\u0435\u0440\u0432\u044b\u043c \u0434\u0435\u043b\u043e\u043c \u043f\u043e\u0441\u043b\u0435 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 <strong>git-crypt<\/strong> \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">git crypt init<\/code><\/pre>\n<p><\/p>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u0438\u043c\u0435\u0435\u0442\u0441\u044f PGP-\u043a\u043b\u044e\u0447, \u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0440\u0430\u0437\u0443 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0431\u044f \u043a\u0430\u043a collaborator&#8217;\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">git-crypt add-gpg-user kvapss@gmail.com<\/code><\/pre>\n<p><\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0432\u044b \u0432\u0441\u0435\u0433\u0434\u0430 \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u043e\u0442 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0441\u0432\u043e\u0439 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447.<\/p>\n<p><\/p>\n<p>\u0415\u0441\u043b\u0438 \u0436\u0435 PGP-\u043a\u043b\u044e\u0447\u0430 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u0438 \u043d\u0435 \u043f\u0440\u0435\u0434\u0432\u0438\u0434\u0438\u0442\u0441\u044f, \u0442\u043e \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0439\u0442\u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0443\u0442\u0451\u043c \u0438 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">git crypt export-key \/path\/to\/keyfile<\/code><\/pre>\n<p><\/p>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043b\u044e\u0431\u043e\u0439, \u043a\u0442\u043e \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c <strong>keyfile<\/strong> \u0441\u043c\u043e\u0436\u0435\u0442 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0430\u0448 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439.<\/p>\n<p><\/p>\n<p>\u041d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u0430\u0448 \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0435\u043a\u0440\u0435\u0442.<br \/>\n\u041d\u0430\u043f\u043e\u043c\u043d\u044e, \u043c\u044b \u043f\u043e \u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u043d\u0430\u0445\u043e\u0434\u0438\u043c\u0441\u044f \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u0438 <strong>deploy\/gitlab-runner\/<\/strong>, \u0433\u0434\u0435 \u0443 \u043d\u0430\u0441 \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f <strong>secrets\/<\/strong>, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0436\u0435 \u0437\u0430\u0448\u0438\u0444\u0440\u0443\u0435\u043c \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u0432 \u043d\u0435\u0439, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0444\u0430\u0439\u043b <strong>secrets\/.gitattributes<\/strong> \u0441 \u0442\u0430\u043a\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u043c:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">* filter=git-crypt diff=git-crypt\n.gitattributes !filter !diff<\/code><\/pre>\n<p><\/p>\n<p>\u041a\u0430\u043a \u0432\u0438\u0434\u043d\u043e \u0438\u0437 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f, \u0432\u0441\u0435 \u0444\u0430\u0439\u043b\u044b \u043f\u043e \u043c\u0430\u0441\u043a\u0435 <strong>*<\/strong> \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u043e\u0433\u043e\u043d\u044f\u0442\u044c\u0441\u044f \u0447\u0435\u0440\u0435\u0437 <strong>git-crypt<\/strong>, \u0437\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0441\u0430\u043c\u043e\u0433\u043e <strong>.gitattributes<\/strong><\/p>\n<p><\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u044d\u0442\u043e \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0432:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">git crypt status -e<\/code><\/pre>\n<p><\/p>\n<p>\u041d\u0430 \u0432\u044b\u0445\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u0441\u043f\u0438\u0441\u043e\u043a \u0432\u0441\u0435\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0434\u043b\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u043e \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435<\/p>\n<p><\/p>\n<p>\u0412\u043e\u0442 \u0438 \u0432\u0441\u0451, \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u0441\u043c\u0435\u043b\u043e \u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442\u044c \u043d\u0430\u0448\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">cd ..\/..\ngit add .\ngit commit -m \"Add deploy for gitlab-runner\"<\/code><\/pre>\n<p><\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">git crypt lock<\/code><\/pre>\n<p><\/p>\n<p>\u0438 \u0442\u0443\u0442 \u0436\u0435 \u0432\u0441\u0435 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u044b \u043f\u0440\u0435\u0432\u0440\u0430\u0442\u044f\u0442\u0441\u044f \u0432 \u0431\u0438\u043d\u0430\u0440\u043d\u043e\u0435 \u043d\u0435\u0447\u0442\u043e, \u043f\u0440\u043e\u0447\u0435\u0441\u0442\u044c \u0438\u0445 \u0431\u0443\u0434\u0435\u0442 \u043d\u0435\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e.<br \/>\n\u0427\u0442\u043e\u0431\u044b \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0435:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">git crypt unlock<\/code><\/pre>\n<h1 id=\"8-sozdayom-toolbox-obrazanchortoolboxanchor\">8. \u0421\u043e\u0437\u0434\u0430\u0451\u043c toolbox-\u043e\u0431\u0440\u0430\u0437<noindex><a rel=\"nofollow\" name=\"toolbox\"><\/a><\/noindex><\/h1>\n<p><\/p>\n<p>Toolbox-\u043e\u0431\u0440\u0430\u0437 \u2014 \u044d\u0442\u043e \u0442\u0430\u043a\u043e\u0439 \u043e\u0431\u0440\u0430\u0437 \u0441\u043e \u0432\u0441\u0435\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. \u041e\u043d \u0431\u0443\u0434\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0433\u0438\u0442\u043b\u0430\u0431-\u0440\u0430\u043d\u043d\u0435\u0440\u043e\u043c \u0434\u043b\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0442\u0438\u043f\u043e\u0432\u044b\u0445 \u0437\u0430\u0434\u0430\u0447 \u0434\u0435\u043f\u043b\u043e\u044f.<\/p>\n<p><\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u0432\u0441\u0451 \u043f\u0440\u043e\u0441\u0442\u043e, \u0441\u043e\u0437\u0434\u0430\u0451\u043c \u043d\u043e\u0432\u044b\u0439 <strong>dockerfiles\/toolbox\/Dockerfile<\/strong> \u0441 \u0442\u0430\u043a\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u043c:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">FROM alpine:3.11\n\nRUN apk add --no-cache git git-crypt\n\nRUN QBEC_VER=0.10.3 \n &amp;&amp; wget -O- https:\/\/github.com\/splunk\/qbec\/releases\/download\/v${QBEC_VER}\/qbec-linux-amd64.tar.gz \n     | tar -C \/tmp -xzf - \n &amp;&amp; mv \/tmp\/qbec \/tmp\/jsonnet-qbec \/usr\/local\/bin\/\n\nRUN KUBECTL_VER=1.17.0 \n &amp;&amp; wget -O \/usr\/local\/bin\/kubectl \n      https:\/\/storage.googleapis.com\/kubernetes-release\/release\/v${KUBECTL_VER}\/bin\/linux\/amd64\/kubectl \n &amp;&amp; chmod +x \/usr\/local\/bin\/kubectl\n\nRUN HELM_VER=3.0.2 \n &amp;&amp; wget -O- https:\/\/get.helm.sh\/helm-v${HELM_VER}-linux-amd64.tar.gz \n     | tar -C \/tmp -zxf - \n &amp;&amp; mv \/tmp\/linux-amd64\/helm \/usr\/local\/bin\/helm<\/code><\/pre>\n<p><\/p>\n<p>\u041a\u0430\u043a \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0432 \u044d\u0442\u043e\u043c \u043e\u0431\u0440\u0430\u0437\u0435 \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u0432\u0441\u0435 \u0443\u0442\u0438\u043b\u0438\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u041d\u0430\u043c \u043d\u0435 \u043d\u0443\u0436\u0435\u043d \u0437\u0434\u0435\u0441\u044c \u0440\u0430\u0437\u0432\u0435 \u0447\u0442\u043e <strong>kubectl<\/strong>, \u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u043d\u0438\u043c \u043d\u0430 \u044d\u0442\u0430\u043f\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430. <\/p>\n<p><\/p>\n<p>\u0422\u0430\u043a\u0436\u0435 \u0447\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0431\u0449\u0430\u0442\u044c\u0441\u044f \u0441 Kubernetes \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c \u0432 \u043d\u0435\u0433\u043e \u0434\u0435\u043f\u043b\u043e\u0439, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0440\u043e\u043b\u044c \u0434\u043b\u044f \u043f\u043e\u0434\u043e\u0432 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u043c\u044b\u0445 gitlab-runner&#8217;\u043e\u043c.<\/p>\n<p><\/p>\n<p>\u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u0432 \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u0441 gitlab-runner&#8217;\u043e\u043c:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">cd deploy\/gitlab-runner<\/code><\/pre>\n<p><\/p>\n<p>\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 <strong>components\/rbac.jsonnet<\/strong>:<\/p>\n<p><\/p>\n<pre><code class=\"javascript\">local env = {\n  name: std.extVar('qbec.io\/env'),\n  namespace: std.extVar('qbec.io\/defaultNs'),\n};\nlocal p = import '..\/params.libsonnet';\nlocal params = p.components.rbac;\n\n[\n  {\n    apiVersion: 'v1',\n    kind: 'ServiceAccount',\n    metadata: {\n      labels: {\n        app: params.name,\n      },\n      name: params.name,\n    },\n  },\n  {\n    apiVersion: 'rbac.authorization.k8s.io\/v1',\n    kind: 'Role',\n    metadata: {\n      labels: {\n        app: params.name,\n      },\n      name: params.name,\n    },\n    rules: [\n      {\n        apiGroups: [\n          '*',\n        ],\n        resources: [\n          '*',\n        ],\n        verbs: [\n          '*',\n        ],\n      },\n    ],\n  },\n  {\n    apiVersion: 'rbac.authorization.k8s.io\/v1',\n    kind: 'RoleBinding',\n    metadata: {\n      labels: {\n        app: params.name,\n      },\n      name: params.name,\n    },\n    roleRef: {\n      apiGroup: 'rbac.authorization.k8s.io',\n      kind: 'Role',\n      name: params.name,\n    },\n    subjects: [\n      {\n        kind: 'ServiceAccount',\n        name: params.name,\n        namespace: env.namespace,\n      },\n    ],\n  },\n]<\/code><\/pre>\n<p><\/p>\n<p>\u0422\u0430\u043a \u0436\u0435 \u043e\u043f\u0438\u0448\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432 <strong>environments\/base.libsonnet<\/strong>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0435\u043f\u0435\u0440\u044c \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442 \u0442\u0430\u043a:<\/p>\n<p><\/p>\n<pre><code class=\"javascript\">local secrets = import '..\/secrets\/base.libsonnet';\n\n{\n  components: {\n    gitlabRunner: {\n      name: 'gitlab-runner',\n      values: {\n        gitlabUrl: 'https:\/\/gitlab.com\/',\n        rbac: {\n          create: true,\n        },\n        runnerRegistrationToken: secrets.runnerRegistrationToken,\n        runners: {\n          serviceAccountName: $.components.rbac.name,\n          image: 'registry.gitlab.com\/kvaps\/docs.example.org\/toolbox:v0.0.1',\n        },\n      },\n    },\n    rbac: {\n      name: 'gitlab-runner-deploy',\n    },\n  },\n}<\/code><\/pre>\n<p><\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 <strong>$.components.rbac.name<\/strong> \u0441\u0441\u044b\u043b\u0430\u0435\u0442\u0441\u044f \u043d\u0430 <strong>name<\/strong> \u0434\u043b\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 <strong>rbac<\/strong><\/p>\n<p><\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0447\u0442\u043e \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">qbec diff default<\/code><\/pre>\n<p><\/p>\n<p>\u0438 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u043d\u0430\u0448\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 Kubernetes:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">qbec apply default<\/code><\/pre>\n<p><\/p>\n<p>\u0422\u0430\u043a \u0436\u0435 \u043d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442\u044c \u043d\u0430\u0448\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 git:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">cd ..\/..\ngit add dockerfiles\/toolbox\ngit commit -m \"Add Dockerfile for toolbox\"\ngit add deploy\/gitlab-runner\ngit commit -m \"Configure gitlab-runner to use toolbox\"<\/code><\/pre>\n<h1 id=\"9-nash-pervyy-payplayn-i-sborka-obrazov-po-tegamanchorpipeline-buildanchor\">9. \u041d\u0430\u0448 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0438 \u0441\u0431\u043e\u0440\u043a\u0430 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043f\u043e \u0442\u044d\u0433\u0430\u043c<noindex><a rel=\"nofollow\" name=\"pipeline-build\"><\/a><\/noindex><\/h1>\n<p><\/p>\n<p>\u0412 \u043a\u043e\u0440\u043d\u0435 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c <strong>.gitlab-ci.yml<\/strong> \u0441 \u0442\u0430\u043a\u0438\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u0435\u043c:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">.build_docker_image:\n  stage: build\n  image:\n    name: gcr.io\/kaniko-project\/executor:debug-v0.15.0\n    entrypoint: [\"\"]\n  before_script:\n    - echo \"{\"auths\":{\"$CI_REGISTRY\":{\"username\":\"$CI_REGISTRY_USER\",\"password\":\"$CI_REGISTRY_PASSWORD\"}}}\" &gt; \/kaniko\/.docker\/config.json\n\nbuild_toolbox:\n  extends: .build_docker_image\n  script:\n    - \/kaniko\/executor --cache --context $CI_PROJECT_DIR\/dockerfiles\/toolbox --dockerfile $CI_PROJECT_DIR\/dockerfiles\/toolbox\/Dockerfile --destination $CI_REGISTRY_IMAGE\/toolbox:$CI_COMMIT_TAG\n  only:\n    refs:\n      - tags\n\nbuild_website:\n  extends: .build_docker_image\n  variables:\n    GIT_SUBMODULE_STRATEGY: normal\n  script:\n    - \/kaniko\/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR\/dockerfiles\/website\/Dockerfile --destination $CI_REGISTRY_IMAGE\/website:$CI_COMMIT_TAG\n  only:\n    refs:\n      - tags<\/code><\/pre>\n<p><\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <strong>GIT_SUBMODULE_STRATEGY: normal<\/strong> \u0434\u043b\u044f \u0442\u0435\u0445 \u0434\u0436\u043e\u0431, \u0433\u0434\u0435 \u043d\u0443\u0436\u043d\u043e \u044f\u0432\u043d\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0430\u0431\u043c\u043e\u0434\u0443\u043b\u0438 \u043f\u0435\u0440\u0435\u0434 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435\u043c.<\/p>\n<p><\/p>\n<p>\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442\u044c \u043d\u0430\u0448\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">git add .gitlab-ci.yml\ngit commit -m \"Automate docker build\"<\/code><\/pre>\n<p><\/p>\n<p>\u0414\u0443\u043c\u0430\u044e \u043c\u043e\u0436\u043d\u043e \u0441\u043c\u0435\u043b\u043e \u043d\u0430\u0437\u0432\u0430\u0442\u044c \u044d\u0442\u043e \u0432\u0435\u0440\u0441\u0438\u0435\u0439 <strong>v0.0.1<\/strong> \u0438 \u043f\u043e\u0432\u0435\u0441\u0438\u0442\u044c \u0442\u044d\u0433:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">git tag v0.0.1<\/code><\/pre>\n<p><\/p>\n<p>\u0422\u044d\u0433\u0438 \u043c\u044b \u0431\u0443\u0434\u0435\u043c \u0432\u0435\u0448\u0430\u0442\u044c \u0432\u0441\u044f\u043a\u0438\u0439 \u0440\u0430\u0437 \u0442\u043e\u0433\u0434\u0430, \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0437\u0430\u0440\u0435\u043b\u0438\u0437\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e. \u0422\u044d\u0433\u0438 \u0432 Docker-\u043e\u0431\u0440\u0430\u0437\u0430\u0445 \u0431\u0443\u0434\u0443\u0442 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u044b \u043a Git-\u0442\u044d\u0433\u0430\u043c. \u041a\u0430\u0436\u0434\u044b\u0439 push \u0441 \u043d\u043e\u0432\u044b\u043c \u0442\u044d\u0433\u043e\u043c \u0431\u0443\u0434\u0435\u0442 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0431\u043e\u0440\u043a\u0443 \u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0441 \u044d\u0442\u0438\u043c \u0442\u044d\u0433\u043e\u043c.<\/p>\n<p><\/p>\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u0438\u043c <strong>git push &#8212;tags<\/strong>, \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u043d\u0430\u0448 \u043f\u0435\u0440\u0432\u044b\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d:<\/p>\n<p>\n<b class=\"spoiler_title\">\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430<\/b><\/p>\n<p><img decoding=\"async\" alt=\"\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes\" src=\"\/wp-content\/uploads\/2020\/09\/53f33434d831fad502ada7520efebefb.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<blockquote><p>\u0421\u0442\u043e\u0438\u0442 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c \u0432\u0430\u0448\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u043d\u0430 \u0442\u043e, \u0447\u0442\u043e \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u043e \u0442\u044d\u0433\u0430\u043c \u0433\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432, \u043d\u043e \u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 Kubernetes. \u0422\u0430\u043a \u043a\u0430\u043a \u043d\u043e\u0432\u044b\u0435 \u0442\u044d\u0433\u0438 \u043c\u043e\u0433\u0443\u0442 \u043d\u0430\u0437\u043d\u0430\u0447\u0430\u0442\u044c\u0441\u044f \u0438 \u0434\u043b\u044f \u0441\u0442\u0430\u0440\u044b\u0445 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432, \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0434\u043b\u044f \u043d\u0438\u0445 \u043f\u0440\u0438\u0432\u0435\u0434\u0451\u0442 \u043a \u0434\u0435\u043f\u043b\u043e\u044e \u0441\u0442\u0430\u0440\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438.<\/p>\n<p>\u0427\u0442\u043e\u0431\u044b \u0440\u0435\u0448\u0438\u0442\u044c \u044d\u0442\u0443 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0443 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u0431\u043e\u0440\u043a\u0430 docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u043f\u0440\u0438\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a \u0442\u044d\u0433\u0430\u043c, \u0430 \u0434\u0435\u043f\u043b\u043e\u0439 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043a \u0432\u0435\u0442\u043a\u0435 <strong>master<\/strong>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0437\u0430\u0445\u0430\u0440\u0434\u043a\u043e\u0436\u0435\u043d\u044b \u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 \u043e\u0431\u0440\u0430\u0437\u043e\u0432. \u0418\u043c\u0435\u043d\u043d\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0432\u044b \u0441\u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c rollback \u043f\u0440\u043e\u0441\u0442\u044b\u043c revert <strong>master<\/strong>-\u0432\u0435\u0442\u043a\u0438.<\/p><\/blockquote>\n<h1 id=\"10-avtomatizaciya-deployaanchorpipeline-deployanchor\">10. \u0410\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044f \u0434\u0435\u043f\u043b\u043e\u044f<noindex><a rel=\"nofollow\" name=\"pipeline-deploy\"><\/a><\/noindex><\/h1>\n<p><\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b Gitlab-runner \u043c\u043e\u0433 \u0440\u0430\u0441\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u0441\u0435\u043a\u0440\u0435\u0442\u044b, \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f \u043d\u0430\u0448\u0435\u0439 CI:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">git crypt export-key \/tmp\/docs-repo.key\nbase64 -w0 \/tmp\/docs-repo.key; echo<\/code><\/pre>\n<p><\/p>\n<p>\u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u043c \u0432 Gitlab, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u0435\u0440\u0435\u0439\u0434\u0451\u043c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<br \/>\n<strong>Settings &#8212;&gt; CI \/ CD &#8212;&gt; Variables<\/strong> <\/p>\n<p><\/p>\n<p>\u0418 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e:<\/p>\n<p><\/p>\n<p>Type<br \/>\nKey<br \/>\nValue<br \/>\nProtected<br \/>\nMasked<br \/>\nScope<\/p>\n<p><code>File<\/code><br \/>\n<code>GITCRYPT_KEY<\/code><br \/>\n<code>&lt;your string&gt;<\/code><br \/>\n<code>true<\/code> <em>(\u043d\u0430 \u0432\u0440\u0435\u043c\u044f \u043e\u0431\u0443\u0447\u0435\u043d\u0438\u044f \u043c\u043e\u0436\u043d\u043e \u0438 <code>false<\/code>)<\/em><br \/>\n<code>true<\/code><br \/>\n<code>All environments<\/code><\/p>\n<p>\n<b class=\"spoiler_title\">\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u043d\u043e\u0439 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439<\/b><\/p>\n<p><img decoding=\"async\" alt=\"\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes\" src=\"\/wp-content\/uploads\/2020\/09\/4b803e333c54851082882b3a8bac0108.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u043d\u043e\u0432\u0438\u043c \u043d\u0430\u0448 <strong>.gitlab-ci.yml<\/strong> \u0434\u043e\u0431\u0430\u0432\u0438\u0432 \u0432 \u043d\u0435\u0433\u043e:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">.deploy_qbec_app:\n  stage: deploy\n  only:\n    refs:\n      - master\n\ndeploy_gitlab_runner:\n  extends: .deploy_qbec_app\n  variables:\n    GIT_SUBMODULE_STRATEGY: normal\n  before_script:\n    - base64 -d \"$GITCRYPT_KEY\" | git-crypt unlock -\n  script:\n    - qbec apply default --root deploy\/gitlab-runner --force:k8s-context __incluster__ --wait --yes\n\ndeploy_website:\n  extends: .deploy_qbec_app\n  script:\n    - qbec apply default --root deploy\/website --force:k8s-context __incluster__ --wait --yes<\/code><\/pre>\n<p><\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0437\u0430\u0434\u0435\u0439\u0441\u0442\u0432\u043e\u0432\u0430\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0432\u044b\u0445 \u043e\u043f\u0446\u0438\u0439 \u0434\u043b\u044f qbec:<\/p>\n<p><\/p>\n<ul>\n<li><strong>&#8212;root some\/app<\/strong> \u2014 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044e \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/li>\n<li><strong>&#8212;force:k8s-context __incluster__<\/strong> \u2014 \u044d\u0442\u043e \u043c\u0430\u0433\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0433\u043e\u0432\u043e\u0440\u0438\u0442 \u0447\u0442\u043e \u0434\u0435\u043f\u043b\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442\u044c \u0432 \u0442\u043e\u0442\u0436\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0437\u0430\u043f\u0443\u0449\u0435\u043d gtilab-runner. \u0421\u0434\u0435\u043b\u0430\u0442\u044c \u044d\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 qbec \u0431\u0443\u0434\u0435\u0442 \u043f\u044b\u0442\u0430\u0442\u044c\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u044f\u0448\u0438\u0439 Kubernetes-\u0441\u0435\u0440\u0432\u0435\u0440 \u0432 \u0432\u0430\u0448\u0435\u043c kubeconfig<\/li>\n<li><strong>&#8212;wait<\/strong> \u2014 \u0437\u0430\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 qbec \u0434\u043e\u0436\u0434\u0430\u0442\u044c\u0441\u044f, \u043a\u043e\u0433\u0434\u0430 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0435\u043c\u044b\u0435 \u0438\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043f\u0435\u0440\u0435\u0439\u0434\u0443\u0442 \u0432 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 Ready \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0442\u043e\u043c \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u0441 \u0443\u0441\u043f\u0435\u0448\u043d\u044b\u043c exit-code.<\/li>\n<li><strong>&#8212;yes<\/strong> \u2014 \u043f\u0440\u043e\u0441\u0442\u043e \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0438\u043d\u0442\u0435\u0440\u0430\u043a\u0442\u0438\u0432\u043d\u044b\u0439 \u0448\u0435\u043b\u043b <strong>Are you sure?<\/strong> \u043f\u0440\u0438 \u0434\u0435\u043f\u043b\u043e\u0435.<\/li>\n<\/ul>\n<p><\/p>\n<p>\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442\u044c \u043d\u0430\u0448\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">git add .gitlab-ci.yml\ngit commit -m \"Automate deploy\"<\/code><\/pre>\n<p><\/p>\n<p>\u0418 \u043f\u043e\u0441\u043b\u0435 <strong>git push<\/strong> \u043c\u044b \u0443\u0432\u0438\u0434\u0438\u043c \u043a\u0430\u043a \u043d\u0430\u0448\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0435\u043d\u044b:<\/p>\n<p>\n<b class=\"spoiler_title\">\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430<\/b><\/p>\n<p><img decoding=\"async\" alt=\"\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes\" src=\"\/wp-content\/uploads\/2020\/09\/98e6673fda05359bcc25423b6d83f7a6.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h1 id=\"11-artefakty-i-sborka-pri-push-v-masteranchorartifactsanchor\">11. \u0410\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u0438 \u0441\u0431\u043e\u0440\u043a\u0430 \u043f\u0440\u0438 push \u0432 master<noindex><a rel=\"nofollow\" name=\"artifacts\"><\/a><\/noindex><\/h1>\n<p><\/p>\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u0432\u044b\u0448\u0435\u043e\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0445 \u0448\u0430\u0433\u043e\u0432 \u0432\u043f\u043e\u043b\u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043f\u043e\u0447\u0442\u0438 \u043b\u044e\u0431\u043e\u0433\u043e \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u043d\u043e \u043c\u044b \u043d\u0435 \u0445\u043e\u0442\u0438\u043c \u0432\u0435\u0448\u0430\u0442\u044c \u0442\u044d\u0433 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043a\u043e\u0433\u0434\u0430 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0430\u0439\u0442. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u043f\u043e\u0439\u0434\u0451\u043c \u0431\u043e\u043b\u0435\u0435 \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u043f\u0443\u0442\u0451\u043c \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043c \u0434\u0435\u043f\u043b\u043e\u0439 \u043f\u043e digest \u0432 master-\u0432\u0435\u0442\u043a\u0435.<\/p>\n<p><\/p>\n<p>\u0418\u0434\u0435\u044f \u043f\u0440\u043e\u0441\u0442\u0430: \u0442\u0435\u043f\u0435\u0440\u044c \u043e\u0431\u0440\u0430\u0437 \u043d\u0430\u0448\u0435\u0433\u043e <strong>website<\/strong> \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0441\u043e\u0431\u0438\u0440\u0430\u0442\u044c\u0441\u044f \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437 \u043f\u0440\u0438 push \u0432 <strong>master<\/strong>, \u0430 \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c\u0441\u044f \u0432 Kubernetes.<\/p>\n<p><\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u043c \u044d\u0442\u0438 \u0434\u0432\u0435 \u0434\u0436\u043e\u0431\u044b \u0432 \u043d\u0430\u0448\u0435\u043c <strong>.gitlab-ci.yml<\/strong>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">build_website:\n  extends: .build_docker_image\n  variables:\n    GIT_SUBMODULE_STRATEGY: normal\n  script:\n    - mkdir -p $CI_PROJECT_DIR\/artifacts\n    - \/kaniko\/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR\/dockerfiles\/website\/Dockerfile --destination $CI_REGISTRY_IMAGE\/website:$CI_COMMIT_REF_NAME --digest-file $CI_PROJECT_DIR\/artifacts\/website.digest\n  artifacts:\n    paths:\n      - artifacts\/\n  only:\n    refs:\n      - master\n      - tags\n\ndeploy_website:\n  extends: .deploy_qbec_app\n  script:\n    - DIGEST=\"$(cat artifacts\/website.digest)\"\n    - qbec apply default --root deploy\/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest=\"$DIGEST\"<\/code><\/pre>\n<p><\/p>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 \u0432\u0435\u0442\u043a\u0443 <strong>master<\/strong> \u043a <strong>refs<\/strong> \u0434\u043b\u044f \u0434\u0436\u043e\u0431\u044b <strong>build_website<\/strong> \u0438 \u043c\u044b \u0442\u0435\u043f\u0435\u0440\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <strong>$CI_COMMIT_REF_NAME<\/strong> \u0432\u043c\u0435\u0441\u0442\u043e <strong>$CI_COMMIT_TAG<\/strong>, \u0442\u043e \u0435\u0441\u0442\u044c \u043c\u044b \u043e\u0442\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u043c\u0441\u044f \u043e\u0442 \u0442\u044d\u0433\u043e\u0432 \u0432 Git \u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u0443\u0434\u0435\u043c \u043f\u0443\u0448\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0437 \u0441 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435\u043c \u0432\u0435\u0442\u043a\u0438 \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0448\u0435\u0433\u043e \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d. \u0421\u0442\u043e\u0438\u0442 \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e \u044d\u0442\u043e \u0442\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0438 \u0441 \u0442\u044d\u0433\u0430\u043c\u0438, \u0447\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c \u0441\u043d\u0430\u043f\u0448\u043e\u0442\u044b \u0441\u0430\u0439\u0442\u0430 \u0441 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439 \u0432 docker-registry.<\/p>\n<p><\/p>\n<p>\u041a\u043e\u0433\u0434\u0430 \u0438\u043c\u044f docker-\u0442\u044d\u0433\u0430 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u0441\u0430\u0439\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u043e, \u043c\u044b \u043f\u043e \u043f\u0440\u0435\u0436\u043d\u0435\u043c\u0443 \u0434\u043e\u043b\u0436\u043d\u044b \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0434\u043b\u044f Kubernetes, \u0432 \u043f\u0440\u043e\u0442\u0438\u0432\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u043d \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0435 \u043f\u0435\u0440\u0435\u0434\u0435\u043f\u043b\u043e\u0438\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0438\u0437 \u043d\u043e\u0432\u043e\u0433\u043e \u043e\u0431\u0440\u0430\u0437\u0430, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0435 \u0437\u0430\u043c\u0435\u0442\u0438\u0442 \u043d\u0438\u043a\u0430\u043a\u0438\u0445 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 \u0432 \u043c\u0430\u043d\u0438\u0444\u0435\u0441\u0442\u0435 \u0434\u0435\u043f\u043b\u043e\u0439\u043c\u0435\u043d\u0442\u0430.<\/p>\n<p><\/p>\n<p>\u041e\u043f\u0446\u0438\u044f <strong>&#8212;vm:ext-str digest=&#187;$DIGEST&#187;<\/strong> \u0434\u043b\u044f qbec \u2014 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0432\u043d\u0435\u0448\u043d\u0443\u044e \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e \u0432 jsonnet. \u041c\u044b \u0445\u043e\u0442\u0438\u043c \u0447\u0442\u043e\u0431\u044b \u0441 \u043a\u0430\u0436\u0434\u044b\u043c \u0440\u0435\u043b\u0438\u0437\u043e\u043c \u043d\u0430\u0448\u0435\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043e\u043d\u043e \u043f\u0435\u0440\u0435\u0434\u0435\u043f\u043b\u043e\u0438\u0432\u0430\u043b\u043e\u0441\u044c \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u043c\u044f \u0442\u044d\u0433\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435\u0438\u0437\u043c\u0435\u043d\u043d\u044b\u043c, \u043c\u044b \u0437\u0434\u0435\u0441\u044c \u0431\u043e\u043b\u044c\u0448\u0435 \u043d\u0435 \u043c\u043e\u0436\u0435\u043c, \u0442\u0430\u043a \u043a\u0430\u043a \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0432\u044f\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u0443\u044e \u0432\u0435\u0440\u0441\u0438\u044e \u043e\u0431\u0440\u0430\u0437\u0430 \u0438 \u0442\u0440\u0438\u0433\u0433\u0435\u0440\u0438\u0442\u044c \u0434\u0435\u043f\u043b\u043e\u0439 \u043f\u0440\u0438 \u0435\u0451 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0438.<\/p>\n<p><\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043d\u0430\u043c \u043f\u043e\u043c\u043e\u0436\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c Kaniko \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0442\u044c digest \u043e\u0431\u0440\u0430\u0437\u0430 \u0432 \u0444\u0430\u0439\u043b (\u043e\u043f\u0446\u0438\u044f <strong>&#8212;digest-file<\/strong>)<br \/>\n\u0417\u0430\u0442\u0435\u043c \u044d\u0442\u043e\u0442 \u0444\u0430\u0439\u043b \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0438 \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0435\u043c \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0434\u0435\u043f\u043b\u043e\u044f.<\/p>\n<p><\/p>\n<p>\u041e\u0431\u043d\u043e\u0432\u0438\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u043d\u0430\u0448\u0435\u0433\u043e <strong>deploy\/website\/environments\/base.libsonnet<\/strong> \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0435\u043f\u0435\u0440\u044c \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0433\u043b\u044f\u0434\u0438\u0442\u044c \u0442\u0430\u043a:<\/p>\n<p><\/p>\n<pre><code class=\"javascript\">{\n  components: {\n    website: {\n      name: 'example-docs',\n      image: 'registry.gitlab.com\/kvaps\/docs.example.org\/website@' + std.extVar('digest'),\n      replicas: 1,\n      containerPort: 80,\n      servicePort: 80,\n      nodeSelector: {},\n      tolerations: [],\n      ingressClass: 'nginx',\n      domain: 'docs.example.org',\n    },\n  },\n}<\/code><\/pre>\n<p><\/p>\n<p>\u0413\u043e\u0442\u043e\u0432\u043e, \u0442\u0435\u043f\u0435\u0440\u044c \u043b\u044e\u0431\u043e\u0439 \u043a\u043e\u043c\u043c\u0438\u0442 \u0432 <strong>master<\/strong> \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0443\u0435\u0442 \u0441\u0431\u043e\u0440\u043a\u0443 docker-\u043e\u0431\u0440\u0430\u0437\u0430 \u0434\u043b\u044f <strong>website<\/strong>, \u0430 \u0437\u0430\u0442\u0435\u043c \u0435\u0433\u043e \u0434\u0435\u043f\u043b\u043e\u0439 \u0432 Kubernetes.<\/p>\n<p><\/p>\n<p>\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442\u044c \u043d\u0430\u0448\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">git add .\ngit commit -m \"Configure dynamic build\"<\/code><\/pre>\n<p><\/p>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u043f\u043e\u0441\u043b\u0435 <strong>git push<\/strong> \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0443\u0432\u0438\u0434\u0435\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0434\u043e\u0431\u043d\u043e\u0435:<\/p>\n<p>\n<b class=\"spoiler_title\">\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0434\u043b\u044f master<\/b><\/p>\n<p><img decoding=\"async\" alt=\"\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes\" src=\"\/wp-content\/uploads\/2020\/09\/bb7918b4b79ea656e4923fa575ddd48a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0412 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0435 \u043d\u0430\u043c \u0431\u0435\u0437 \u043d\u0430\u0434\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u043f\u0435\u0440\u0435\u0434\u0435\u043f\u043b\u043e\u0438\u0432\u0430\u0442\u044c gitlab-runner \u043f\u0440\u0438 \u043a\u0430\u0436\u0434\u043e\u043c push, \u0435\u0441\u043b\u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u043b\u043e\u0441\u044c \u0432 \u0435\u0433\u043e \u043a\u043e\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438, \u0434\u0430\u0432\u0430\u0439\u0442\u0435 \u0438\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u044d\u0442\u043e \u0432 <strong>.gitlab-ci.yml<\/strong>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">deploy_gitlab_runner:\n  extends: .deploy_qbec_app\n  variables:\n    GIT_SUBMODULE_STRATEGY: normal\n  before_script:\n    - base64 -d \"$GITCRYPT_KEY\" | git-crypt unlock -\n  script:\n    - qbec apply default --root deploy\/gitlab-runner --force:k8s-context __incluster__ --wait --yes\n  only:\n    changes:\n      - deploy\/gitlab-runner\/**\/*<\/code><\/pre>\n<p><\/p>\n<p><strong>changes<\/strong> \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u0441\u043b\u0435\u0434\u0438\u0442\u044c \u0437\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f\u043c\u0438 \u0432 <strong>deploy\/gitlab-runner\/<\/strong> \u0438 \u0431\u0443\u0434\u0435\u0442 \u0442\u0440\u0438\u0433\u0435\u0440\u0438\u0442\u044c \u043d\u0430\u0448\u0443 \u0434\u0436\u043e\u0431\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0440\u0438 \u043d\u0430\u043b\u0438\u0447\u0438\u0438 \u0442\u0430\u043a\u043e\u0432\u044b\u0445<\/p>\n<p><\/p>\n<p>\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442\u044c \u043d\u0430\u0448\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/p>\n<p><\/p>\n<pre><code class=\"bash\">git add .gitlab-ci.yml\ngit commit -m \"Reduce gitlab-runner deploy\"<\/code><\/pre>\n<p><\/p>\n<p><strong>git push<\/strong>, \u0442\u0430\u043a-\u0442\u043e \u043b\u0443\u0447\u0448\u0435:<\/p>\n<p>\n<b class=\"spoiler_title\">\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u043e\u0431\u043d\u043e\u0432\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430<\/b><\/p>\n<p><img decoding=\"async\" alt=\"\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes\" src=\"\/wp-content\/uploads\/2020\/09\/16e46ee420da6ee517d57a224277a5ca.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h1 id=\"12-dynamic-environmentsanchordynamic-environmentsanchor\">12. Dynamic environments<noindex><a rel=\"nofollow\" name=\"dynamic-environments\"><\/a><\/noindex><\/h1>\n<p><\/p>\n<p>\u041d\u0430\u0441\u0442\u0430\u043b\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0437\u043d\u043e\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043d\u0430\u0448 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0434\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u043c\u0438 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f\u043c\u0438.<\/p>\n<p><\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043e\u0431\u043d\u043e\u0432\u0438\u043c \u0434\u0436\u043e\u0431\u0443 <strong>build_website<\/strong> \u0432 \u043d\u0430\u0448\u0435\u043c <strong>.gitlab-ci.yml<\/strong>, \u0443\u0431\u0440\u0430\u0432 \u0438\u0437 \u043d\u0435\u0451 \u0431\u043b\u043e\u043a <strong>only<\/strong>, \u0447\u0442\u043e \u0437\u0430\u0441\u0442\u0430\u0432\u0438\u0442 Gitlab \u0442\u0440\u0438\u0433\u0435\u0440\u0440\u0438\u0442\u044c \u0435\u0451 \u043f\u0440\u0438 \u043b\u044e\u0431\u043e\u043c \u043a\u043e\u043c\u043c\u0438\u0442\u0435 \u0432 \u043b\u044e\u0431\u0443\u044e \u0432\u0435\u0442\u043a\u0443:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">build_website:\n  extends: .build_docker_image\n  variables:\n    GIT_SUBMODULE_STRATEGY: normal\n  script:\n    - mkdir -p $CI_PROJECT_DIR\/artifacts\n    - \/kaniko\/executor --cache --context $CI_PROJECT_DIR --dockerfile $CI_PROJECT_DIR\/dockerfiles\/website\/Dockerfile --destination $CI_REGISTRY_IMAGE\/website:$CI_COMMIT_REF_NAME --digest-file $CI_PROJECT_DIR\/artifacts\/website.digest\n  artifacts:\n    paths:\n      - artifacts\/<\/code><\/pre>\n<p><\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u043e\u0431\u043d\u043e\u0432\u0438\u043c \u0434\u0436\u043e\u0431\u0443 <strong>deploy_website<\/strong>, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0442\u0443\u0434\u0430 \u0431\u043b\u043e\u043a <strong>environment<\/strong>:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">deploy_website:\n  extends: .deploy_qbec_app\n  environment:\n    name: prod\n    url: https:\/\/docs.example.org\n  script:\n    - DIGEST=\"$(cat artifacts\/website.digest)\"\n    - qbec apply default --root deploy\/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest=\"$DIGEST\"<\/code><\/pre>\n<p><\/p>\n<p>\u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 Gitlab \u0430\u0441\u0441\u043e\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0436\u043e\u0431\u0443 \u0441 <strong>prod<\/strong> \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435\u043c \u0438 \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0443\u044e \u0441\u0441\u044b\u043b\u043a\u0443 \u043d\u0430 \u043d\u0435\u0433\u043e.<\/p>\n<p><\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0449\u0451 \u0434\u0432\u0435 \u0434\u0436\u043e\u0431\u044b:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">deploy_website:\n  extends: .deploy_qbec_app\n  environment:\n    name: prod\n    url: https:\/\/docs.example.org\n  script:\n    - DIGEST=\"$(cat artifacts\/website.digest)\"\n    - qbec apply default --root deploy\/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest=\"$DIGEST\"\n\ndeploy_review:\n  extends: .deploy_qbec_app\n  environment:\n    name: review\/$CI_COMMIT_REF_NAME\n    url: http:\/\/$CI_ENVIRONMENT_SLUG.docs.example.org\n    on_stop: stop_review\n  script:\n    - DIGEST=\"$(cat artifacts\/website.digest)\"\n    - qbec apply review --root deploy\/website --force:k8s-context __incluster__ --wait --yes --vm:ext-str digest=\"$DIGEST\" --vm:ext-str subdomain=\"$CI_ENVIRONMENT_SLUG\" --app-tag \"$CI_ENVIRONMENT_SLUG\"\n  only:\n    refs:\n    - branches\n  except:\n    refs:\n      - master\n\nstop_review:\n  extends: .deploy_qbec_app\n  environment:\n    name: review\/$CI_COMMIT_REF_NAME\n    action: stop\n  stage: deploy\n  before_script:\n    - git clone \"$CI_REPOSITORY_URL\" master\n    - cd master\n  script:\n    - qbec delete review --root deploy\/website --force:k8s-context __incluster__ --yes --vm:ext-str digest=\"$DIGEST\" --vm:ext-str subdomain=\"$CI_ENVIRONMENT_SLUG\" --app-tag \"$CI_ENVIRONMENT_SLUG\"\n  variables:\n    GIT_STRATEGY: none\n  only:\n    refs:\n    - branches\n  except:\n    refs:\n      - master\n  when: manual<\/code><\/pre>\n<p><\/p>\n<p>\u041e\u043d\u0438 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u0438 push \u0432 \u043b\u044e\u0431\u044b\u0435 \u0431\u0440\u0435\u043d\u0447\u0438 \u043a\u0440\u043e\u043c\u0435 master \u0438 \u0431\u0443\u0434\u0443\u0442 \u0434\u0435\u043f\u043b\u043e\u0438\u0442\u044c preview \u0432\u0435\u0440\u0441\u0438\u044e \u0441\u0430\u0439\u0442\u0430.<\/p>\n<p><\/p>\n<p>\u041c\u044b \u0432\u0438\u0434\u0438\u043c \u043d\u043e\u0432\u0443\u044e \u043e\u043f\u0446\u0438\u044e \u0434\u043b\u044f qbec: <strong>&#8212;app-tag<\/strong> \u2014 \u043e\u043d\u0430 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0442\u044d\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u0442\u044d\u0433\u0430, \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0438 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0432 Kubernetes qbec \u0431\u0443\u0434\u0435\u0442 \u043e\u043f\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u0438.<br \/>\n\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u043c\u044b \u043c\u043e\u0436\u0435\u043c \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u044d\u043d\u0432\u0430\u0439\u0440\u043e\u043c\u0435\u043d\u0442 \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u044b\u0439 review, \u0430 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u0435\u0440\u0435\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435.<\/p>\n<p><\/p>\n<p>\u0417\u0434\u0435\u0441\u044c \u043c\u044b \u0442\u0430\u043a \u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c <strong>qbec apply review<\/strong>, \u0432\u043c\u0435\u0441\u0442\u043e <strong>qbec apply default<\/strong> \u2014 \u044d\u0442\u043e \u043a\u0430\u043a \u0440\u0430\u0437 \u0442\u043e\u0442 \u0441\u0430\u043c\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u0435\u043c\u0441\u044f \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u0438\u044f \u0434\u043b\u044f \u043d\u0430\u0448\u0438\u0445 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0439 (review \u0438 default):<\/p>\n<p><\/p>\n<p>\u0414\u043e\u0431\u0430\u0432\u0438\u043c <strong>review<\/strong> \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435 \u0432 <strong>deploy\/website\/qbec.yaml<\/strong><\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">spec:\n  environments:\n    review:\n      defaultNamespace: docs\n      server: https:\/\/kubernetes.example.org:8443<\/code><\/pre>\n<p><\/p>\n<p>\u0417\u0430\u0442\u0435\u043c \u043e\u0431\u044c\u044f\u0432\u0438\u043c \u0435\u0433\u043e \u0432 <strong>deploy\/website\/params.libsonnet<\/strong>:<\/p>\n<p><\/p>\n<pre><code class=\"javascript\">local env = std.extVar('qbec.io\/env');\nlocal paramsMap = {\n  _: import '.\/environments\/base.libsonnet',\n  default: import '.\/environments\/default.libsonnet',\n  review: import '.\/environments\/review.libsonnet',\n};\n\nif std.objectHas(paramsMap, env) then paramsMap[env] else error 'environment ' + env + ' not defined in ' + std.thisFile<\/code><\/pre>\n<p><\/p>\n<p>\u0418 \u0437\u0430\u043f\u0438\u0448\u0435\u043c \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u043d\u0435\u0433\u043e \u0432 <strong>deploy\/website\/environments\/review.libsonnet<\/strong>:<\/p>\n<p><\/p>\n<pre><code class=\"javascript\">\/\/ this file has the param overrides for the default environment\nlocal base = import '.\/base.libsonnet';\nlocal slug = std.extVar('qbec.io\/tag');\nlocal subdomain = std.extVar('subdomain');\n\nbase {\n  components+: {\n    website+: {\n      name: 'example-docs-' + slug,\n      domain: subdomain + '.docs.example.org',\n    },\n  },\n}<\/code><\/pre>\n<p><\/p>\n<p>\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u0435\u0435 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043d\u0430 \u0434\u0436\u043e\u0431\u0443 <strong>stop_review<\/strong>, \u043e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0442\u0440\u0438\u0433\u0435\u0440\u0438\u0442\u044c\u0441\u044f \u043f\u0440\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0438 \u0431\u0440\u044d\u043d\u0447\u0430 \u0438 \u0447\u0442\u043e\u0431\u044b gitlab \u043d\u0435 \u043f\u044b\u0442\u0430\u043b\u0441\u044f \u0441\u0434\u0435\u043b\u0430\u0442\u044c checkout \u043d\u0430 \u043d\u0435\u0451 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f <strong>GIT_STRATEGY: none<\/strong>, \u043f\u043e\u0437\u0436\u0435 \u043c\u044b \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c <strong>master<\/strong>-\u0432\u0435\u0442\u043a\u0443 \u0438 \u0443\u0434\u0430\u043b\u044f\u0435\u043c review \u0447\u0435\u0440\u0435\u0437 \u043d\u0435\u0451.<br \/>\n\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u0437\u0430\u043c\u043e\u0440\u043e\u0447\u043d\u043e, \u043d\u043e \u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0430\u0441\u0438\u0432\u043e\u0433\u043e \u0441\u043f\u043e\u0441\u043e\u0431\u0430 \u044f \u043f\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0448\u0451\u043b.<br \/>\n\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u0435\u043f\u043b\u043e\u0439 \u043a\u0430\u0436\u0434\u043e\u0433\u043e review \u0432 \u043e\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043d\u0435\u0439\u043c\u0441\u043f\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u0441\u0435\u0433\u0434\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043d\u0435\u0441\u0442\u0438 \u0446\u0435\u043b\u0438\u043a\u043e\u043c.<\/p>\n<p><\/p>\n<p>\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442\u044c \u043d\u0430\u0448\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">git add .\ngit commit -m \"Enable automatic review\"<\/code><\/pre>\n<p><\/p>\n<p><strong>git push<\/strong>, <strong>git checkout -b test<\/strong>, <strong>git push origin test<\/strong>, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c:<\/p>\n<p>\n<b class=\"spoiler_title\">\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0445 environments \u0432 Gitlab<\/b><\/p>\n<p><img decoding=\"async\" alt=\"\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes\" src=\"\/wp-content\/uploads\/2020\/09\/af29d19ef1f70aee02c8e477cd20793c.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<p>\u0412\u0441\u0451 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442? \u2014 \u043e\u0442\u043b\u0438\u0447\u043d\u043e, \u0443\u0434\u0430\u043b\u044f\u0435\u043c \u043d\u0430\u0448\u0443 \u0442\u0435\u0441\u0442\u043e\u0432\u0443\u044e \u0432\u0435\u0442\u043a\u0443: <strong>git checkout master<\/strong>, <strong>git push origin :test<\/strong>, \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0447\u0442\u043e \u0434\u0436\u043e\u0431\u044b \u043d\u0430 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 environment \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u0431\u0435\u0437 \u043e\u0448\u0438\u0431\u043e\u043a.<\/p>\n<p><\/p>\n<blockquote><p>\u0417\u0434\u0435\u0441\u044c \u0441\u0440\u0430\u0437\u0443 \u0445\u043e\u0447\u0435\u0442\u0441\u044f \u0443\u0442\u043e\u0447\u043d\u0438\u0442\u044c, \u0447\u0442\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0432\u0435\u0442\u043a\u0438 \u043c\u043e\u0436\u0435\u0442 \u043b\u044e\u0431\u043e\u0439 \u0434\u0435\u0432\u0435\u043b\u043e\u043f\u0435\u0440 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442\u0435, \u043e\u043d \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u0435\u0442 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c <strong>.gitlab-ci.yml<\/strong> \u0444\u0430\u0439\u043b \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0441\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u043c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c.<br \/>\n\u041f\u043e \u044d\u0442\u043e\u043c\u0443 \u043d\u0430\u0441\u0442\u043e\u044f\u0442\u0435\u043b\u044c\u043d\u043e \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u0442\u0441\u044f \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c \u0438\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f protected-\u0432\u0435\u0442\u043e\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0432 <strong>master<\/strong>, \u043b\u0438\u0431\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u0441\u0435\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u043f\u043e\u0434 \u043a\u0430\u0436\u0434\u043e\u0435 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435.<\/p><\/blockquote>\n<h1 id=\"13-review-appsanchorreview-appsanchor\">13. Review Apps<noindex><a rel=\"nofollow\" name=\"review-apps\"><\/a><\/noindex><\/h1>\n<p><\/p>\n<p><strong><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ee\/ci\/review_apps\/\" rel=\"nofollow\">Review Apps<\/a><\/noindex><\/strong> \u044d\u0442\u043e \u0442\u0430\u043a\u0430\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0433\u0438\u0442\u043b\u0430\u0431\u0430, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0444\u0430\u0439\u043b\u0430 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 \u0434\u043b\u044f \u0435\u0433\u043e \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u0432 \u0437\u0430\u0434\u0435\u043f\u043b\u043e\u0435\u043d\u043d\u043e\u043c \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438.<\/p>\n<p><\/p>\n<p>\u0414\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u044d\u0442\u0438 \u043a\u043d\u043e\u043f\u043a\u0438 \u043f\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c, \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0444\u0430\u0439\u043b <strong>.gitlab\/route-map.yml<\/strong> \u0438 \u043e\u043f\u0438\u0441\u0430\u0442\u044c \u0432 \u043d\u0451\u043c \u0432\u0441\u0435 \u0442\u0440\u0430\u043d\u0441\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043f\u0443\u0442\u0435\u0439, \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u044d\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\"># Indices\n- source: \/content\/(.+?)_index.(md|html)\/ \n  public: '1'\n\n# Pages\n- source: \/content\/(.+?).(md|html)\/ \n  public: '1\/'<\/code><\/pre>\n<p><\/p>\n<p>\u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0435\u043c \u0437\u0430\u043a\u043e\u043c\u043c\u0438\u0442\u0438\u0442\u044c \u043d\u0430\u0448\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f:<\/p>\n<p><\/p>\n<pre><code class=\"plaintext\">git add .gitlab\/\ngit commit -m \"Enable review apps\"<\/code><\/pre>\n<p><\/p>\n<p><strong>git push<\/strong>, \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c:<\/p>\n<p>\n<b class=\"spoiler_title\">\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442 \u043a\u043d\u043e\u043f\u043a\u0438 Review App<\/b><\/p>\n<p><img decoding=\"async\" alt=\"\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes\" src=\"\/wp-content\/uploads\/2020\/09\/0485ed204c0acb33f5ee017d1f98a812.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><\/p>\n<h1 id=\"job-is-done\">Job is done!<\/h1>\n<p><\/p>\n<p><strong>\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430:<\/strong><\/p>\n<p><\/p>\n<ul>\n<li>\u043d\u0430 Gitlab: <noindex><a rel=\"nofollow\" href=\"https:\/\/gitlab.com\/kvaps\/docs.example.org\" rel=\"nofollow\">https:\/\/gitlab.com\/kvaps\/docs.example.org<\/a><\/noindex><\/li>\n<li>\u043d\u0430 GitHub: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/kvaps\/docs.example.org\" rel=\"nofollow\">https:\/\/github.com\/kvaps\/docs.example.org<\/a><\/noindex><\/li>\n<\/ul>\n<p><\/p>\n<p>\u0421\u043f\u0430\u0441\u0438\u0431\u043e \u0437\u0430 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043d\u0430\u0434\u0435\u044e\u0441\u044c \u0432\u0430\u043c \u043f\u043e\u043d\u0440\u0430\u0432\u0438\u043b\u043e\u0441\u044c <img decoding=\"async\" alt=\"\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes\" src=\"\/wp-content\/uploads\/2020\/09\/de98f9080eeb2ef184c6173748034ad0.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/481662\/\">habr.com<\/a> <\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u0417\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0448\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0430\u043a \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 Docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0442\u0430\u043a \u0438 \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0433\u0438\u0442\u043b\u0430\u0431\u043e\u043c, \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d. \u0412\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0442\u0430\u043b \u0441\u0430\u0439\u0442 kubernetes.io, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u0434\u043e\u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438\u0441\u043b\u0430\u043d\u043d\u044b\u0439 \u043f\u0443\u043b [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":93639,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-93638","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442! \u0417\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0448\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0430\u043a \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 Docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0442\u0430\u043a \u0438 \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0433\u0438\u0442\u043b\u0430\u0431\u043e\u043c, \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d. \u0412\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0442\u0430\u043b \u0441\u0430\u0439\u0442 kubernetes.io, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u0434\u043e\u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438\u0441\u043b\u0430\u043d\u043d\u044b\u0439 \u043f\u0443\u043b\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/probuem-novye-instrumenty-dlya-sborki-i-avtomatizaczii-deploya-v-kubernetes\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442! \u0417\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0448\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0430\u043a \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 Docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0442\u0430\u043a \u0438 \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0433\u0438\u0442\u043b\u0430\u0431\u043e\u043c, \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d. \u0412\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0442\u0430\u043b \u0441\u0430\u0439\u0442 kubernetes.io, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u0434\u043e\u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438\u0441\u043b\u0430\u043d\u043d\u044b\u0439 \u043f\u0443\u043b\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/probuem-novye-instrumenty-dlya-sborki-i-avtomatizaczii-deploya-v-kubernetes\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-09-08T05:42:38+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-09-08T05:42:38+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47 Neue Tools zur Erstellung und Automatisierung der Bereitstellung in Kubernetes | ProHoster","description":"Hallo! In letzter Zeit sind viele gro\u00dfartige Automatisierungstools sowohl f\u00fcr den Aufbau von Docker-Images als auch f\u00fcr die Bereitstellung in Kubernetes erschienen. Aus diesem Grund habe ich beschlossen, mich mit GitLab zu besch\u00e4ftigen, seine Funktionen gr\u00fcndlich zu erkunden und nat\u00fcrlich eine Pipeline zu konfigurieren. Inspiration f\u00fcr diese Arbeit war die Website kubernetes.io, die automatisch aus dem Quellcode generiert wird, und f\u00fcr jeden eingereichten Pull-Request.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/probuem-novye-instrumenty-dlya-sborki-i-avtomatizaczii-deploya-v-kubernetes","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u043d\u043e\u0432\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442! \u0417\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u0448\u043b\u043e \u043c\u043d\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u043d\u044b\u0445 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u043a\u0430\u043a \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 Docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0442\u0430\u043a \u0438 \u0434\u043b\u044f \u0434\u0435\u043f\u043b\u043e\u044f \u0432 Kubernetes. \u0412 \u0441\u0432\u044f\u0437\u0438 \u0441 \u044d\u0442\u0438\u043c \u0440\u0435\u0448\u0438\u043b \u043f\u043e\u0438\u0433\u0440\u0430\u0442\u044c\u0441\u044f \u0441 \u0433\u0438\u0442\u043b\u0430\u0431\u043e\u043c, \u043a\u0430\u043a \u0441\u043b\u0435\u0434\u0443\u0435\u0442 \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u0435\u0433\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438, \u043a\u043e\u043d\u0435\u0447\u043d\u043e \u0436\u0435, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d. \u0412\u0434\u043e\u0445\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435\u043c \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u0442\u0430\u043b \u0441\u0430\u0439\u0442 kubernetes.io, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0438\u0437 \u0438\u0441\u0445\u043e\u0434\u043d\u044b\u0445 \u043a\u043e\u0434\u043e\u0432 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438, \u0430 \u043d\u0430 \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u0438\u0441\u043b\u0430\u043d\u043d\u044b\u0439 \u043f\u0443\u043b","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/probuem-novye-instrumenty-dlya-sborki-i-avtomatizaczii-deploya-v-kubernetes","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-09-08T05:42:38+00:00","article:modified_time":"2020-09-08T05:42:38+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"93638","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 11:43:39","updated":"2022-09-28 01:06:33"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/93638","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=93638"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/93638\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/93639"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=93638"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=93638"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=93638"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}