{"id":371328,"date":"2024-05-21T04:45:58","date_gmt":"2024-05-21T04:45:58","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=371328"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=371328","title":{"rendered":"<span>CI\/CD Kubernetes \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430 Gitorion. \u041d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0430\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0430 CD \u043d\u0430 \u0431\u0430\u0437\u0435 Jenkins<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442 \u0432\u0441\u0435\u043c! \u0412 <a href=\"https:\/\/habr.com\/ru\/companies\/gitorion\/articles\/799933\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u043c\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 CI \u043d\u0430 \u0431\u0430\u0437\u0435 Gitea\/Forgejo \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 Gitorion. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435\u043c \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 CD \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 Gitorion \u043d\u0430 \u0431\u0430\u0437\u0435 Jenkins.<\/p>\n<h2>Jenkins Agents<\/h2>\n<p>Jenkins \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u043e\u0432 \u0432 \u0430\u0433\u0435\u043d\u0442\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043a\u0430\u043a \u043c\u043e\u0434\u0443\u043b\u0438 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes \u043f\u043e Web-\u0445\u0443\u043a\u0443 \u0438\u0437 Gitea\/Forgejo. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 Jenkins, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0445  \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u044b \u0434\u043b\u044f \u0432\u0435\u0442\u043e\u043a dev1, dev2, dev3 \u0438 main. \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u044c \u0430\u0433\u0435\u043d\u0442\u0430 Jenkins \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/024\/6bc\/fd0\/0246bcfd0ae9cf0851ab1febe27f4f9a.png\" alt=\"\u041c\u043e\u0434\u0443\u043b\u0438 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 Jenkins \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes\" title=\"\u041c\u043e\u0434\u0443\u043b\u0438 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 Jenkins \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes\" width=\"1350\" height=\"220\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/024\/6bc\/fd0\/0246bcfd0ae9cf0851ab1febe27f4f9a.png\"\/><\/p>\n<div><figcaption>\u041c\u043e\u0434\u0443\u043b\u0438 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 Jenkins \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes<\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0433\u0435\u043d\u0442\u0430 Jenkins \u0437\u0430\u0434\u0430\u043b\u0438 \u0432 Jenkinsfile. <\/p>\n<details class=\"spoiler\">\n<summary>Jenkinfile<\/summary>\n<div class=\"spoiler__content\">\n<p>pipeline {<\/p>\n<p>    agent {<br \/>        kubernetes {<br \/>            inheritFrom &#8216;build-service-pod&#8217;<br \/>            yaml &#171;&#187;&#187;<br \/>                apiVersion: v1<br \/>                kind: Pod<br \/>                metadata:<br \/>                  name: docker-in-docker<br \/>                  labels:<br \/>                    <a href=\"http:\/\/app.kubernetes.io\/component:\">app.kubernetes.io\/component:<\/a> jenkins-dind<br \/>                    <a href=\"http:\/\/app.kubernetes.io\/instance:\">app.kubernetes.io\/instance:<\/a> jenkins<br \/>                spec:<br \/>                  containers:<br \/>                     &#8212; name: docker-client<br \/>                         image: docker:23.0.1-alpine3.17<br \/>                         imagePullPolicy: IfNotPresent<br \/>                         env:<br \/>                           &#8212; name: DOCKER_HOST<br \/>                             value: tcp:\/\/dind.jenkins.svc.cluster.local:2375<br \/>            &#171;&#187;&#187;<br \/>     }<br \/> }<\/p>\n<\/div>\n<\/details>\n<p>\u0410\u0433\u0435\u043d\u0442 \u0432\u044b\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438\u0437 Gitea\/Forgejo \u043f\u043e Web-\u0445\u0443\u043a\u0443 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0442\u0430\u0434\u0438\u0438 \u043f\u0430\u0439\u043f\u043b\u0430\u043d\u0430 \u0432 Jenkinsfile.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/8c8\/04e\/10d\/8c804e10dbebad4e598d0ef671306826.png\" alt=\"Jenkins Agent \u0432\u044b\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438\u0437 Gitea\/Forgejo\" title=\"Jenkins Agent \u0432\u044b\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438\u0437 Gitea\/Forgejo\" width=\"1350\" height=\"820\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/8c8\/04e\/10d\/8c804e10dbebad4e598d0ef671306826.png\"\/><\/p>\n<div><figcaption>Jenkins Agent \u0432\u044b\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438\u0437 Gitea\/Forgejo<\/figcaption><\/div>\n<\/figure>\n<h2>Docker-in-Docker<\/h2>\n<p>\u0414\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 Docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes \u0441\u0435\u0440\u0432\u0438\u0441 Docker-in-Docker (dind) \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u043a \u0430\u0433\u0435\u043d\u0442\u0430\u043c Jenkins. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 docker build \u0432 \u0441\u0442\u0430\u0434\u0438\u0438 Build \u0441\u0431\u043e\u0440\u043a\u0438 Docker-\u043e\u0431\u0440\u0430\u0437\u0430 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 Docker-in-Docker.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/753\/50d\/535\/75350d5355b969048e94a4450ab83179.png\" alt=\"Jenkins Agent \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 Docker-\u043e\u0431\u0440\u0430\u0437 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430\" title=\"Jenkins Agent \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 Docker-\u043e\u0431\u0440\u0430\u0437 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430\" width=\"1350\" height=\"2000\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/753\/50d\/535\/75350d5355b969048e94a4450ab83179.png\"\/><\/p>\n<div><figcaption>Jenkins Agent \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 Docker-\u043e\u0431\u0440\u0430\u0437 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/figcaption><\/div>\n<\/figure>\n<h2>Docker Registry<\/h2>\n<p>\u0414\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 Docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Docker Registry. Jenkins Agent \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 docker push \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 Docker-\u043e\u0431\u0440\u0430\u0437, \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 Build, \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Docker Registry. \u041d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes \u0440\u0435\u0441\u0443\u0440\u0441\u044b Deployment \u0438\u043b\u0438 StatefulSet \u0431\u0435\u0440\u0443\u0442 Docker-\u043e\u0431\u0440\u0430\u0437\u044b \u0438\u0437 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f Docker Registry \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/199\/d08\/c3f\/199d08c3faaec5e37f5b5ba48435f840.png\" alt=\"Jenkins Agent \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 Docker-\u043e\u0431\u0440\u0430\u0437 \u0432 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Docker Registry\" title=\"Jenkins Agent \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 Docker-\u043e\u0431\u0440\u0430\u0437 \u0432 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Docker Registry\" width=\"1350\" height=\"840\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/199\/d08\/c3f\/199d08c3faaec5e37f5b5ba48435f840.png\"\/><\/p>\n<div><figcaption>Jenkins Agent \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 Docker-\u043e\u0431\u0440\u0430\u0437 \u0432 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Docker Registry<\/figcaption><\/div>\n<\/figure>\n<h2>Multibranch Pipeline<\/h2>\n<p>\u0412 <a href=\"https:\/\/habr.com\/ru\/companies\/gitorion\/articles\/799933\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u043f\u0440\u043e \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0443\u044e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e CI \u043d\u0430 \u0431\u0430\u0437\u0435 Gitea\/Forgejo \u043c\u044b \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u0438, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0432\u043d\u043e\u0441\u0438\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0441\u0432\u043e\u0435\u0439 \u0432\u0435\u0442\u043a\u0438. \u0412 Jenkins \u0435\u0441\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0442\u0438\u043f\u0430 Multibranch Pipeline, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0435 \u0432\u0435\u0442\u043a\u0438 \u0432 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0442\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438:<\/p>\n<pre><code>git checkout -b dev3 git push --set-upstream origin dev3<\/code><\/pre>\n<p>Gitea\/Forgejo \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 Web-\u0445\u0443\u043a \u0432 Jenkins. Jenkins \u043f\u043e Web-\u0445\u0443\u043a\u0443 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0442\u043a\u0443 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0434\u043b\u044f \u043d\u0435\u0435 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/5ec\/027\/1b6\/5ec0271b615090c0fdfec9f1af445389.png\" alt=\"Multibranch Pipeline \u043d\u0430\u0448\u0435\u043b \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0442\u043a\u0443 dev3 \u0432 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u0434\u043b\u044f \u043d\u0435\u0435 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\" title=\"Multibranch Pipeline \u043d\u0430\u0448\u0435\u043b \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0442\u043a\u0443 dev3 \u0432 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u0434\u043b\u044f \u043d\u0435\u0435 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\" width=\"1350\" height=\"620\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/5ec\/027\/1b6\/5ec0271b615090c0fdfec9f1af445389.png\"\/><\/p>\n<div><figcaption>Multibranch Pipeline \u043d\u0430\u0448\u0435\u043b \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0442\u043a\u0443 dev3 \u0432 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u0434\u043b\u044f \u043d\u0435\u0435 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d<\/figcaption><\/div>\n<\/figure>\n<h2>C\u0442\u0430\u0434\u0438\u0438 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430<\/h2>\n<p>\u041d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0438\u043c\u0435\u043d\u0438 \u0432\u0435\u0442\u043a\u0438, \u043f\u0435\u0440\u0432\u043e\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0434\u0438\u044f Build, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f Docker-\u043e\u0431\u0440\u0430\u0437 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Docker Registry. \u0414\u0430\u043b\u0435\u0435, \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0438\u0437 Web-\u0445\u0443\u043a\u0430 \u0438\u043c\u044f \u0432\u0435\u0442\u043a\u0438. \u0414\u043b\u044f \u0432\u0435\u0442\u043a\u0438 main \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0442\u0430\u0434\u0438\u044e Staging \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441 \u0432 \u043a\u043e\u043d\u0442\u0443\u0440 Staging.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/c6a\/d58\/1ad\/c6ad581ad299fd17ec3b4b74cd3d5cfb.png\" alt=\"\u0421\u0442\u0430\u0434\u0438\u044f Staging\" title=\"\u0421\u0442\u0430\u0434\u0438\u044f Staging\" width=\"1520\" height=\"680\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/c6a\/d58\/1ad\/c6ad581ad299fd17ec3b4b74cd3d5cfb.png\"\/><\/p>\n<div><figcaption>\u0421\u0442\u0430\u0434\u0438\u044f Staging<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0432\u0435\u0442\u043e\u043a \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0442\u0430\u0434\u0438\u044e Review \u0438 \u0434\u0435\u043f\u043b\u043e\u0438\u0442 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441 \u0432 \u043a\u043e\u043d\u0442\u0443\u0440 Development.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/3bb\/52f\/160\/3bb52f160e0978b9f88b5a6da9873cda.png\" alt=\"\u0421\u0442\u0430\u0434\u0438\u044f Review\" title=\"\u0421\u0442\u0430\u0434\u0438\u044f Review\" width=\"1520\" height=\"680\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/3bb\/52f\/160\/3bb52f160e0978b9f88b5a6da9873cda.png\"\/><\/p>\n<div><figcaption>\u0421\u0442\u0430\u0434\u0438\u044f Review<\/figcaption><\/div>\n<\/figure>\n<p>C\u0442\u0430\u0434\u0438\u0438 Staging \u0438 Review \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b templates helm-\u0447\u0430\u0440\u0442\u0430 \u0432 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0430 Review \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u043e\u0441\u044c \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0438 \u043d\u0430 Staging \u0438 \u0432 Production. \u0412 helm-\u0447\u0430\u0440\u0442\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f configs \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0430\u043c\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0443\u0440\u0430 Development, Staging \u0438 Production.<\/p>\n<h2>\u0421\u0432\u044f\u0437\u044c \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 Gitea \u0441 \u0440\u0435\u0432\u0438\u0437\u0438\u044f\u043c\u0438 Helm<\/h2>\n<p>Jenkins Agent \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0434\u0435\u043f\u043b\u043e\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0432 Staging \u043a\u043e\u043d\u0442\u0443\u0440 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 SHA1 \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0438\u0437 Web-\u0445\u0443\u043a\u0430 Gitea\/Forgejo.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/bc6\/681\/7fa\/bc66817faaec8d517db8e27a91b62c71.png\" alt=\"\u041a\u043e\u043c\u043c\u0438\u0442\u044b \u0432 Gitea\/Forgejo\" title=\"\u041a\u043e\u043c\u043c\u0438\u0442\u044b \u0432 Gitea\/Forgejo\" width=\"1350\" height=\"560\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/bc6\/681\/7fa\/bc66817faaec8d517db8e27a91b62c71.png\"\/><\/p>\n<div><figcaption>\u041a\u043e\u043c\u043c\u0438\u0442\u044b \u0432 Gitea\/Forgejo<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u0434\u0435\u043f\u043b\u043e\u0439 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430 &#8212; \u044d\u0442\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0430\u044f \u0440\u0435\u0432\u0438\u0437\u0438\u044f helm. \u041c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 SHA1 \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u043a \u0438\u043c\u0435\u043d\u0430\u043c \u0440\u0435\u0432\u0438\u0437\u0438\u0439 helm, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0441\u0432\u044f\u0437\u0430\u0432 SHA1 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u0441 \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438 \u0440\u0435\u0432\u0438\u0437\u0438\u0439 helm.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a6f\/e88\/0cf\/a6fe880cf211e3bfc8fcf184ef836f9a.png\" alt=\"\u0421\u0432\u044f\u0437\u044c SHA1 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 Gitea\/Forgejo c \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438 \u0440\u0435\u0432\u0438\u0437\u0438\u0439 helm\" title=\"\u0421\u0432\u044f\u0437\u044c SHA1 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 Gitea\/Forgejo c \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438 \u0440\u0435\u0432\u0438\u0437\u0438\u0439 helm\" width=\"1350\" height=\"180\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a6f\/e88\/0cf\/a6fe880cf211e3bfc8fcf184ef836f9a.png\"\/><\/p>\n<div><figcaption>\u0421\u0432\u044f\u0437\u044c SHA1 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 Gitea\/Forgejo c \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438 \u0440\u0435\u0432\u0438\u0437\u0438\u0439 helm<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a \u0436\u0435 SHA1 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u044d\u0433\u043e\u0432 \u043f\u0440\u0438 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f Docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432:<\/p>\n<p>      image: docker-registry.jenkins.svc.cluster.local\/owneruser\/backend\/main:bb7cfed40a<\/p>\n<h2>\u041f\u0440\u043e\u043c\u043e\u0443\u0448\u0435\u043d Promote \u0441\u043e Staging \u043d\u0430 Production<\/h2>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0432 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 Staging \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043e\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0443, \u0442\u0438\u043c\u043b\u0438\u0434 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043f\u0440\u043e\u043c\u043e\u0443\u0448\u0435\u043d\u0430 Promote \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0441\u043e Staging \u043d\u0430 Production. \u041f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code>helm history staging-owneruser-backend -n staging<\/code><\/pre>\n<p>\u0411\u0435\u0440\u0435\u0442 SHA1 \u043a\u043e\u043c\u043c\u0438\u0442\u0430, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0435\u0432\u0438\u0437\u0438\u0438, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435 STATUS \u0441\u0442\u043e\u0438\u0442 &#171;deployed&#187; (\u0441\u043c. \u0441\u043a\u0440\u0438\u043d \u0432\u044b\u0448\u0435). \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0438\u0437 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043e\u0431\u0440\u0430\u0437\u043e\u0432 Docker Registry Docker-\u043e\u0431\u0440\u0430\u0437, \u0442\u044d\u0433 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u043e\u043c\u043c\u0438\u0442\u0443 \u0441\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u043c &#171;deployed&#187;:<\/p>\n<p>      image: docker-registry.jenkins.svc.cluster.local\/owneruser\/backend\/main:74e5cbd967<\/p>\n<p>\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442  \u0432  Production \u043a\u043e\u043d\u0442\u0443\u0440. \u0421\u0442\u0430\u0434\u0438\u044f Build \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0431\u043e\u0440\u043a\u0430 Docker-\u043e\u0431\u0440\u0430\u0437\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 \u043f\u0440\u043e\u043c\u043e\u0443\u0448\u0435\u043d\u0430 Promote.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9e0\/ba7\/8b6\/9e0ba78b6ae08fc539d9e4ac2de55e35.png\" alt=\"\u0421\u0442\u0430\u0434\u0438\u044f \u043f\u0440\u043e\u043c\u043e\u0443\u0448\u0435\u043d\u0430 Promote \u0441\u043e Staging \u043d\u0430 Production\" title=\"\u0421\u0442\u0430\u0434\u0438\u044f \u043f\u0440\u043e\u043c\u043e\u0443\u0448\u0435\u043d\u0430 Promote \u0441\u043e Staging \u043d\u0430 Production\" width=\"1520\" height=\"680\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9e0\/ba7\/8b6\/9e0ba78b6ae08fc539d9e4ac2de55e35.png\"\/><\/p>\n<div><figcaption>\u0421\u0442\u0430\u0434\u0438\u044f \u043f\u0440\u043e\u043c\u043e\u0443\u0448\u0435\u043d\u0430 Promote \u0441\u043e Staging \u043d\u0430 Production<\/figcaption><\/div>\n<\/figure>\n<h2>\u041e\u0442\u043a\u0430\u0442 Rollback \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438<\/h2>\n<p>\u041d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439, \u0435\u0441\u043b\u0438 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043e\u0442\u043a\u0430\u0442\u0430 Rollback \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438. \u0427\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0430, \u043f\u043e\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443.<\/p>\n<p>\u0414\u043b\u044f \u043e\u0442\u043a\u0430\u0442\u0430 Rollback \u0442\u0438\u043c\u043b\u0438\u0434\u0443 \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f, \u0434\u043e \u043a\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0432 Gitea\/Forgejo \u043e\u043d \u0445\u043e\u0447\u0435\u0442 \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u044c\u0441\u044f, \u0437\u0430\u0434\u0430\u0442\u044c SHA1 \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/db1\/68c\/456\/db168c4561e05bffb5e3da166e0aeada.png\" alt=\"\u0421\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432, \u0434\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0442 Rollback\" title=\"\u0421\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432, \u0434\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0442 Rollback\" width=\"1350\" height=\"610\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/db1\/68c\/456\/db168c4561e05bffb5e3da166e0aeada.png\"\/><\/p>\n<div><figcaption>\u0421\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432, \u0434\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0442 Rollback<\/figcaption><\/div>\n<\/figure>\n<p>Jenkins Agent \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u043e\u0442\u043a\u0430\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 helm rollback \u0434\u043e \u0440\u0435\u0432\u0438\u0437\u0438\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c\u0443 \u043a\u043e\u043c\u043c\u0438\u0442\u0443.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/abf\/a9e\/2a5\/abfa9e2a5a7896ba605e6f50b944522e.png\" alt=\"\u041e\u0442\u043a\u0430\u0442 Rollback \u0434\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430\" title=\"\u041e\u0442\u043a\u0430\u0442 Rollback \u0434\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430\" width=\"1350\" height=\"200\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/abf\/a9e\/2a5\/abfa9e2a5a7896ba605e6f50b944522e.png\"\/><\/p>\n<div><figcaption>\u041e\u0442\u043a\u0430\u0442 Rollback \u0434\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430<\/figcaption><\/div>\n<\/figure>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 Single Sign-On (SSO) \u0432\u043e \u0432\u0441\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b Gitorion \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Keycloak. \u0421\u043f\u0430\u0441\u0438\u0431\u043e.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/801609\/\"> https:\/\/habr.com\/ru\/articles\/801609\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442 \u0432\u0441\u0435\u043c! \u0412 <a href=\"https:\/\/habr.com\/ru\/companies\/gitorion\/articles\/799933\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u043c\u044b \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044e \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 CI \u043d\u0430 \u0431\u0430\u0437\u0435 Gitea\/Forgejo \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 Gitorion. \u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u043c \u0432\u0430\u0448\u0435\u043c\u0443 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u044e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435\u043c \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 CD \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 Gitorion \u043d\u0430 \u0431\u0430\u0437\u0435 Jenkins.<\/p>\n<h2>Jenkins Agents<\/h2>\n<p>Jenkins \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0441\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u043e\u0432 \u0432 \u0430\u0433\u0435\u043d\u0442\u0430\u0445, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043a\u0430\u043a \u043c\u043e\u0434\u0443\u043b\u0438 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes \u043f\u043e Web-\u0445\u0443\u043a\u0443 \u0438\u0437 Gitea\/Forgejo. \u041d\u0438\u0436\u0435 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d \u043f\u0440\u0438\u043c\u0435\u0440 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 Jenkins, \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0449\u0438\u0445  \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u044b \u0434\u043b\u044f \u0432\u0435\u0442\u043e\u043a dev1, dev2, dev3 \u0438 main. \u041f\u043e\u0441\u043b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u043c\u043e\u0434\u0443\u043b\u044c \u0430\u0433\u0435\u043d\u0442\u0430 Jenkins \u0437\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442\u0441\u044f.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041c\u043e\u0434\u0443\u043b\u0438 \u0430\u0433\u0435\u043d\u0442\u043e\u0432 Jenkins \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes<\/figcaption><\/div>\n<\/figure>\n<p>\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043c\u043e\u0434\u0443\u043b\u044f \u0430\u0433\u0435\u043d\u0442\u0430 Jenkins \u0437\u0430\u0434\u0430\u043b\u0438 \u0432 Jenkinsfile. <\/p>\n<details class=\"spoiler\">\n<summary>Jenkinfile<\/summary>\n<div class=\"spoiler__content\">\n<p>pipeline {<\/p>\n<p>    agent {<br \/>        kubernetes {<br \/>            inheritFrom &#8216;build-service-pod&#8217;<br \/>            yaml &#171;&#187;&#187;<br \/>                apiVersion: v1<br \/>                kind: Pod<br \/>                metadata:<br \/>                  name: docker-in-docker<br \/>                  labels:<br \/>                    <a href=\"http:\/\/app.kubernetes.io\/component:\">app.kubernetes.io\/component:<\/a> jenkins-dind<br \/>                    <a href=\"http:\/\/app.kubernetes.io\/instance:\">app.kubernetes.io\/instance:<\/a> jenkins<br \/>                spec:<br \/>                  containers:<br \/>                     &#8212; name: docker-client<br \/>                         image: docker:23.0.1-alpine3.17<br \/>                         imagePullPolicy: IfNotPresent<br \/>                         env:<br \/>                           &#8212; name: DOCKER_HOST<br \/>                             value: tcp:\/\/dind.jenkins.svc.cluster.local:2375<br \/>            &#171;&#187;&#187;<br \/>     }<br \/> }<\/p>\n<\/div>\n<\/details>\n<p>\u0410\u0433\u0435\u043d\u0442 \u0432\u044b\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438\u0437 Gitea\/Forgejo \u043f\u043e Web-\u0445\u0443\u043a\u0443 \u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0441\u0442\u0430\u0434\u0438\u0438 \u043f\u0430\u0439\u043f\u043b\u0430\u043d\u0430 \u0432 Jenkinsfile.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Jenkins Agent \u0432\u044b\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u0442 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438\u0437 Gitea\/Forgejo<\/figcaption><\/div>\n<\/figure>\n<h2>Docker-in-Docker<\/h2>\n<p>\u0414\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 Docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes \u0441\u0435\u0440\u0432\u0438\u0441 Docker-in-Docker (dind) \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438 \u043a \u0430\u0433\u0435\u043d\u0442\u0430\u043c Jenkins. \u041a\u043e\u043c\u0430\u043d\u0434\u0430 docker build \u0432 \u0441\u0442\u0430\u0434\u0438\u0438 Build \u0441\u0431\u043e\u0440\u043a\u0438 Docker-\u043e\u0431\u0440\u0430\u0437\u0430 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 \u0432 \u043c\u043e\u0434\u0443\u043b\u0435 Docker-in-Docker.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Jenkins Agent \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442 Docker-\u043e\u0431\u0440\u0430\u0437 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430<\/figcaption><\/div>\n<\/figure>\n<h2>Docker Registry<\/h2>\n<p>\u0414\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0445 Docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Docker Registry. Jenkins Agent \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443 docker push \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 Docker-\u043e\u0431\u0440\u0430\u0437, \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 Build, \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Docker Registry. \u041d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 Kubernetes \u0440\u0435\u0441\u0443\u0440\u0441\u044b Deployment \u0438\u043b\u0438 StatefulSet \u0431\u0435\u0440\u0443\u0442 Docker-\u043e\u0431\u0440\u0430\u0437\u044b \u0438\u0437 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f Docker Registry \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 Docker-\u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u043e\u0432 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Jenkins Agent \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 Docker-\u043e\u0431\u0440\u0430\u0437 \u0432 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Docker Registry<\/figcaption><\/div>\n<\/figure>\n<h2>Multibranch Pipeline<\/h2>\n<p>\u0412 <a href=\"https:\/\/habr.com\/ru\/companies\/gitorion\/articles\/799933\/\">\u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u043f\u0440\u043e \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u0443\u044e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e CI \u043d\u0430 \u0431\u0430\u0437\u0435 Gitea\/Forgejo \u043c\u044b \u0443\u043f\u043e\u043c\u0438\u043d\u0430\u043b\u0438, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0432\u043d\u043e\u0441\u0438\u0442 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043a\u043e\u0434 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u0441\u0432\u043e\u0435\u0439 \u0432\u0435\u0442\u043a\u0438. \u0412 Jenkins \u0435\u0441\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0442\u0438\u043f\u0430 Multibranch Pipeline, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0435\u0442 \u043d\u043e\u0432\u044b\u0435 \u0432\u0435\u0442\u043a\u0438 \u0432 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0438\u0437 \u043d\u0438\u0445 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0432\u043e\u0439 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0442\u043a\u0443 \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c\u0438:<\/p>\n<pre><code>git checkout -b dev3 git push --set-upstream origin dev3<\/code><\/pre>\n<p>Gitea\/Forgejo \u043f\u043e\u0441\u044b\u043b\u0430\u0435\u0442 Web-\u0445\u0443\u043a \u0432 Jenkins. Jenkins \u043f\u043e Web-\u0445\u0443\u043a\u0443 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0445\u043e\u0434\u0438\u0442 \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0442\u043a\u0443 \u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0434\u043b\u044f \u043d\u0435\u0435 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>Multibranch Pipeline \u043d\u0430\u0448\u0435\u043b \u043d\u043e\u0432\u0443\u044e \u0432\u0435\u0442\u043a\u0443 dev3 \u0432 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u0434\u043b\u044f \u043d\u0435\u0435 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d<\/figcaption><\/div>\n<\/figure>\n<h2>C\u0442\u0430\u0434\u0438\u0438 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430<\/h2>\n<p>\u041d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u0438\u043c\u0435\u043d\u0438 \u0432\u0435\u0442\u043a\u0438, \u043f\u0435\u0440\u0432\u043e\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0441\u0442\u0430\u0434\u0438\u044f Build, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f Docker-\u043e\u0431\u0440\u0430\u0437 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0438 \u043f\u043e\u043c\u0435\u0449\u0430\u0435\u0442\u0441\u044f \u0432 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 Docker Registry. \u0414\u0430\u043b\u0435\u0435, \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0438\u0437 Web-\u0445\u0443\u043a\u0430 \u0438\u043c\u044f \u0432\u0435\u0442\u043a\u0438. \u0414\u043b\u044f \u0432\u0435\u0442\u043a\u0438 main \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0442\u0430\u0434\u0438\u044e Staging \u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441 \u0432 \u043a\u043e\u043d\u0442\u0443\u0440 Staging.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0421\u0442\u0430\u0434\u0438\u044f Staging<\/figcaption><\/div>\n<\/figure>\n<p>\u0414\u043b\u044f \u0432\u0441\u0435\u0445 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0445 \u0432\u0435\u0442\u043e\u043a \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u0441\u0442\u0430\u0434\u0438\u044e Review \u0438 \u0434\u0435\u043f\u043b\u043e\u0438\u0442 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441 \u0432 \u043a\u043e\u043d\u0442\u0443\u0440 Development.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0421\u0442\u0430\u0434\u0438\u044f Review<\/figcaption><\/div>\n<\/figure>\n<p>C\u0442\u0430\u0434\u0438\u0438 Staging \u0438 Review \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442 \u043e\u0434\u043d\u0438 \u0438 \u0442\u0435 \u0436\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b templates helm-\u0447\u0430\u0440\u0442\u0430 \u0432 Git-\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430, \u0447\u0442\u043e\u0431\u044b \u043d\u0430 Review \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u043b\u043e\u0441\u044c \u0442\u043e \u0436\u0435 \u0441\u0430\u043c\u043e\u0435, \u0447\u0442\u043e \u0438 \u043d\u0430 Staging \u0438 \u0432 Production. \u0412 helm-\u0447\u0430\u0440\u0442\u0435 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442\u0441\u044f \u0434\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f configs \u0441 \u043a\u043e\u043d\u0444\u0438\u0433\u0430\u043c\u0438 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043d\u0442\u0443\u0440\u0430 Development, Staging \u0438 Production.<\/p>\n<h2>\u0421\u0432\u044f\u0437\u044c \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 Gitea \u0441 \u0440\u0435\u0432\u0438\u0437\u0438\u044f\u043c\u0438 Helm<\/h2>\n<p>Jenkins Agent \u0432 \u043c\u043e\u043c\u0435\u043d\u0442 \u0434\u0435\u043f\u043b\u043e\u044f \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0432 Staging \u043a\u043e\u043d\u0442\u0443\u0440 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 SHA1 \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0438\u0437 Web-\u0445\u0443\u043a\u0430 Gitea\/Forgejo.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041a\u043e\u043c\u043c\u0438\u0442\u044b \u0432 Gitea\/Forgejo<\/figcaption><\/div>\n<\/figure>\n<p>\u041a\u0430\u0436\u0434\u044b\u0439 \u043d\u043e\u0432\u044b\u0439 \u0434\u0435\u043f\u043b\u043e\u0439 \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430 &#8212; \u044d\u0442\u043e \u043e\u0447\u0435\u0440\u0435\u0434\u043d\u0430\u044f \u0440\u0435\u0432\u0438\u0437\u0438\u044f helm. \u041c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043b\u0438 SHA1 \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u043a \u0438\u043c\u0435\u043d\u0430\u043c \u0440\u0435\u0432\u0438\u0437\u0438\u0439 helm, \u0442\u0435\u043c \u0441\u0430\u043c\u044b\u043c \u0441\u0432\u044f\u0437\u0430\u0432 SHA1 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u0441 \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438 \u0440\u0435\u0432\u0438\u0437\u0438\u0439 helm.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0421\u0432\u044f\u0437\u044c SHA1 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 Gitea\/Forgejo c \u043d\u043e\u043c\u0435\u0440\u0430\u043c\u0438 \u0440\u0435\u0432\u0438\u0437\u0438\u0439 helm<\/figcaption><\/div>\n<\/figure>\n<p>\u0422\u0430\u043a \u0436\u0435 SHA1 \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0442\u044d\u0433\u043e\u0432 \u043f\u0440\u0438 \u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u044f Docker-\u043e\u0431\u0440\u0430\u0437\u043e\u0432:<\/p>\n<p>      image: docker-registry.jenkins.svc.cluster.local\/owneruser\/backend\/main:bb7cfed40a<\/p>\n<h2>\u041f\u0440\u043e\u043c\u043e\u0443\u0448\u0435\u043d Promote \u0441\u043e Staging \u043d\u0430 Production<\/h2>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0432 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0438 Staging \u043d\u0430\u0440\u0430\u0431\u043e\u0442\u043e\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u043e\u0432 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0443, \u0442\u0438\u043c\u043b\u0438\u0434 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043f\u0440\u043e\u043c\u043e\u0443\u0448\u0435\u043d\u0430 Promote \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0441\u043e Staging \u043d\u0430 Production. \u041f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u0443:<\/p>\n<pre><code>helm history staging-owneruser-backend -n staging<\/code><\/pre>\n<p>\u0411\u0435\u0440\u0435\u0442 SHA1 \u043a\u043e\u043c\u043c\u0438\u0442\u0430, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0433\u043e \u0440\u0435\u0432\u0438\u0437\u0438\u0438, \u0443 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432 \u0441\u0442\u043e\u043b\u0431\u0446\u0435 STATUS \u0441\u0442\u043e\u0438\u0442 &#171;deployed&#187; (\u0441\u043c. \u0441\u043a\u0440\u0438\u043d \u0432\u044b\u0448\u0435). \u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0438\u0437 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u043e\u0433\u043e \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043e\u0431\u0440\u0430\u0437\u043e\u0432 Docker Registry Docker-\u043e\u0431\u0440\u0430\u0437, \u0442\u044d\u0433 \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u043a\u043e\u043c\u043c\u0438\u0442\u0443 \u0441\u043e \u0441\u0442\u0430\u0442\u0443\u0441\u043e\u043c &#171;deployed&#187;:<\/p>\n<p>      image: docker-registry.jenkins.svc.cluster.local\/owneruser\/backend\/main:74e5cbd967<\/p>\n<p>\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442  \u0432  Production \u043a\u043e\u043d\u0442\u0443\u0440. \u0421\u0442\u0430\u0434\u0438\u044f Build \u0438\u0433\u043d\u043e\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f, \u043f\u043e\u0441\u043a\u043e\u043b\u044c\u043a\u0443 \u0441\u0431\u043e\u0440\u043a\u0430 Docker-\u043e\u0431\u0440\u0430\u0437\u0430 \u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u043d\u0430 \u0441\u0442\u0430\u0434\u0438\u0438 \u043f\u0440\u043e\u043c\u043e\u0443\u0448\u0435\u043d\u0430 Promote.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0421\u0442\u0430\u0434\u0438\u044f \u043f\u0440\u043e\u043c\u043e\u0443\u0448\u0435\u043d\u0430 Promote \u0441\u043e Staging \u043d\u0430 Production<\/figcaption><\/div>\n<\/figure>\n<h2>\u041e\u0442\u043a\u0430\u0442 Rollback \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438<\/h2>\n<p>\u041d\u0430 \u0441\u043b\u0443\u0447\u0430\u0439, \u0435\u0441\u043b\u0438 \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439, \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u043e\u0442\u043a\u0430\u0442\u0430 Rollback \u043d\u0430 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0432\u0435\u0440\u0441\u0438\u0438. \u0427\u0442\u043e\u0431\u044b \u0438\u043c\u0435\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u043f\u0435\u0440\u0430\u0442\u0438\u0432\u043d\u043e \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0443 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0430, \u043f\u043e\u043a\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442\u044b \u0431\u0443\u0434\u0443\u0442 \u0438\u0441\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0448\u0438\u0431\u043a\u0443.<\/p>\n<p>\u0414\u043b\u044f \u043e\u0442\u043a\u0430\u0442\u0430 Rollback \u0442\u0438\u043c\u043b\u0438\u0434\u0443 \u043d\u0443\u0436\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f, \u0434\u043e \u043a\u0430\u043a\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0432 Gitea\/Forgejo \u043e\u043d \u0445\u043e\u0447\u0435\u0442 \u043e\u0442\u043a\u0430\u0442\u0438\u0442\u044c\u0441\u044f, \u0437\u0430\u0434\u0430\u0442\u044c SHA1 \u043a\u043e\u043c\u043c\u0438\u0442\u0430 \u0432 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u0445 \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d\u0430 \u0438 \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u0421\u043f\u0438\u0441\u043e\u043a \u043a\u043e\u043c\u043c\u0438\u0442\u043e\u0432, \u0434\u043e \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u043a\u0430\u0442 Rollback<\/figcaption><\/div>\n<\/figure>\n<p>Jenkins Agent \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442 \u043e\u0442\u043a\u0430\u0442 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439 helm rollback \u0434\u043e \u0440\u0435\u0432\u0438\u0437\u0438\u0438, \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0439 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c\u0443 \u043a\u043e\u043c\u043c\u0438\u0442\u0443.<\/p>\n<figure class=\"full-width\">\n<div><figcaption>\u041e\u0442\u043a\u0430\u0442 Rollback \u0434\u043e \u0437\u0430\u0434\u0430\u043d\u043d\u043e\u0433\u043e \u043a\u043e\u043c\u043c\u0438\u0442\u0430<\/figcaption><\/div>\n<\/figure>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0412 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0442\u043e\u043d\u043a\u043e\u0441\u0442\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0435\u0434\u0438\u043d\u043e\u0433\u043e \u0432\u0445\u043e\u0434\u0430 Single Sign-On (SSO) \u0432\u043e \u0432\u0441\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b Gitorion \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 Keycloak. \u0421\u043f\u0430\u0441\u0438\u0431\u043e.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/801609\/\"> https:\/\/habr.com\/ru\/articles\/801609\/<\/a><br \/><\/br><\/br><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-371328","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/371328","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=371328"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/371328\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=371328"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=371328"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=371328"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}