{"id":748,"date":"2025-02-28T18:44:49","date_gmt":"2025-02-28T16:44:49","guid":{"rendered":"https:\/\/olvas.dev\/?p=748"},"modified":"2025-02-28T18:44:50","modified_gmt":"2025-02-28T16:44:50","slug":"%d1%87%d0%b5%d1%82%d1%8b%d1%80%d0%b5-%d0%b2%d0%b0%d0%b6%d0%bd%d1%8b%d1%85-%d1%82%d0%b5%d1%81%d1%82%d0%b0-%d0%b4%d0%bb%d1%8f-apache-kafka-ci-cd-%d1%81-github-actions","status":"publish","type":"post","link":"https:\/\/olvas.dev\/?p=748","title":{"rendered":"\u0427\u0435\u0442\u044b\u0440\u0435 \u0432\u0430\u0436\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u0430 \u0434\u043b\u044f Apache Kafka CI\/CD \u0441 GitHub Actions"},"content":{"rendered":"\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 GitHub \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 Apache Kafka\u00ae (\u0430 \u043d\u0430 GitHub \u0431\u043e\u043b\u044c\u0448\u0435 70&nbsp;\u0442\u044b\u0441.&nbsp;<a href=\"https:\/\/github.com\/search?q=kafka\" target=\"_blank\" rel=\"noreferrer noopener\"><u>\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0445\u0441\u044f \u043a Kafka<\/u><\/a>), \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0432\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c Kafka \u0432 \u0441\u0432\u043e\u044e \u0441\u0440\u0435\u0434\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 GitOps. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b GitOps, \u0446\u0435\u043d\u043d\u043e\u0441\u0442\u044c \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u043a\u0438 (CI\/CD) \u0438 \u0432\u0430\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u0447\u043d\u044b\u0445 \u0441\u0440\u0435\u0434 (staging). \u0415\u0441\u043b\u0438 \u0447\u0442\u043e,&nbsp;<a href=\"https:\/\/www.gitops.tech\/\" target=\"_blank\" rel=\"noreferrer noopener\"><u>\u0432\u043e\u0442 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441<\/u><\/a>. \u041c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u044b GitOps \u043a \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u043c\u0443 \u0446\u0438\u043a\u043b\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Kafka \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e GitHub Actions&nbsp;\u2014 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u0435 \u0438 Confluent Cloud, \u0441\u043e Schema Registry \u0438 \u0431\u0435\u0437 \u043d\u0435\u0433\u043e, \u0438 \u0434\u043b\u044f \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u0438 \u0441\u0445\u0435\u043c\u044b.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"426\" src=\"https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/9f8c4d947dbd68be2e56aba4c634c486.jpg\" alt=\"\" class=\"wp-image-755\" srcset=\"https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/9f8c4d947dbd68be2e56aba4c634c486.jpg 640w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/9f8c4d947dbd68be2e56aba4c634c486-300x200.jpg?_mod=1740761081 300w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/figure>\n\n\n\n<p>\u041e\u0431\u044b\u0447\u043d\u043e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u044e\u0442 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u044b \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u044f\u0437\u044b\u043a\u0430 (<a href=\"https:\/\/junit.org\/\" target=\"_blank\" rel=\"noreferrer noopener\"><u>JUnit<\/u><\/a>,&nbsp;<a href=\"https:\/\/docs.pytest.org\/\" target=\"_blank\" rel=\"noreferrer noopener\"><u>pytest<\/u><\/a>&nbsp;\u0438 \u0442.&nbsp;\u0434.) \u0434\u043e \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430 \u043a\u043e\u0434\u0430 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0438\u043b\u0438 \u0442\u0435\u0441\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430\u0445 CI\/CD \u043f\u043e\u0441\u043b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0442\u0430. \u041d\u0430 \u043d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u0446\u0438\u043a\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u044b \u043f\u0440\u043e\u0441\u0442\u044b\u0435 \u0438 \u0431\u044b\u0441\u0442\u0440\u044b\u0435 \u0442\u0435\u0441\u0442\u044b:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/docs.confluent.io\/cloud\/current\/client-apps\/testing.html#unit-testing\" target=\"_blank\" rel=\"noreferrer noopener\"><u>\u041c\u043e\u0434\u0443\u043b\u044c\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b<\/u><\/a>\u00a0\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0431\u043b\u043e\u043a\u0438 \u043a\u043e\u0434\u0430 \u0431\u0435\u0437 \u0432\u043d\u0435\u0448\u043d\u0438\u0445 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439 \u0438\u043b\u0438 \u0441\u0432\u044f\u0437\u0435\u0439 \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430\u043c\u0438. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b \u0434\u043b\u044f \u043c\u043e\u0434\u0443\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 Kafka:\n<ul class=\"wp-block-list\">\n<li>MockProducer<\/li>\n\n\n\n<li>MockConsumer<\/li>\n\n\n\n<li>Rdkafka_mock<\/li>\n\n\n\n<li>TopologyTestDriver<\/li>\n\n\n\n<li>\u2026<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><a href=\"https:\/\/docs.confluent.io\/cloud\/current\/client-apps\/testing.html#integration-testing\" target=\"_blank\" rel=\"noreferrer noopener\"><u>\u0418\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0435 \u0442\u0435\u0441\u0442\u044b<\/u><\/a>\u00a0\u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044e\u0442 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u043c\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e:\n<ul class=\"wp-block-list\">\n<li>TestContainers<\/li>\n\n\n\n<li>EmbeddedKafkaCluster<\/li>\n\n\n\n<li>\u2026<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<p>\u041f\u0440\u043e\u0431\u043b\u0435\u043c\u0430 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432 \u044d\u0442\u0438\u0445 \u0442\u0435\u0441\u0442\u0430\u0445 \u043c\u044b \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u043c Kafka \u0438\u043b\u0438 \u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0435\u0439. \u041c\u044b \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440, \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u0438 \u043f\u043e \u0441\u0435\u0442\u0438, \u043d\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c, \u0441\u043b\u043e\u0436\u043d\u044b\u0435 \u0441\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u043e\u0442\u043a\u0430\u0437\u0430 \u0438\u043b\u0438 \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u044e \u0441\u0445\u0435\u043c\u044b. \u041d\u0430 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0437\u0434\u043d\u0438\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0430\u043a\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u044f \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043d\u0430 \u043d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0443\u0434\u0430\u043b\u0435\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u044f \u0432\u0441\u0435 \u0430\u0441\u043f\u0435\u043a\u0442\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c, \u0435\u0441\u043b\u0438 \u0443 \u0432\u0430\u0441 \u043d\u0435\u0442 \u0441\u0432\u043e\u0435\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 Kafka? \u0412\u043e\u0442 \u0431\u044b \u0431\u044b\u043b \u0441\u043f\u043e\u0441\u043e\u0431 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kafka \u0432 \u043e\u0431\u043b\u0430\u043a\u0435 \u0438 \u0431\u0435\u0441\u0448\u043e\u0432\u043d\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0441 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u043c GitHub\u2026<\/p>\n\n\n\n<p>\u0421\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e Kafka \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b CI\/CD: GitHub Actions, Jenkins, CircleCI, Travis CI \u0438 \u043c\u043d\u043e\u0433\u0438\u0435 \u0434\u0440\u0443\u0433\u0438\u0435. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 GitHub Actions, \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0431\u043e\u0447\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439. \u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0441\u0430\u043c\u043e\u043c\u0443 \u0438\u043b\u0438 \u0432\u0437\u044f\u0442\u044c \u043d\u0430 GitHub Marketplace. \u041c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0441\u0430\u043c\u043e\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435&nbsp;\u2014 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0442\u0430\u0439\u0442\u0435 \u0432&nbsp;<a href=\"https:\/\/docs.github.com\/en\/actions\" target=\"_blank\" rel=\"noreferrer noopener\"><u>\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043f\u043e GitHub Actions<\/u><\/a>. \u041c\u044b \u043c\u043e\u0436\u0435\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>\u0421\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u044b \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/li>\n\n\n\n<li>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<\/li>\n\n\n\n<li>\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043e\u0434 \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435.<\/li>\n\n\n\n<li>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u043e\u0432\u044b\u0445 \u0441\u0445\u0435\u043c.<\/li>\n<\/ul>\n\n\n\n<p>\u0412\u0435\u0441\u044c \u043a\u043e\u0434 \u0438\u0437 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0438\u0437\u0443\u0447\u0438\u0442\u044c \u043d\u0430&nbsp;<a href=\"https:\/\/github.com\/ybyzek\/kafka-github-actions\" target=\"_blank\" rel=\"noreferrer noopener\"><u>GitHub<\/u><\/a>&nbsp;\u0432 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u043c \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1560\" height=\"390\" src=\"https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/d6573850f53645122fab3d5ed0e5aca1.jpg\" alt=\"\" class=\"wp-image-750\" srcset=\"https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/d6573850f53645122fab3d5ed0e5aca1.jpg 1560w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/d6573850f53645122fab3d5ed0e5aca1-300x75.jpg?_mod=1740761080 300w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/d6573850f53645122fab3d5ed0e5aca1-1024x256.jpg?_mod=1740761081 1024w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/d6573850f53645122fab3d5ed0e5aca1-768x192.jpg?_mod=1740761080 768w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/d6573850f53645122fab3d5ed0e5aca1-1536x384.jpg?_mod=1740761081 1536w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/d6573850f53645122fab3d5ed0e5aca1-640x160.jpg?_mod=1740761081 640w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/d6573850f53645122fab3d5ed0e5aca1-1000x250.jpg?_mod=1740761081 1000w\" sizes=\"auto, (max-width: 1560px) 100vw, 1560px\" \/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f<\/h3>\n\n\n\n<p>\u041f\u0435\u0440\u0432\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435&nbsp;<a href=\"https:\/\/github.com\/ybyzek\/kafka-github-actions\/blob\/main\/.github\/workflows\/kafka-app.yml\" target=\"_blank\" rel=\"noreferrer noopener\"><u>\u0432 \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430<\/u><\/a>&nbsp;\u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0430\u0440\u0442\u0435\u0444\u0430\u043a\u0442, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0434\u043b\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0437\u0430\u0434\u0430\u043d\u0438\u0439 \u0432 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0435 CI\/CD. \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0437 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0433\u043e \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043a\u043e\u0434\u0430 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412 \u0441\u0430\u043c\u043e\u043c \u043f\u0440\u043e\u0441\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 build \u0434\u0435\u043b\u0430\u0435\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435 (\u043a\u043e\u043d\u0435\u0447\u043d\u043e, \u0432\u0441\u0435 \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>build:\n\n    runs-on: ubuntu-latest\n\n    permissions:\n      packages: write\n\n    steps:\n\n      - name: Checkout repository\n        uses: actions\/checkout@v3\n\n      - name: Log in to the GitHub Container Registry\n        uses: docker\/login-action@v2\n        with:\n          registry: ghcr.io\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Build and push Docker image for Kafka client app\n        uses: docker\/build-push-action@v3\n        with:\n          context: .\n          push: true\n          tags: ghcr.io\/${{ github.actor }}\/kafka-app:latest<\/code><\/pre>\n\n\n\n<p>\u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0448\u0430\u0433\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0442\u0441\u044f \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435 \u043d\u0430 GitHub Marketplace. \u041d\u0430\u043c \u0434\u0430\u0436\u0435 \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043e\u0434! \u0427\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u043a\u0430\u0436\u0434\u043e\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435?<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><a href=\"https:\/\/github.com\/marketplace\/actions\/checkout\" target=\"_blank\" rel=\"noreferrer noopener\"><u>actions\/checkout:<\/u><\/a>\u00a0\u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u043a\u043e\u0434 \u0438\u0437 \u044d\u0442\u043e\u0439 \u0432\u0435\u0442\u0432\u0438 \u0432 \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0440\u0430\u0431\u043e\u0447\u0435\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u043e, \u0433\u0434\u0435 \u0443 \u0437\u0430\u0434\u0430\u043d\u0438\u044f build \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043d\u0435\u043c\u0443. \u0411\u0435\u0437 \u044d\u0442\u043e\u0433\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u0435 build \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0432\u0435\u0442\u0432\u0438 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e.<\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/marketplace\/actions\/docker-login\" target=\"_blank\" rel=\"noreferrer noopener\"><u>docker\/login-action:<\/u><\/a>\u00a0\u0432\u0445\u043e\u0434\u0438\u0442 \u0432 GitHub Container Registry \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443\u00a0<a href=\"http:\/\/ghcr.io\/\" target=\"_blank\" rel=\"noreferrer noopener\">ghcr.io<\/a>\u00a0(\u0441 \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043d\u0438\u044f\u043c\u0438 \u043d\u0430 push \u043e\u0431\u0440\u0430\u0437\u043e\u0432), \u0445\u043e\u0442\u044f \u0441 \u0442\u0435\u043c \u0436\u0435 \u0443\u0441\u043f\u0435\u0445\u043e\u043c \u044d\u0442\u043e \u043c\u043e\u0433 \u0431\u044b\u0442\u044c \u0438 Docker Hub. \u0417\u0434\u0435\u0441\u044c \u043d\u0443\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u0430\u0440\u043e\u043b\u044c. \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043c\u044b \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u043c \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0441\u0430\u043c\u043e\u043c \u0444\u0430\u0439\u043b\u0435, \u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u00a0<a href=\"https:\/\/docs.github.com\/en\/actions\/security-guides\/automatic-token-authentication\" target=\"_blank\" rel=\"noreferrer noopener\"><u>\u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e \u043f\u043e \u0442\u043e\u043a\u0435\u043d\u0430\u043c<\/u><\/a>\u00a0\u0438 \u043f\u043e\u0434\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445.<\/li>\n\n\n\n<li><a href=\"https:\/\/github.com\/marketplace\/actions\/build-and-push-docker-images\" target=\"_blank\" rel=\"noreferrer noopener\"><u>docker\/build-push-action<\/u><\/a>: \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442, \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438 \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0437 Docker \u0432 GitHub Container Registry. \u041c\u044b \u043c\u043e\u0436\u0435\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0448\u0430\u0433\u0438 \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0432 Dockerfile \u0434\u043b\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f (\u043f\u0440\u0438\u043c\u0435\u0440\u00a0<a href=\"https:\/\/github.com\/ybyzek\/kafka-github-actions\/blob\/main\/Dockerfile\" target=\"_blank\" rel=\"noreferrer noopener\"><u>Dockerfile<\/u><\/a>\u00a0\u0434\u043b\u044f \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0433\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0430 Python).<\/li>\n<\/ol>\n\n\n\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u043e\u0431\u0440\u0430\u0437\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0438 \u0435\u0433\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0432 GitHub Container Registry \u0441\u0442\u043e\u0438\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0441\u0430\u043d\u0438\u0442\u0430\u0440\u043d\u043e\u0435 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0434\u0430\u0432\u0430\u0442\u044c \u0435\u0433\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u043f\u043e \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0443. \u0412 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u0430 \u043e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 Docker \u043c\u043e\u0436\u043d\u043e \u0441\u0441\u044b\u043b\u0430\u0442\u044c\u0441\u044f \u043f\u043e \u0442\u0435\u0433\u0443:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>ghcr.io\/${{ github.actor }}\/kafka-app:latest <\/code><\/pre>\n\n\n\n<p>\u0414\u0435\u043b\u0430\u0435\u043c \u043a\u043e\u0440\u043e\u0442\u043a\u0438\u0439 \u0441\u0430\u043d\u0438\u0442\u0430\u0440\u043d\u044b\u0439 \u0442\u0435\u0441\u0442 \u0432 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 Kafka \u0441&nbsp;<a href=\"https:\/\/github.com\/edenhill\/librdkafka\/blob\/master\/src\/rdkafka_mock.h\" target=\"_blank\" rel=\"noreferrer noopener\"><u>\u0438\u043c\u0438\u0442\u0430\u0446\u0438\u0435\u0439 rdkafka<\/u><\/a>&nbsp;\u0438\u0437 librdkafka. \u0412 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043a\u043b\u0438\u0435\u043d\u0442 Confluent Python, \u0430 \u0441\u0438\u043c\u0443\u043b\u044f\u0446\u0438\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 test.mock.num.brokers \u0432\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 (\u0441\u043c.&nbsp;<a href=\"https:\/\/github.com\/ybyzek\/kafka-github-actions\/blob\/main\/configs\/librdkafka.sanity.config\" target=\"_blank\" rel=\"noreferrer noopener\"><u>librdkafka.sanity.config<\/u><\/a>). \u041a\u0440\u0438\u0442\u0435\u0440\u0438\u0438 \u0443\u0441\u043f\u0435\u0445\u0430 \u0441\u0430\u043d\u0438\u0442\u0430\u0440\u043d\u044b\u0445 \u0442\u0435\u0441\u0442\u043e\u0432 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u043b\u043e\u0433\u0438\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u2026..\n\n      - name: Run Kafka client app unit test\n        run: |\n          docker run -t \\\n                 -v ${DEST_WORKSPACE}\/configs\/librdkafka.sanity.config:\/etc\/librdkafka.config \\\n                 --name my-kafka-app --rm ghcr.io\/${{ github.actor }}\/kafka-app:latest \\\n                 bash -c '\/usr\/bin\/producer.py -f \/etc\/librdkafka.config -t t1'<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438<\/h3>\n\n\n\n<p>\u041f\u043e\u0441\u043b\u0435 \u0441\u0430\u043d\u0438\u0442\u0430\u0440\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 \u0440\u0435\u0430\u043b\u044c\u043d\u043e\u043c \u0431\u0440\u043e\u043a\u0435\u0440\u0435 Kafka.&nbsp;<a href=\"https:\/\/docs.confluent.io\/platform\/current\/tutorials\/build-your-own-demos.html?utm_source=github&amp;utm_medium=demo&amp;utm_campaign=ch.examples_type.community_content.cp-all-in-one#cp-all-in-one\" target=\"_blank\" rel=\"noreferrer noopener\"><u>cp-all-in-one<\/u><\/a>&nbsp;\u043e\u0442 Confluent&nbsp;\u2014 \u044d\u0442\u043e \u0444\u0430\u0439\u043b Docker Compose, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u043d\u0430 GitHub, \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043f\u043e\u043b\u043d\u043e\u0446\u0435\u043d\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 Confluent Platorm \u0438 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0446\u0435\u043b\u0438. \u041d\u0430 Marketplace \u0435\u0441\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0449\u0435\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435,&nbsp;<a href=\"https:\/\/github.com\/marketplace\/actions\/run-kafka-with-confluent-cp-all-in-one\" target=\"_blank\" rel=\"noreferrer noopener\"><u>cp-all-in-one-action<\/u><\/a>, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0438\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u0442 \u0444\u0430\u0439\u043b Docker Compose \u0438 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442 \u0432\u0441\u0435 \u0438\u043b\u0438 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0431\u0440\u043e\u043a\u0435\u0440.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1434\" height=\"296\" src=\"https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/dd3a824ec932d49299018702b8706620.jpg\" alt=\"\" class=\"wp-image-754\" srcset=\"https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/dd3a824ec932d49299018702b8706620.jpg 1434w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/dd3a824ec932d49299018702b8706620-300x62.jpg?_mod=1740761081 300w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/dd3a824ec932d49299018702b8706620-1024x211.jpg?_mod=1740761082 1024w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/dd3a824ec932d49299018702b8706620-768x159.jpg?_mod=1740761081 768w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/dd3a824ec932d49299018702b8706620-640x132.jpg?_mod=1740761081 640w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/dd3a824ec932d49299018702b8706620-1000x206.jpg?_mod=1740761082 1000w\" sizes=\"auto, (max-width: 1434px) 100vw, 1434px\" \/><\/figure>\n\n\n\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0434\u0436\u043e\u0431 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 \u044d\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432 GitHub Actions, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0431\u0440\u043e\u043a\u0435\u0440 Kafka. \u041d\u0430 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f Docker \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442 &#8212;net workspace_default \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0441\u0435\u0442\u0438 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440\u0430 Docker, \u0447\u0442\u043e\u0431\u044b \u043a\u043b\u0438\u0435\u043d\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0431\u0440\u043e\u043a\u0435\u0440\u0443. \u0412\u0445\u043e\u0434\u043d\u043e\u0439 \u0444\u0430\u0439\u043b \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438 (\u0441\u043c.&nbsp;<a href=\"https:\/\/github.com\/ybyzek\/kafka-github-actions\/blob\/main\/configs\/librdkafka.local.config\" target=\"_blank\" rel=\"noreferrer noopener\"><u>librdkafka.local.config<\/u><\/a>) \u0437\u0430\u0434\u0430\u0435\u0442 \u043a\u043e\u043d\u0442\u0435\u0439\u043d\u0435\u0440 \u0431\u0440\u043e\u043a\u0435\u0440\u0430 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438. \u041a\u0430\u043a \u0438 \u0432 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435, \u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0438 \u0443\u0441\u043f\u0435\u0445\u0430 \u0437\u0430\u0432\u0438\u0441\u044f\u0442 \u043e\u0442 \u043b\u043e\u0433\u0438\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u2026\n\n      - name: Run Confluent Platform (Confluent Server)\n        uses: ybyzek\/cp-all-in-one-action@v0.2.1\n        with:\n          service: broker\n\n      - name: Run Kafka client app to local cluster\n        run: |\n          docker run -t \\\n                 -v ${DEST_WORKSPACE}\/configs\/librdkafka.local.config:\/etc\/librdkafka.config \\\n                 --net workspace_default \\\n                 --name my-kafka-app --rm ghcr.io\/${{ github.actor }}\/kafka-app:latest \\\n                 bash -c '\/usr\/bin\/producer.py -f \/etc\/librdkafka.config -t t1'<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435<\/h2>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"992\" height=\"310\" src=\"https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/69c650ef2a0d758351fbc462cd6666d4.jpg\" alt=\"\" class=\"wp-image-751\" srcset=\"https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/69c650ef2a0d758351fbc462cd6666d4.jpg 992w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/69c650ef2a0d758351fbc462cd6666d4-300x94.jpg?_mod=1740761080 300w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/69c650ef2a0d758351fbc462cd6666d4-768x240.jpg?_mod=1740761081 768w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/69c650ef2a0d758351fbc462cd6666d4-640x200.jpg?_mod=1740761081 640w\" sizes=\"auto, (max-width: 992px) 100vw, 992px\" \/><\/figure>\n\n\n\n<p>\u042d\u0442\u043e \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e \u0446\u0435\u043d\u043d\u043e, \u0435\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 \u043f\u043e\u0434\u0445\u043e\u0434 GitOps \u0441 \u043c\u043e\u0434\u0435\u043b\u044c\u044e \u00ab\u0441\u0440\u0435\u0434\u0430 \u043a\u0430\u043a \u043a\u043e\u0434\u00bb, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0432\u0435\u0442\u0432\u0438 GitHub \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442 \u043a\u0430\u043d\u043e\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a \u0438\u0441\u0442\u0438\u043d\u044b, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0439 \u0440\u0430\u0437\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u044b, \u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u043d\u043e\u0441\u0438\u0442\u044c \u0438\u0437 \u043e\u0434\u043d\u043e\u0439 \u0441\u0440\u0435\u0434\u044b \u0432 \u0434\u0440\u0443\u0433\u0443\u044e \u043f\u043e \u043c\u0435\u0440\u0435 \u043f\u0440\u043e\u0445\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043e\u043a. \u0420\u0430\u0431\u043e\u0447\u0438\u0435 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u043c \u0441\u043e\u0431\u044b\u0442\u0438\u0435\u043c, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043e\u043c\u043c\u0438\u0442\u0430, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0438\u043b\u0438 \u0441\u043b\u0438\u044f\u043d\u0438\u0435 \u043f\u0443\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u0430 \u0438 \u0442.&nbsp;\u0434. \u0422\u0430\u043a \u043a\u043e\u043c\u043c\u0438\u0442 \u0432 \u0432\u0435\u0442\u0432\u044c \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u0441\u0442 \u0432 \u0441\u0440\u0435\u0434\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0443\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u0430 \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u0432\u0435\u0442\u0432\u0438 \u043c\u043e\u0436\u0435\u0442 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 \u0441\u0442\u0435\u0439\u0434\u0436\u0438\u043d\u0433\u0435, \u0430 \u0441\u043b\u0438\u044f\u043d\u0438\u0435 \u043f\u0443\u043b-\u0440\u0435\u043a\u0432\u0435\u0441\u0442\u0430 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0432\u0435\u0441\u0442\u0438 \u043a \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044e \u0432 \u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d.<\/p>\n\n\n\n<p>\u0412 \u043b\u044e\u0431\u043e\u0439 \u0441\u0440\u0435\u0434\u0435 \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0437\u0430\u0449\u0438\u0449\u0430\u0442\u044c \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c, \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Confluent Cloud. \u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0435 \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043a\u043e\u0434\u043e\u0432\u043e\u0439 \u0431\u0430\u0437\u0435, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u043d\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 GitHub. \u0425\u0440\u0430\u043d\u0438\u0442\u0435 \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u043e \u043a\u0430\u043a&nbsp;<a href=\"https:\/\/docs.github.com\/en\/actions\/security-guides\/encrypted-secrets\" target=\"_blank\" rel=\"noreferrer noopener\"><u>\u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u043a\u0440\u0435\u0442\u044b<\/u><\/a>&nbsp;\u2014 \u044d\u0442\u043e \u0444\u0443\u043d\u043a\u0446\u0438\u044f GitHub, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 sealed box \u0434\u043b\u044f \u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u0447\u0451\u0442\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0435\u0449\u0451 \u0434\u043e \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 GitHub \u0438 \u0445\u0440\u0430\u043d\u0438\u0442 \u0438\u0445 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c\u0438 \u0434\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435.<\/p>\n\n\n\n<p>\u0427\u0442\u043e\u0431\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u043e\u0433\u043b\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a Confluent Cloud, \u0435\u043c\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043a\u043b\u044e\u0447, \u0441\u0435\u043a\u0440\u0435\u0442 \u0438 bootstrap-server.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1554\" height=\"475\" src=\"https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/e0e13d970832d881b6b02b228062b281.jpg\" alt=\"\" class=\"wp-image-752\" srcset=\"https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/e0e13d970832d881b6b02b228062b281.jpg 1554w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/e0e13d970832d881b6b02b228062b281-300x92.jpg?_mod=1740761081 300w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/e0e13d970832d881b6b02b228062b281-1024x313.jpg?_mod=1740761082 1024w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/e0e13d970832d881b6b02b228062b281-768x235.jpg?_mod=1740761081 768w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/e0e13d970832d881b6b02b228062b281-1536x469.jpg?_mod=1740761082 1536w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/e0e13d970832d881b6b02b228062b281-640x196.jpg?_mod=1740761082 640w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/e0e13d970832d881b6b02b228062b281-1000x306.jpg?_mod=1740761082 1000w\" sizes=\"auto, (max-width: 1554px) 100vw, 1554px\" \/><\/figure>\n\n\n\n<p>\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u043c \u0441\u0435\u043a\u0440\u0435\u0442\u044b \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 \u0441\u0440\u0435\u0434\u044b \u0432 \u0440\u0430\u0431\u043e\u0447\u0435\u043c \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0435.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u2026.\n\nenv:\n  CONFLUENT_BOOTSTRAP_SERVERS: ${{ secrets.CONFLUENT_BOOTSTRAP_SERVERS }}\n  CONFLUENT_API_KEY: ${{ secrets.CONFLUENT_API_KEY }}\n  CONFLUENT_API_SECRET: ${{ secrets.CONFLUENT_API_SECRET }}<\/code><\/pre>\n\n\n\n<p>\u0427\u0442\u043e\u0431\u044b \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u043e\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 Kafka \u043c\u043e\u0433\u043b\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435, \u0438\u0445 \u043d\u0443\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u044b \u0438 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430 \u043d\u0438\u0445 \u0432\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435, \u043f\u0435\u0440\u0435\u0434\u0430\u043d\u043d\u043e\u043c \u0432 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041d\u0435 \u0437\u0430\u0431\u044b\u0432\u0430\u0439\u0442\u0435, \u0447\u0442\u043e \u044d\u0442\u043e \u0447\u0443\u0432\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043c\u044b \u043d\u0435 \u0445\u0440\u0430\u043d\u0438\u043c \u0432 \u043a\u043e\u0434\u0435 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0444\u0430\u0439\u043b, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440,&nbsp;<a href=\"https:\/\/github.com\/ybyzek\/kafka-github-actions\/blob\/main\/configs\/librdkafka.ccloud.config\" target=\"_blank\" rel=\"noreferrer noopener\"><u>librdkafka.ccloud.config<\/u><\/a>, \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e \u0438\u043c\u0435\u043d\u0430\u043c \u0437\u0430\u0434\u0430\u043d\u043d\u044b\u0445 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0441\u0440\u0435\u0434\u044b. \u0415\u0441\u043b\u0438 \u043c\u044b \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u043e\u0434 \u0432 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438 GitHub, \u0443\u0432\u0438\u0434\u0438\u043c \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u0435\u043d\u0430 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445, \u043d\u043e \u043d\u0435 \u0438\u0445 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>bootstrap.servers=${CONFLUENT_BOOTSTRAP_SERVERS}\nsecurity.protocol=SASL_SSL\nsasl.mechanisms=PLAIN\nsasl.username=${CONFLUENT_API_KEY}\nsasl.password=${CONFLUENT_API_SECRET}<\/code><\/pre>\n\n\n\n<p>\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u043d\u0438\u044f \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435&nbsp;<a href=\"https:\/\/github.com\/marketplace\/actions\/replace_envs\" target=\"_blank\" rel=\"noreferrer noopener\"><u>franzbischoff\/replace_envs<\/u><\/a>&nbsp;\u043f\u043e\u0434\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u044d\u0442\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043d\u0430 \u043c\u0435\u0441\u0442\u0435, \u0438 \u0440\u0430\u0437 \u043e\u043d\u0438 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u043a\u0430\u043a \u0441\u0435\u043a\u0440\u0435\u0442\u044b, \u0432 \u043b\u043e\u0433\u0430\u0445 \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u0430 \u043c\u044b \u0438\u0445 \u043d\u0435 \u0443\u0432\u0438\u0434\u0438\u043c.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>- uses: franzbischoff\/replace_envs@v1\n        with:\n          from_file: 'configs\/librdkafka.ccloud.config'\n          to_file: 'configs\/librdkafka.ccloud.config'\n          commit: 'false'<\/code><\/pre>\n\n\n\n<p>\u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0432 Confluent Cloud, \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u0434\u043e\u043b\u0436\u043d\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0443\u0436\u043d\u044b\u0439 \u0432\u0445\u043e\u0434\u043d\u043e\u0439 \u0444\u0430\u0439\u043b, \u0438\u043d\u0430\u0447\u0435 \u043e\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0442\u044c\u0441\u044f \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u0440\u0430\u043d\u044c\u0448\u0435.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>- name: Run Kafka client app to Confluent Cloud\n        run: |\n          docker run -t \\\n                 -v ${DEST_WORKSPACE}\/configs\/librdkafka.ccloud.config:\/etc\/librdkafka.config \\\n                 --name my-kafka-app --rm ghcr.io\/${{ github.actor }}\/kafka-app:latest \\\n                 bash -c '\/usr\/bin\/producer.py -f \/etc\/librdkafka.config -t t1'<\/code><\/pre>\n\n\n\n<p>\u041a\u043e\u0433\u0434\u0430 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0430 Python \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 Confluent Cloud, \u043c\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c, \u0447\u0442\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u044b \u0438 \u0438\u0445 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e \u0434\u0435\u0441\u0435\u0440\u0438\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c. \u042d\u0442\u043e \u0431\u044b\u043b\u043e \u0431\u044b \u043f\u0440\u043e\u0449\u0435, \u0435\u0441\u043b\u0438 \u0431\u044b \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435-\u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440, \u043d\u043e \u0438\u043d\u043e\u0433\u0434\u0430 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e Confluent CLI. \u0427\u0442\u043e\u0431\u044b \u0432\u043e\u0439\u0442\u0438 \u0432 CLI, \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0432\u0432\u043e\u0434\u0438\u0442 \u0430\u0434\u0440\u0435\u0441 \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b \u0438 \u043f\u0430\u0440\u043e\u043b\u044c, \u0430 \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 CI\/CD? \u0414\u043b\u044f \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 context, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u0430 \u0431\u0435\u0437 \u0432\u0445\u043e\u0434\u0430. \u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u043f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 \u043e\u0431\u0440\u0430\u0437 Docker \u0441 Confluent CLI, \u0441\u043e\u0437\u0434\u0430\u0451\u0442 \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u043d\u043e\u0432\u044b\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u0430 \u043f\u043e\u0442\u043e\u043c \u043f\u043e\u0442\u0440\u0435\u0431\u043b\u044f\u0435\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 (\u043a\u0440\u0438\u0442\u0435\u0440\u0438\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u0433\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0441\u043d\u043e\u0432\u0430 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0432\u0438\u0441\u0435\u0442\u044c \u043e\u0442 \u043b\u043e\u0433\u0438\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f):<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>docker run -t \\\n       -e CONFLUENT_BOOTSTRAP_SERVERS=${CONFLUENT_BOOTSTRAP_SERVERS} \\\n       -e CONFLUENT_API_KEY=${CONFLUENT_API_KEY} \\\n       -e CONFLUENT_API_SECRET=${CONFLUENT_API_SECRET} \\\n       --name confluent-cli confluentinc\/confluent-cli:2.16.0 \\\n       bash -c 'confluent context create context-test \\\n             --bootstrap ${CONFLUENT_BOOTSTRAP_SERVERS} \\\n             --api-key ${CONFLUENT_API_KEY} \\\n             --api-secret ${CONFLUENT_API_SECRET} &amp;&amp; \\\n             confluent context use context-test &amp;&amp; \\\n             timeout 10s confluent kafka topic consume -b t1\u2019<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438 \u043d\u043e\u0432\u044b\u0445 \u0441\u0445\u0435\u043c<\/h3>\n\n\n\n<p>\u0415\u0441\u043b\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0451\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0442\u0440\u0435\u0431\u0443\u044e\u0442\u0441\u044f \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u0444\u043e\u0440\u043c\u0430\u0442\u0435 Avro, JSON \u0438\u043b\u0438 Protobuf, \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043d\u0443\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0447\u0435\u0440\u0435\u0437 Schema Registry.<\/p>\n\n\n\n<p>\u0414\u043b\u044f \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u0440\u0430\u043d\u043d\u0438\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u0441\u043d\u043e\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 cp-all-in-one, \u043d\u043e \u0443\u043a\u0430\u0436\u0438\u0442\u0435 service: schema-registry, \u0447\u0442\u043e\u0431\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Schema Registry. \u0414\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0430 \u043f\u043e\u0437\u0434\u043d\u0438\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u0433\u043e Schema Registry \u0432 Confluent Cloud \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0432 GitHub \u0434\u0432\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0437\u0430\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0435\u043a\u0440\u0435\u0442\u0430: URL \u0438 \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 Schema Registry.<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img loading=\"lazy\" decoding=\"async\" width=\"1554\" height=\"748\" src=\"https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/de534ba4d5575bb01f2140dd6393aad0.jpg\" alt=\"\" class=\"wp-image-753\" srcset=\"https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/de534ba4d5575bb01f2140dd6393aad0.jpg 1554w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/de534ba4d5575bb01f2140dd6393aad0-300x144.jpg?_mod=1740761081 300w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/de534ba4d5575bb01f2140dd6393aad0-1024x493.jpg?_mod=1740761083 1024w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/de534ba4d5575bb01f2140dd6393aad0-768x370.jpg?_mod=1740761082 768w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/de534ba4d5575bb01f2140dd6393aad0-1536x739.jpg?_mod=1740761082 1536w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/de534ba4d5575bb01f2140dd6393aad0-640x308.jpg?_mod=1740761082 640w, https:\/\/olvas.dev\/wp-content\/uploads\/2025\/02\/de534ba4d5575bb01f2140dd6393aad0-1000x481.jpg?_mod=1740761083 1000w\" sizes=\"auto, (max-width: 1554px) 100vw, 1554px\" \/><\/figure>\n\n\n\n<p>\u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u0442\u0435 \u0436\u0435 \u0448\u0430\u0433\u0438, \u0447\u0442\u043e \u0438 \u0440\u0430\u043d\u044c\u0448\u0435, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0434\u0430\u0442\u044c \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0441\u0440\u0435\u0434\u044b \u0438 \u0432\u044b\u0437\u0432\u0430\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0434\u043b\u044f \u0437\u0430\u043c\u0435\u043d\u044b \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432\u043e \u0432\u0445\u043e\u0434\u043d\u043e\u043c \u0444\u0430\u0439\u043b\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438. \u041d\u043e\u0432\u043e\u0435 \u0437\u0430\u0434\u0430\u043d\u0438\u0435 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u0440\u0435\u0430\u043b\u044c\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u0432 Schema Registry \u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435 Avro, JSON \u0438\u043b\u0438 Protobuf.<\/p>\n\n\n\n<p>\u0410 \u0447\u0442\u043e \u0435\u0441\u043b\u0438 \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u0440\u0443 \u043c\u0435\u0441\u044f\u0446\u0435\u0432 \u0431\u0438\u0437\u043d\u0435\u0441-\u0442\u0440\u0435\u0431\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u0441\u044f \u0438 \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0441\u0445\u0435\u043c\u0443 \u043d\u043e\u0432\u044b\u0435 \u043f\u043e\u043b\u044f \u0438\u043b\u0438 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0438\u043c\u0435\u044e\u0449\u0438\u0435\u0441\u044f? \u0422\u0430\u043a\u0430\u044f&nbsp;<a href=\"https:\/\/docs.confluent.io\/platform\/current\/schema-registry\/avro.html\" target=\"_blank\" rel=\"noreferrer noopener\"><u>\u044d\u0432\u043e\u043b\u044e\u0446\u0438\u044f \u0441\u0445\u0435\u043c\u044b<\/u><\/a>&nbsp;\u043e\u0436\u0438\u0434\u0430\u0435\u043c\u0430, \u044d\u0442\u043e \u0447\u0430\u0441\u0442\u044c \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0446\u0438\u043a\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438, \u043d\u043e \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u044b CI\/CD \u0434\u043e\u043b\u0436\u043d\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c, \u0447\u0442\u043e \u043d\u043e\u0432\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u0430 \u0441\u043e \u0441\u0442\u0430\u0440\u043e\u0439, \u043f\u0440\u0435\u0436\u0434\u0435 \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0432\u043e\u0434\u0438\u0442\u044c \u0435\u0435 \u043d\u0430 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u044d\u0442\u0430\u043f. \u0418\u043d\u0430\u0447\u0435&nbsp;<a href=\"https:\/\/www.confluent.io\/blog\/schemas-contracts-compatibility\/\" target=\"_blank\" rel=\"noreferrer noopener\"><u>\u043a\u043e\u043d\u0442\u0440\u0430\u043a\u0442<\/u><\/a>&nbsp;\u043c\u0435\u0436\u0434\u0443 \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u0430\u043c\u0438 \u0438 \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u0430\u043c\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0430\u0440\u0443\u0448\u0435\u043d, \u0438 \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u044b \u043d\u0435 \u0441\u043c\u043e\u0433\u0443\u0442 \u0447\u0438\u0442\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435, \u0437\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0435 \u043f\u0440\u043e\u0434\u044e\u0441\u0435\u0440\u0430\u043c\u0438.<\/p>\n\n\n\n<p>\u0412 Schema Registry \u0435\u0441\u0442\u044c&nbsp;<a href=\"https:\/\/docs.confluent.io\/platform\/current\/schema-registry\/develop\/using.html#test-compatibility-of-a-schema-with-the-latest-schema-under-subject-kafka-value\" target=\"_blank\" rel=\"noreferrer noopener\"><u>REST API<\/u><\/a>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u0434\u043e\u0431\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0438\u0437 \u043a\u043e\u043c\u0430\u043d\u0434\u043d\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u0438, \u043d\u043e \u0441\u0443\u0449\u0435\u0441\u0442\u0432\u0443\u044e\u0442 \u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u044f\u0437\u044b\u043a\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043b\u0443\u0447\u0448\u0435 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0434\u043b\u044f \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432 Python \u0435\u0441\u0442\u044c \u043f\u0430\u043a\u0435\u0442 \u0434\u043b\u044f \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u0438&nbsp;<a href=\"https:\/\/docs.confluent.io\/platform\/current\/clients\/confluent-kafka-python\/html\/_modules\/confluent_kafka\/schema_registry\/schema_registry_client.html\" target=\"_blank\" rel=\"noreferrer noopener\">schema_registry_client.test_compatibility()<\/a>, \u043a\u0430\u043a \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432&nbsp;<a href=\"https:\/\/github.com\/ybyzek\/kafka-github-actions\/blob\/main\/src\/test_schema_compatibility.py#L52\" target=\"_blank\" rel=\"noreferrer noopener\"><u>\u044d\u0442\u043e\u043c \u043a\u043e\u0434\u0435<\/u><\/a>. \u042d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043a\u043e\u0434 Python, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0442\u0430\u043a \u0436\u0435, \u043a\u0430\u043a \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0435 \u0434\u0436\u043e\u0431\u044b. \u0412 Java \u0435\u0441\u0442\u044c \u0441\u0445\u043e\u0436\u0438\u0439 \u043c\u0435\u0442\u043e\u0434,&nbsp;<a href=\"https:\/\/github.com\/confluentinc\/schema-registry\/blob\/master\/client\/src\/main\/java\/io\/confluent\/kafka\/schemaregistry\/client\/SchemaRegistryClient.java#L171\" target=\"_blank\" rel=\"noreferrer noopener\"><u>SchemaRegistryClient.testCompatibility()<\/u><\/a>, \u0438\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0446\u0435\u043b\u044c test-compatibility \u0432&nbsp;<a href=\"https:\/\/docs.confluent.io\/platform\/current\/schema-registry\/develop\/maven-plugin.html\" target=\"_blank\" rel=\"noreferrer noopener\"><u>maven-\u043f\u043b\u0430\u0433\u0438\u043d\u0435 Schema Registry<\/u><\/a>, \u043a\u0430\u043a \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e \u0432&nbsp;<a href=\"https:\/\/github.com\/ybyzek\/kafka-github-actions\/blob\/main\/pom.xml\" target=\"_blank\" rel=\"noreferrer noopener\"><u>\u044d\u0442\u043e\u043c pom.xml<\/u><\/a>. \u041f\u043b\u0430\u0433\u0438\u043d \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0432 \u0434\u0436\u043e\u0431\u0435:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>\u2026\n\n      - name: Set up JDK 11\n        uses: actions\/setup-java@v2\n        with:\n          java-version: '11'\n          distribution: 'temurin'\n          cache: maven\n\n      - name: Test compatibility of a new schema\n        run: |\n          # Pass\n          mvn io.confluent:kafka-schema-registry-maven-plugin:test-compatibility \\\n            \"-DschemaRegistryUrl=$CONFLUENT_SCHEMA_REGISTRY_URL\" \\                                  \n      \"-DschemaRegistryBasicAuthUserInfo=$CONFLUENT_BASIC_AUTH_USER_INFO\" \\\n            \"-DnewSchema=schemas\/Count-new.avsc\"<\/code><\/pre>\n\n\n\n<p>\u042d\u0442\u043e\u0442 \u043a\u043e\u0434 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u043d\u043e\u0432\u043e\u0439 \u0441\u0445\u0435\u043c\u044b (\u0432 \u044d\u0442\u043e\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u043d\u043e\u0432\u0430\u044f \u0441\u0445\u0435\u043c\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0430 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0432 \u0444\u0430\u0439\u043b\u0435 schemas\/Count-new.avsc) \u0441\u043e \u0441\u0445\u0435\u043c\u043e\u0439, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0432\u044f\u0437\u0430\u043d\u0430 \u0441 \u0443\u0436\u0435 \u0437\u0430\u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u043e\u043c, \u0442\u0430\u043a \u0447\u0442\u043e \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a Schema Registry \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0430 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0447\u0435\u0442\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445. \u0412 Confluent Platform \u0432\u0435\u0440\u0441\u0438\u0438 7.2.0 \u0438 \u0432\u044b\u0448\u0435 \u0435\u0441\u0442\u044c \u0446\u0435\u043b\u044c test-local-compatibility, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0445\u0440\u0430\u043d\u044f\u0449\u0438\u043c\u0438\u0441\u044f \u0441\u0445\u0435\u043c\u0430\u043c\u0438, \u0435\u0451 \u0442\u0430\u043a\u0436\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0441\u0430\u043d\u0438\u0442\u0430\u0440\u043d\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430 \u043d\u0430 \u0440\u0430\u043d\u043d\u0438\u0445 \u044d\u0442\u0430\u043f\u0430\u0445 \u0446\u0438\u043a\u043b\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u0436\u0435 \u0431\u0435\u0437 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0441\u0445\u0435\u043c\u044b.<\/p>\n\n\n\n<p>\u0423 \u043d\u0430\u0441 \u0443\u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043d\u0435\u043f\u043b\u043e\u0445\u043e\u0439 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440! \u041a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u043c\u044b \u0444\u0438\u043a\u0441\u0438\u0440\u0443\u0435\u043c \u043a\u043e\u0434, \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 Confluent Cloud, \u0438 \u043a\u0430\u0436\u0434\u044b\u0439 \u0440\u0430\u0437, \u043a\u043e\u0433\u0434\u0430 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u044d\u0432\u043e\u043b\u044e\u0446\u0438\u044f \u0441\u0445\u0435\u043c\u044b, \u0440\u0430\u0431\u043e\u0447\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0445\u0435\u043c\u044b \u0441 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u0439 \u0432\u0435\u0440\u0441\u0438\u0435\u0439.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f<\/h3>\n\n\n\n<p>\u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438, \u043a\u0430\u043a \u043f\u0440\u0435\u043e\u0431\u0440\u0430\u0437\u043e\u0432\u0430\u0442\u044c \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043b\u0438\u0435\u043d\u0442\u0441\u043a\u0438\u0445 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 Kafka \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e GitHub Actions \u0438 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u0430 CI\/CD: \u043c\u044b \u0441\u043e\u0437\u0434\u0430\u043b\u0438 \u043e\u0431\u0440\u0430\u0437 Docker \u0441 \u043a\u043e\u0434\u043e\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b\u0438 \u0435\u0433\u043e \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e cp-all-in-one \u0438 \u0432 Confluent Cloud, \u0430 \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u043b\u0438 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u043d\u0443\u044e \u0441\u0445\u0435\u043c\u0443 \u043d\u0430 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c. \u0422\u0435\u043f\u0435\u0440\u044c \u043c\u043e\u0436\u043d\u043e \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u0442\u044c \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440 \u0432 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0438\u0438 \u0441 \u043d\u0430\u0448\u0438\u043c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435\u043c \u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c GitHub Actions \u0434\u043b\u044f \u0437\u0430\u0434\u0430\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u044e\u0442\u0441\u044f \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0431\u043e\u0442\u0430\u043c\u0438, \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u0430\u043c\u0438, \u0434\u043b\u044f \u0443\u0432\u0435\u0434\u043e\u043c\u043b\u0435\u043d\u0438\u0439 \u0438 \u0442.&nbsp;\u0434.<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 GitHub \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 Apache Kafka\u00ae (\u0430 \u043d\u0430 GitHub \u0431\u043e\u043b\u044c\u0448\u0435 70&nbsp;\u0442\u044b\u0441.&nbsp;\u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0435\u0432, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0445\u0441\u044f \u043a Kafka), \u043d\u0430\u0432\u0435\u0440\u043d\u044f\u043a\u0430 \u0432\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c Kafka \u0432 \u0441\u0432\u043e\u044e \u0441\u0440\u0435\u0434\u0443 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438 GitOps. \u042d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f \u0434\u043b\u044f \u0442\u0435\u0445, \u043a\u0442\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u0435\u0442 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":749,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[10],"tags":[155,159,57,173,29,81],"class_list":["post-748","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-likbez","tag-apache-kafka","tag-ci-cd","tag-github","tag-github-actions","tag-gitops","tag-kafka","entry-card--landscape"],"_links":{"self":[{"href":"https:\/\/olvas.dev\/index.php?rest_route=\/wp\/v2\/posts\/748","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/olvas.dev\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/olvas.dev\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/olvas.dev\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/olvas.dev\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=748"}],"version-history":[{"count":1,"href":"https:\/\/olvas.dev\/index.php?rest_route=\/wp\/v2\/posts\/748\/revisions"}],"predecessor-version":[{"id":756,"href":"https:\/\/olvas.dev\/index.php?rest_route=\/wp\/v2\/posts\/748\/revisions\/756"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/olvas.dev\/index.php?rest_route=\/wp\/v2\/media\/749"}],"wp:attachment":[{"href":"https:\/\/olvas.dev\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=748"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/olvas.dev\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=748"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/olvas.dev\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=748"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}