{"id":343308,"date":"2022-12-29T09:02:00","date_gmt":"2022-12-29T09:02:00","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=343308"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=343308","title":{"rendered":"<span>\u041c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u044b \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0435 \u2014 \u044d\u0442\u043e \u043d\u0435 \u043f\u0440\u043e\u043a\u0440\u0430\u0441\u0442\u0438\u043d\u0430\u0446\u0438\u044f, \u0438\u043b\u0438 \u043a\u0430\u043a \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0441\u0435\u0440\u0432\u0438\u0441 \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f<\/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<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/925\/41b\/534\/92541b5340bf3b54c04eb0c1d9570167.png\" width=\"3120\" height=\"1760\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/925\/41b\/534\/92541b5340bf3b54c04eb0c1d9570167.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041e\u0434\u043d\u0430\u0436\u0434\u044b \u0443 \u043d\u0430\u0441 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0438\u0434\u0435\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0442\u0447\u0435\u0442\u044b \u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u043e\u0432 \u0432 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440 Telegram. \u041f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u044d\u0442\u0430 \u0438\u0434\u0435\u044f \u043f\u0435\u0440\u0435\u0440\u043e\u0441\u043b\u0430 \u0432 \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b, \u043e\u043f\u043e\u0432\u0435\u0449\u0430\u0442\u044c \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0442\u0447\u0435\u0442\u044b \u0432 \u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0435, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u0442\u0430. \u041f\u043e\u043c\u0438\u043c\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u043e\u0432, \u0431\u043e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0441 Jira \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 \u0420\u0422\u041b\u0430\u0431\u0441. <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u043e \u0442\u043e\u043c, \u0441 \u0447\u0435\u0433\u043e \u0432\u0441\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u043e\u0441\u044c, \u043a\u0430\u043a\u0438\u0435 \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u0438 \u0438\u0434\u0435\u0438, \u043a\u0430\u043a\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043c\u044b \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u043b\u0438 \u0438 \u043a\u0430\u043a \u043c\u044b \u0438\u0445 \u0440\u0435\u0448\u0438\u043b\u0438 \u0432 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p><a href=\"#1\">1.\u00a0\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/a><\/p>\n<p><a href=\"#2\">2.\u00a0\u0412\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0439 \u0432 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a<\/a><br \/><a href=\"#2.1\">2.1.\u00a0\u0412\u044b\u0431\u043e\u0440 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/a><br \/><a href=\"#2.2\">2.2. \u0414\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430<\/a><\/p>\n<p><a href=\"#3\">3.\u00a0\u041d\u0430\u0448 \u043f\u0435\u0440\u0432\u044b\u0439 \u0431\u043e\u0442<\/a><br \/><a href=\"#3.1\">3.1.\u00a0\u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f<\/a><br \/><a href=\"#3.1.1\">3.1.1. \u0420\u043e\u043b\u0435\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c<\/a><br \/><a href=\"#3.1.2\">3.1.2. \u041a\u043e\u043c\u0430\u043d\u0434\u044b \u0431\u043e\u0442\u0430<\/a><br \/><a href=\"#3.2\">3.2.\u00a0\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/a><\/p>\n<p><a href=\"#4\">4.\u00a0\u0417\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0430 \u043f\u0440\u043e\u0434\u0435<\/a><br \/><a href=\"#4.1\">4.1. \u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f<\/a><br \/><a href=\"#4.2\">4.2. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/a><\/p>\n<p><a href=\"#5\">5. \u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<p><a class=\"anchor\" name=\"1\" id=\"1\"><\/a><\/p>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u041f\u0430\u0440\u0430 \u0441\u043b\u043e\u0432 \u043e \u043d\u0430\u0441. \u041c\u044b \u2014 <a href=\"https:\/\/habr.com\/ru\/users\/Lavenge\/\">\u0421\u0435\u0440\u0433\u0435\u0439 \u041a\u043e\u043d\u0434\u0438\u0442\u0435\u0440\u043e\u0432<\/a> \u0438 <a href=\"https:\/\/habr.com\/ru\/users\/Serj96\/\">\u0421\u0435\u0440\u0433\u0435\u0439 \u0411\u0443\u0448\u043c\u0435\u043b\u0435\u0432<\/a>, \u0432\u0435\u0434\u0443\u0449\u0438\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u043f\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0420\u0422\u041b\u0430\u0431\u0441. <\/p>\n<p>\u041d\u0430\u0448\u0443 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u043f\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u043e\u0432 \u0432 \u043d\u0430\u0448\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u043b\u043e\u0432\u043d\u043e \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0447\u0435\u0442\u044b\u0440\u0435 \u044d\u0442\u0430\u043f\u0430 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>\u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0439 \u0432 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u043d\u0430 \u043f\u0440\u043e\u0434\u0435 (\u043a\u0441\u0442\u0430\u0442\u0438, \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0434\u0435, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 <a href=\"https:\/\/habr.com\/ru\/company\/rtlabs\/blog\/646815\/\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u0414\u043c\u0438\u0442\u0440\u0438\u044f \u041f\u0438\u0440\u0443\u043c\u043e\u0432\u0430);<\/p>\n<\/li>\n<li>\n<p>\u0431\u043e\u0442 \u0441 \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439 \u0438 \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437 \u044d\u0442\u0430\u043f\u043e\u0432 \u043c\u044b \u043f\u0440\u0435\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u0446\u0435\u043b\u0438, \u043d\u043e \u0438\u0445 \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u043b\u0430 \u043e\u0434\u043d\u043e \u2014 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0432 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435.<\/p>\n<p>\u041c\u044b \u043d\u0430\u0434\u0435\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u043d\u0430\u0448\u0438 \u0438\u0434\u0435\u0438 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0432\u0430\u0448\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0438\u043b\u0438 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0432\u0430\u043c \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u0438 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/0b3\/424\/e64\/0b3424e64b8c8287c48ecb8a8cec5202.png\" width=\"3120\" height=\"1760\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/0b3\/424\/e64\/0b3424e64b8c8287c48ecb8a8cec5202.png\"\/><figcaption><\/figcaption><\/figure>\n<p><a class=\"anchor\" name=\"2\" id=\"2\"><\/a><\/p>\n<h2>\u0412\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0439 \u0432 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a<\/h2>\n<p>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u0443 \u043d\u0430\u0441 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u044e \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c. \u0417\u0430\u0434\u0430\u0447\u0430 \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u043b\u0430\u0441\u044c \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445:<\/p>\n<ul>\n<li>\n<p>\u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u044b<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0434\u043e\u0441\u0442\u0443\u043f \u0432 Jenkins <\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b \u0434\u0436\u043e\u0431<\/p>\n<\/li>\n<li>\n<p>\u0442\u0435\u0441\u0442-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0442\u0447\u0435\u0442\u044b \u0432 \u043f\u043e\u0447\u0442\u0443<\/p>\n<\/li>\n<li>\n<p>PROFIT<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u043e\u0432 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043b\u0441\u044f, \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u043b\u043e\u0441\u044c \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u0435, \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u043b\u043e\u0441\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0435\u0439 \u043e\u0442\u0447\u0435\u0442\u0430. \u041d\u0430\u0447\u0430\u043b\u0438 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u00ab\u0445\u043e\u0442\u0435\u043b\u043a\u0438\u00bb \u0438 \u043f\u0440\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b:<\/p>\n<ul>\n<li>\n<p>\u043d\u0435 \u0443 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a Jenkins \u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c <\/p>\n<\/li>\n<li>\n<p>\u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438 \u0432 Jenkins<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u0447\u0435\u0442\u044b \u0432 \u043f\u043e\u0447\u0442\u0443 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u0438\u0441\u044c \u0432 \u0441\u043f\u0430\u043c<\/p>\n<\/li>\n<\/ul>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/405\/178\/e51\/405178e511ad806556fb015fc7b15691.png\" width=\"137\" height=\"97\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/405\/178\/e51\/405178e511ad806556fb015fc7b15691.png\"\/><figcaption><\/figcaption><\/figure>\n<p><a class=\"anchor\" name=\"2.1\" id=\"2.1\"><\/a><\/p>\n<h3>\u0412\u044b\u0431\u043e\u0440 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0412 \u043d\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Telegram \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0439 \u0432 Telegram \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c.<\/p>\n<p>\u041d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0431\u044b\u043b\u043e \u0443\u0436\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0432 \u0432\u0438\u0434\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0434\u043b\u044f Jenkins, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/plugins.jenkins.io\/telegram-notifications\/#documentation\"><u>\u043f\u0435\u0440\u0432\u044b\u0439 \u0432 \u0432\u044b\u0434\u0430\u0447\u0435 Google<\/u><\/a>. \u041d\u043e \u043e\u0442 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043c\u044b \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c:<\/p>\n<ul>\n<li>\n<p>\u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0430 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u0435\u0433\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>\u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 Jenkins, \u0442\u043e \u043f\u043b\u0430\u0433\u0438\u043d \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0437\u0430\u043d\u043e\u0432\u043e<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0434\u0436\u043e\u0431\u0430<\/p>\n<\/li>\n<li>\n<p>\u0431\u044b\u043b\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0434 \u0441\u0432\u043e\u0438 \u043d\u0443\u0436\u0434\u044b<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438, \u0447\u0442\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0434\u043e\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f (\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0438\u043b\u043e 3 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434) <\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u044b \u043f\u0440\u0438\u043d\u044f\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0434\u0442\u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0443\u0442\u0435\u043c \u2014 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p><a class=\"anchor\" name=\"2.2\" id=\"2.2\"><\/a><\/p>\n<h3>\u0414\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430<\/h3>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0432 \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e <a href=\"https:\/\/core.telegram.org\/bots#how-do-i-create-a-bot\"><u>\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u043e\u0442\u0430 \u0432 Telegram<\/u><\/a>, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u043e\u0431\u0449\u0438\u0439 \u0447\u0430\u0442 (\u0433\u0434\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b) \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a (Java + Junit 4 + Cucumber).<\/p>\n<p>\u0411\u044b\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 Telegram \u0447\u0435\u0440\u0435\u0437 API:<\/p>\n<pre><code class=\"java\">public static void report(String text) throws IOException{          String urlString = \"https:\/\/api.telegram.org\/bot%s\/sendMessage?parse_mode=HTML&amp;chat_id=%s&amp;text=%s\";         urlString = String.format(urlString, TOKEN, CHAT, text);         \/\/\u043f\u0440\u043e\u043a\u0441\u0438   \/\/      Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(PROXY_HOST, PROXY_PORT));         \/\/\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u043f\u0440\u043e\u043a\u0441\u0438         Authenticator.setDefault(new MyAuthenticator());          URL url = new URL(urlString);   \/\/      URLConnection conn = url.openConnection(proxy);         URLConnection conn = url.openConnection();          ...     }<\/code><\/pre>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0432\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 REST API Telegram:<\/p>\n<ul>\n<li>\n<p><code>@After<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430 \u0432 \u0447\u0430\u0442<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"java\">@After     public void tearDown(Scenario scenario) throws IOException {                  ... \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430          String result;         if (scenario.isFailed()) {                          ... \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c, \u0435\u0441\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043d\u0443\u0436\u043d\u0430 (\u0438\u043d\u0430\u0447\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u043c)                          if (System.getProperty(\"tg\") != null) {                 report(result);             }         }         ...     } <\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435!<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0440\u0435\u043f\u043e\u0440\u0442\u044b \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u0438 \u043d\u0430 \u0432\u0441\u0435 \u0442\u0435\u0441\u0442\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u044b\u0435. \u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u0442\u0430\u043a \u043d\u0435 \u0434\u0435\u043b\u0430\u0439\u0442\u0435, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0432\u044b\u0439\u0434\u0443\u0442 \u0438\u0437 \u0447\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0436\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430. \u041f\u0440\u0438\u043b\u0430\u0433\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/34d\/6b4\/137\/34d6b4137d98acd2c8d0397c389c4a42.png\" width=\"625\" height=\"939\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/34d\/6b4\/137\/34d6b4137d98acd2c8d0397c389c4a42.png\"\/><figcaption><\/figcaption><\/figure>\n<\/p>\n<\/div>\n<\/details>\n<ul>\n<li>\n<p><code>@BeforeClass<\/code> \u0438 <code>@AfterClass<\/code> \u0432 Junit RunnerClass, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u043e\u0432\u0435\u0441\u0442\u0438\u0442\u044c \u043e \u043d\u0430\u0447\u0430\u043b\u0435 \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u0438\u0445 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"java\">@RunWith(Cucumber.class)  @CucumberOptions(        \u2026\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u0433\u0443\u0440\u0446\u0430 )   public class RunnerTest {     \u2026     @BeforeClass     public static void start_report() throws Exception {         \u2026             \/\/\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u043f\u043e\u0440\u0442\u0430 \u0432 \u0442\u0433         if (System.getProperty(\"tg\") == null){             \/\/\u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u0440\u0435\u043f\u043e\u0440\u0442\u044b \u0432 \u0442\u0433         } else {            String text;            \u2026 \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f             report(text);         }        \u2026     }      @AfterClass     public static void finish_report() throws Exception {         \u2026             \/\/\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u043f\u043e\u0440\u0442\u0430 \u0432 \u0442\u0433         if (System.getProperty(\"tg\") == null){             \/\/\u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u0440\u0435\u043f\u043e\u0440\u0442\u044b \u0432 \u0442\u0433         } else {            String text;            \u2026 \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f             report(text);         }        \u2026     } }<\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u043c \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u043e\u0432 \u0435\u0441\u0442\u044c \u0432\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438: <\/p>\n<ul>\n<li>\n<p>\u0441\u0440\u0435\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <\/p>\n<\/li>\n<li>\n<p>\u0442\u0435\u0433\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0438\u0445\/\u0443\u043f\u0430\u0432\u0448\u0438\u0445 \u0442\u0435\u0441\u0442\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0434\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e \u0443\u043f\u0430\u0432\u0448\u0438\u043c \u043a\u0435\u0439\u0441\u0430\u043c<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0440\u0435\u043b\u0438\u0437\u0430.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9a6\/010\/f56\/9a6010f5657594462cda640620dd02fc.png\" width=\"619\" height=\"382\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9a6\/010\/f56\/9a6010f5657594462cda640620dd02fc.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u0432\u0438\u0434 \u043e\u0442\u0447\u0435\u0442\u043d\u043e\u0441\u0442\u0438 \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u0440\u0438\u0436\u0438\u043b\u0441\u044f \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u041e\u0434\u043d\u0430\u043a\u043e \u043e\u043d \u043f\u0435\u0440\u0435\u0436\u0438\u043b \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0441\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e), \u043d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u0434\u0440\u0443\u0433\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w780q1\/getpro\/habr\/upload_files\/180\/a24\/9e5\/180a249e5390210dc91e03be959c89de.jpeg\" width=\"640\" height=\"480\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/180\/a24\/9e5\/180a249e5390210dc91e03be959c89de.jpeg\" data-blurred=\"true\"\/><figcaption><\/figcaption><\/figure>\n<p><a class=\"anchor\" name=\"3\" id=\"3\"><\/a><\/p>\n<h2>\u041d\u0430\u0448 \u043f\u0435\u0440\u0432\u044b\u0439 \u0431\u043e\u0442<\/h2>\n<p>\u0420\u0430\u043d\u0435\u0435 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438, \u0447\u0442\u043e \u043d\u0435 \u0443 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u043e\u0432 \u0431\u044b\u043b\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u0432 Jenkins. \u0411\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0440\u0430\u0437 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0438\u0434\u0435\u0442 \u0432 Jenkins, \u0442\u043e Jenkins \u043f\u0440\u0438\u0434\u0435\u0442 \u043a \u043d\u0438\u043c \u0432 \u0442\u0435\u043b\u0435\u0444\u043e\u043d. <\/p>\n<p>\u0418\u0437\u0443\u0447\u0438\u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430 habr \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0431\u043e\u0442\u0430 \u0432 Telegram.<\/p>\n<p><a class=\"anchor\" name=\"3.1\" id=\"3.1\"><\/a><\/p>\n<h3>\u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f<\/h3>\n<p>\u041d\u0430\u0448 \u0431\u043e\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0434\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u044b, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0447\u0435\u0442 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e.<\/p>\n<p><a class=\"anchor\" name=\"3.1.1\" id=\"3.1.1\"><\/a><\/p>\n<h4>\u0420\u043e\u043b\u0435\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c<\/h4>\n<p>\u041c\u043e\u0434\u0435\u043b\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u043d\u0430\u043f\u0438\u0441\u0430\u0432\u0448\u0438\u0439 \u0431\u043e\u0442\u0443, \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0440\u043e\u043b\u044c &#8212; \u043d\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c. \u0414\u0430\u043b\u0435\u0435 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u043c\u0443 \u043f\u0440\u0430\u0432\u0430. \u041c\u043e\u0434\u0435\u043b\u044c \u0432\u043a\u043b\u044e\u0447\u0430\u043b\u0430 \u0432 \u0441\u0435\u0431\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0440\u043e\u043b\u0438:<\/p>\n<ul>\n<li>\n<p><code>UNAUTHORIZED<\/code><strong> <\/strong>\u2014<strong> <\/strong>\u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442<\/p>\n<\/li>\n<li>\n<p><code>USER<\/code><strong> <\/strong>\u2014<strong> <\/strong>\u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0438 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438<\/p>\n<\/li>\n<li>\n<p><code>JENKINS_USER<\/code><strong> <\/strong>\u2014<strong> <\/strong>\u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u043f\u0440\u0430\u0432\u0430 USER \u0438 \u0438\u043c\u0435\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b<\/p>\n<\/li>\n<li>\n<p><code>ADMIN<\/code><strong> <\/strong>\u2014<strong> <\/strong>\u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u043e \u0432\u0441\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c<\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"3.1.2\" id=\"3.1.2\"><\/a><\/p>\n<h4>\u041a\u043e\u043c\u0430\u043d\u0434\u044b \u0431\u043e\u0442\u0430<\/h4>\n<p>\u0412 \u0431\u043e\u0442\u0435 \u043c\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<ul>\n<li>\n<p><code>\/test<\/code> \u2014 \u0437\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u0441\u0442\u043e\u0432, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0440\u0435\u0434\u044b \u0438 \u0442\u0435\u0433\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430<\/p>\n<\/li>\n<li>\n<p><code>\/reports<\/code> \u2014 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f excel \u043e\u0442\u0447\u0435\u0442\u0430 \u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a \u043e\u0442\u0447\u0435\u0442\u0443 \u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438<\/p>\n<\/li>\n<li>\n<p><code>\/links<\/code> \u2014 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/p>\n<\/li>\n<li>\n<p><code>\/help<\/code> \u2014 \u0441\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c<\/p>\n<\/li>\n<li>\n<p><code>\/anekdot<\/code> \u2014 \u043f\u0440\u0438\u0441\u043b\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b \u0430\u043d\u0435\u043a\u0434\u043e\u0442 \u0432 \u0447\u0430\u0442 (\u043d\u0435\u043c\u043d\u043e\u0433\u043e \u044e\u043c\u043e\u0440\u0430 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u0432\u0440\u0435\u0434\u0438\u0442)<\/p>\n<\/li>\n<li>\n<p><code>\/access<\/code> \u2014 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043b\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0431\u043e\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u0432\u0430\u0442\u044c \u043b\u044e\u0434\u044f\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c<\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"3.2\" id=\"3.2\"><\/a><\/p>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h3>\n<p>\u042d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0435\u0439 \u0438 \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u044f\u043a\u043e\u0440\u044c \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 <a href=\"#4\"><u>\u0433\u043b\u0430\u0432\u0435<\/u><\/a>.<\/p>\n<p>\u0411\u043e\u0442\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 Java, \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u0445 \u043f\u043e\u0434\u043d\u044f\u043b\u0438 \u0411\u0414 PostgreSQL. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430:<\/p>\n<pre><code class=\"java\">&lt;dependency>  \u00a0\u00a0\u00a0 &lt;groupId>org.telegram&lt;\/groupId>  \u00a0\u00a0\u00a0 &lt;artifactId>telegrambots&lt;\/artifactId>  \u00a0\u00a0\u00a0 &lt;version>4.9.1&lt;\/version>  &lt;\/dependency><\/code><\/pre>\n<p>\u0411\u044b\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d \u043e\u0442 <code>TelegramLongPollingCommandBot<\/code>. \u0412 \u044d\u0442\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u043c\u044f \u0438 \u0442\u043e\u043a\u0435\u043d \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043e\u0442\u0430, \u0434\u0430\u043b\u0435\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c\u00a0\u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0431\u0435\u0437 \u043a\u043e\u043c\u0430\u043d\u0434: <\/p>\n<pre><code class=\"java\">public final class RunnerBot extends TelegramLongPollingCommandBot {     \/\/ \u0438\u043c\u044f \u0431\u043e\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u0443 BotFather     \/\/ \u0438 \u0442\u043e\u043a\u0435\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435     private static final String BOT_NAME = \"\u0438\u043c\u044f_\u0432\u0430\u0448\u0435\u0433\u043e_\u0431\u043e\u0442\u0430\";     private static final String BOT_TOKEN = \"\u0442\u043e\u043a\u0435\u043d_\u0432\u0430\u0448\u0435\u0433\u043e_\u0431\u043e\u0442\u0430\";       public RunnerBot(DefaultBotOptions botOptions) {          super(botOptions, BOT_NAME);          \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0432\u0441\u0435\u0445 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434         System.out.println(\"Registering '\/test'...\");         register(new TestCommand());         ... \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b          \/\/ \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b         System.out.println(\"Registering default action'...\");         registerDefaultAction(((absSender, message) -> {             ... \u043f\u0438\u0448\u0435\u043c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439         }));     }      @Override     public String getBotToken() {         return BOT_TOKEN;     }      \/\/ \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u0441 '\/'     @Override     public void processNonCommandUpdate(Update update) {         System.out.println(\"Processing non-command update...\");         if (!update.hasMessage()) {            System.out.println(\"Update doesn't have a body!\");             throw new IllegalStateException(\"Update doesn't have a body!\");         }     } }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0431\u043e\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 Main-Class:<\/p>\n<pre><code class=\"java\">public class BotInitializer {      private static final String PROXY_HOST = \"XX.XX.XX.XX\";     private static final int PROXY_PORT = 8080; \/\/    private static final String PROXY_USER = \"bot\"; \/\/    private static final String PROXY_PASSWORD = \"bot\";      public static void main(String[] args) {          try {              Authenticator.setDefault(new MyAuthenticator());              System.out.println(\"Initializing API context...\");             ApiContextInitializer.init();              TelegramBotsApi botsApi = new TelegramBotsApi();              System.out.println(\"Configuring bot options...\");             DefaultBotOptions botOptions = ApiContext.getInstance(DefaultBotOptions.class);              botOptions.setProxyHost(PROXY_HOST);             botOptions.setProxyPort(PROXY_PORT);             botOptions.setProxyType(DefaultBotOptions.ProxyType.HTTP);               System.out.println(\"Registering ...\");             botsApi.registerBot(new RunnerBot(botOptions));              System.out.println(\"bot is ready for work!\");          } catch (TelegramApiRequestException e) {             System.out.println(\"Error while initializing bot!\" + e);         }     } }<\/code><\/pre>\n<p>\u041a\u043e\u043c\u0430\u043d\u0434\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u0432 \u0431\u043e\u0442\u0435 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u044b \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 BotCommand, \u0442\u0430\u043a, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u0430 <code>TestCommand<\/code>:<\/p>\n<pre><code class=\"java\">public final class TestCommand extends BotCommand {       public TestCommand() {         super(\"test\", \"\u041a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441: \/test \u0421\u0420\u0415\u0414\u0410 \u0422\u042d\u0413 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0439(\u043e\u043f\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e)\\n\");     }      @Override     public void execute(AbsSender absSender, User user, Chat chat, String[] strings) {             ... \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0438\u0440\u0443\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f - \u0441\u0432\u0435\u0440\u044f\u0435\u043c id \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u0435\u0433\u043e \u0440\u043e\u043b\u044c \u0432 \u0411\u0414             if (isValid(strings)) {                 String comment = \"\";                  testMessageBuilder = new StringBuilder(\"&lt;b>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c job \u0432 Jenkins&lt;\/b>\\n\");                 testMessageBuilder.append(\"C\u0440\u0435\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f: &lt;b>\" + strings[0].toUpperCase() + \"&lt;\/b>\\n\");                 testMessageBuilder.append(\"\u0412\u044b \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u0442\u0435\u0433\u0438: &lt;b>\" + strings[1] + \"&lt;\/b>\\n\");                  String userId = jdbc.FindUserId(user);                 \/\/\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0434\u0436\u043e\u0431 \u0432 Jenkins                 Jenkins j = new Jenkins();                 j.runJenkinsJobWithParams(strings[0].toUpperCase(), strings[1],userId);                                  testMessage = new SendMessage();                 testMessage.setChatId(chat.getId().toString());                 testMessage.enableHtml(true);                 testMessage.setText(testMessageBuilder.toString());                  execute(absSender, testMessage, user);             } else {                 \/\/\u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c \u0432\u0441\u043f\u043e\u043c\u043e\u0433\u0430\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u043a\u043e\u043c\u0430\u043d\u0434\u0443                 KonturCommand konturCommand = new KonturCommand();                 konturCommand.execute(absSender, user, chat, strings);             }              }          ...          private boolean isValid(String[] params) {         ... \u0432\u0430\u043b\u0438\u0434\u0430\u0446\u0438\u044f, \u0447\u0442\u043e \u0432\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0432\u0435\u0440\u043d\u044b     }     }<\/code><\/pre>\n<p>\u0421\u0430\u043c \u0437\u0430\u043f\u0443\u0441\u043a \u0434\u0436\u043e\u0431\u0430 \u0431\u044b\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u0447\u0435\u0440\u0435\u0437 \u0432\u044b\u0437\u043e\u0432 rest API Jenkins:<\/p>\n<pre><code class=\"java\">URL url = new URL(\"http:\/\/XX.XX.XX.XX\/job\/AUTOTESTS.XXXX\/buildWithParameters?token=remote_starter\"); \/\/ Jenkins URL  String user = \"XYZ\"; \/\/ username String pass = \"remote_token\"; \/\/ password or API token String authStr = user + \":\" + pass; String encoding = Base64.getEncoder().encodeToString(authStr.getBytes(StandardCharsets.UTF_8));   HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod(\"POST\"); connection.setRequestProperty(\"Authorization\", \"Basic \" + encoding);<\/code><\/pre>\n<p>\u0420\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0431\u043e\u0442 \u0440\u0430\u0431\u043e\u0442\u0430\u043b \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e, \u0443\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u043b \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u043b \u043b\u0438\u0448\u043d\u0438\u0439 \u0440\u0430\u0437 \u043d\u0435 \u0437\u0430\u0445\u043e\u0434\u0438\u0442\u044c \u0432 Jenkins. \u0412\u0441\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043e\u0442\u0447\u0435\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c, \u043d\u0435 \u0432\u044b\u0445\u043e\u0434\u044f \u0438\u0437 \u043b\u044e\u0431\u0438\u043c\u043e\u0433\u043e \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430.<\/p>\n<p><a class=\"anchor\" name=\"4\" id=\"4\"><\/a><\/p>\n<h2>\u0417\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0430 \u043f\u0440\u043e\u0434\u0435<\/h2>\n<p>\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u043d\u0430\u0448\u0435\u0439 \u0446\u0435\u043b\u044c\u044e \u0441\u0442\u0430\u043b\u0430 \u0437\u0430\u0434\u0430\u0447\u0430 \u2014 \u0434\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0434\u0435\u0436\u0443\u0440\u043d\u044b\u043c \u043d\u0430\u0448\u0438 \u0442\u0435\u0441\u0442\u044b \u043d\u0430 \u043f\u0440\u043e\u0434\u0435. \u041e\u0442\u043b\u0438\u0447\u0438\u0435 \u044d\u0442\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0438 \u043e\u0442 \u043f\u0440\u043e\u0448\u043b\u043e\u0439 \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0435 \u0434\u0436\u043e\u0431\u044b, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u044b\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u0436\u043e\u0431\u0430 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u0439 \u043e\u0442\u0447\u0435\u0442 \u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438.<\/p>\n<p><a class=\"anchor\" name=\"4.1\" id=\"4.1\"><\/a><\/p>\n<h3>\u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f<\/h3>\n<p>\u041d\u0430\u0448 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 \u0431\u043e\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0442\u0430\u043a\u0443\u044e \u0436\u0435 \u0440\u043e\u043b\u0435\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c, \u043a\u0430\u043a \u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0440\u0430\u043d\u0435\u0435. <\/p>\n<p>\u0414\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0440\u0430\u0437\u043b\u0438\u0447\u043d\u044b\u0445 \u0434\u0436\u043e\u0431\u043e\u0432 \u043c\u044b \u0432\u0432\u043e\u0434\u0438\u043c \u043f\u043e\u043d\u044f\u0442\u0438\u0435 \u043f\u0440\u0435\u0441\u0435\u0442 \u2014 \u0437\u0430\u0440\u0430\u043d\u0435\u0435 \u0441\u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043d\u0430\u0431\u043e\u0440 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432. \u0414\u0430\u043b\u0435\u0435 \u043f\u0440\u0438 \u043f\u043e\u043c\u043e\u0449\u0438 \u043a\u043d\u043e\u043f\u043e\u043a \u0431\u043e\u0442\u0430 \u043c\u044b \u043e\u0442\u0440\u0438\u0441\u043e\u0432\u044b\u0432\u0430\u0435\u043c \u043c\u0435\u043d\u044e \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432, \u043d\u0430 \u043f\u0435\u0440\u0432\u043e\u043c \u0443\u0440\u043e\u0432\u043d\u0435 \u043c\u0435\u043d\u044e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u0442 \u043a\u0430\u043a\u0443\u044e \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u0442, \u043d\u0430 \u0432\u0442\u043e\u0440\u043e\u043c \u2014 \u043a\u0430\u043a\u043e\u0439 \u043d\u0430\u0431\u043e\u0440 \u0442\u0435\u0441\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0434\u043e\u043b\u0436\u0435\u043d \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e\u043c \u0437\u0430\u043f\u0443\u0441\u043a\u0435. \u0414\u043b\u044f \u0443\u0434\u043e\u0431\u0441\u0442\u0432\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043a \u0441\u0432\u043e\u0434\u043a\u0435 \u043f\u043e \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u0430\u043c \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d html \u043e\u0442\u0447\u0435\u0442 \u0441 \u0434\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u043f\u043e \u0442\u0435\u0441\u0442\u0430\u043c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/73e\/26b\/4da\/73e26b4da2d029686fe1353c0c3e2217.png\" width=\"535\" height=\"606\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/73e\/26b\/4da\/73e26b4da2d029686fe1353c0c3e2217.png\"\/><figcaption><\/figcaption><\/figure>\n<p><a class=\"anchor\" name=\"4.2\" id=\"4.2\"><\/a><\/p>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h3>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0430\u043a\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u0431\u044b\u043b\u0430 \u0440\u0435\u0448\u0435\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c Spring Boot \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u043e 2 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438:<\/p>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0431\u043e\u0442\u0430:<\/p>\n<pre><code class=\"java\">&lt;dependency>     &lt;groupId>org.telegram&lt;\/groupId> \u00a0\u00a0\u00a0\u00a0&lt;artifactId>telegrambots-spring-boot-starter&lt;\/artifactId> \u00a0\u00a0\u00a0\u00a0&lt;version>5.7.1&lt;\/version> &lt;\/dependency><\/code><\/pre>\n<p>\u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 Jenkins:<\/p>\n<pre><code class=\"java\">&lt;dependency>     &lt;groupId>com.offbytwo.jenkins&lt;\/groupId> \u00a0\u00a0\u00a0\u00a0&lt;artifactId>jenkins-client&lt;\/artifactId> \u00a0\u00a0\u00a0\u00a0&lt;version>0.3.8&lt;\/version> &lt;\/dependency><\/code><\/pre>\n<p>\u0422\u0430\u043a \u0436\u0435 \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0432\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 (\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438, \u043f\u0440\u0435\u0441\u0435\u0442\u044b) \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u0431\u0430\u0437\u0430 \u0434\u0430\u043d\u043d\u044b\u0445 PostgreSQL.<\/p>\n<p>\u041c\u044b \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0431\u043e\u0442\u0430 \u0447\u0435\u0440\u0435\u0437 \u043f\u0440\u043e\u043a\u0441\u0438 \u0438\u043b\u0438 \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 \u0430\u043d\u043d\u043e\u0442\u0430\u0446\u0438\u044e <code>@ConditionalOnProperty<\/code>:<\/p>\n<pre><code class=\"java\"> @Bean     @ConditionalOnProperty(name = \"bot.proxy.enabled\", havingValue = \"false\", matchIfMissing = true)     public Bot defaultTelegramBot() {         log.debug(\"defaultAlertsTelegramBot bean creation\");         log.debug(\"defaultAlertsTelegramBot is created\");         this.bot = new Bot(new DefaultBotOptions(), botSettings, updateReceiver,userService,notificationService, menuService);         return this.bot;     }      @Bean     @ConditionalOnProperty(name = \"bot.proxy.enabled\", havingValue = \"true\")     public Bot proxyTelegramBot() {         log.debug(\"proxyAlertsTelegramBot bean creation\");         log.debug(\"setting: {}\", botSettings);         DefaultBotOptions defaultBotOptions = new DefaultBotOptions();         defaultBotOptions.setProxyType(botSettings.getProxy().getType());         defaultBotOptions.setProxyHost(botSettings.getProxy().getHost());         defaultBotOptions.setProxyPort(botSettings.getProxy().getPort());         log.debug(\"proxyAlertsTelegramBot is created\");         this.bot = new Bot(defaultBotOptions, botSettings, updateReceiver,userService,notificationService, menuService);         return this.bot;     }<\/code><\/pre>\n<p>\u0421\u0430\u043c \u0436\u0435 \u043a\u043b\u0430\u0441\u0441 \u0431\u043e\u0442\u0430 \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d \u043e\u0442 <code>TelegramLongPollingBot<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442 \u043c\u0435\u0442\u043e\u0434 onUpdateReceived(Update update). \u0412 \u0434\u0430\u043d\u043d\u043e\u043c \u043c\u0435\u0442\u043e\u0434\u0435 \u043c\u044b \u043f\u0435\u0440\u0435\u0434\u0430\u0435\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u0441\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0431\u0438\u043d \u2014 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043a\u043e\u043c\u0430\u043d\u0434 <code>HandlerService<\/code><strong> <\/strong>(\u043f\u0440\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0433\u043b\u0430\u0432\u0435), \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0437\u0430\u043f\u0440\u043e\u0441 \u043f\u0430\u0440\u0441\u0438\u0442\u0441\u044f \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442\u0441\u044f:<\/p>\n<pre><code class=\"java\"> @Override     public void onUpdateReceived(Update update) {          HandlerResponse handlerResponse = handlerService.handle(update);          if (handlerResponse.getContent() == null) {             log.info(\"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a \u043d\u0435 \u0432\u0435\u0440\u043d\u0443\u043b \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438\");         } else if (!handlerResponse.getContent().getMessagesToExecute().isEmpty()) {             Content content = handlerResponse.getContent();             content.getMessagesToExecute().forEach(botMessage -> {                 executeWithExceptionCheck(botMessage);             });         }     }<\/code><\/pre>\n<p>\u041e\u0434\u0438\u043d \u0438\u0437 \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u043a\u043e\u043c\u0430\u043d\u0434 \u043e\u0442\u0432\u0435\u0447\u0430\u043b \u0437\u0430 \u0437\u0430\u043f\u0443\u0441\u043a \u0434\u0436\u043e\u0431\u043e\u0432 \u0432 Jenkins. \u0414\u043b\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0431\u044b\u043b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043d \u043c\u0435\u0442\u043e\u0434 <code>startBuild()<\/code>, \u0432 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043f\u0435\u0440\u0435\u0434\u0430\u0442\u044c \u0434\u0436\u043e\u0431 \u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043f\u0440\u0435\u0441\u0435\u0442\u0430:<\/p>\n<pre><code class=\"java\">public Long startBuild(JobEntity job, Iterable&lt;PresetParamEntity> params){         Long queue_id = 0L;         Jenkins jobJenkins =  job.getJenkins();         try {             JenkinsServer jenkinsServer = new JenkinsServer(new URI(jobJenkins.getUrl()), jobJenkins.getUser(), jobJenkins.getToken());             JobWithDetails jenkinsJob = jenkinsServer.getJob(job.getJob());              Map&lt;String, String> paramMap = new HashMap&lt;>();             for (PresetParamEntity paramEntity: params) {                 paramMap.put(paramEntity.getParam(),paramEntity.getValue());             }              QueueReference queueReference;              if (paramMap.isEmpty()){                 queueReference = jenkinsJob.build();             } else {                 queueReference = jenkinsJob.build(paramMap);             }                       try {                 String urlPart = queueReference.getQueueItemUrlPart();                 Pattern regex = Pattern.compile(\"https:\/\/([^']*?)\/queue\/item\/(\\\\d*)\/\");                 Matcher m = regex.matcher(urlPart);                 if (m.find()) {                     log.debug(\"id \u043d\u043e\u0432\u043e\u0439 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 {}\", m.group(2));                     queue_id = Long.valueOf(m.group(2));                 }             } catch (Exception e) {                 log.error(\"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438 id \u043e\u0447\u0435\u0440\u0435\u0434\u0438\");             }          } catch (Exception e){             ... \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443         }         return queue_id;     }<\/code><\/pre>\n<p>\u041a \u043d\u0430\u0448\u0435\u043c\u0443 \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e, \u0432 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0435 \u043c\u044b \u043d\u0435 \u0441\u043c\u043e\u0433\u043b\u0438 \u043d\u0430\u0439\u0442\u0438 \u043c\u0435\u0442\u043e\u0434\u0430 \u0434\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0441 \u043e\u0447\u0435\u0440\u0435\u0434\u044c\u044e \u0437\u0430\u043f\u0440\u043e\u0441\u043e\u0432, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0434\u043b\u044f \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u043d\u0430\u043c\u0438 \u0434\u0436\u043e\u0431\u0430 \u043c\u044b \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u043c \u00ab\u043a\u043e\u0441\u0442\u044b\u043b\u044c\u00bb &#8212; \u0447\u0435\u0440\u0435\u0437 rest API \u0432\u044b\u0442\u044f\u0433\u0438\u0432\u0430\u0435\u043c id QueueItem. \u042d\u0442\u0430 \u0438 \u0434\u0440\u0443\u0433\u0430\u044f \u043c\u0435\u0442\u0430\u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u043e\u0431\u044a\u0435\u043a\u0442 <code>TrackEntity<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0445\u0440\u0430\u043d\u0438\u0442\u0441\u044f \u0432 \u0411\u0414.  \u0414\u0430\u043b\u0435\u0435 \u043f\u043e \u0448\u0435\u0434\u0443\u043b\u0435\u0440\u0443 \u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0441\u0442\u0430\u0442\u0443\u0441 \u043d\u0430\u0448\u0435\u0433\u043e <code>TrackEntity<\/code>:<\/p>\n<pre><code class=\"java\">@Scheduled(fixedDelay = 5000)     protected void checkTracked() {         log.info(\"\u0417\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0445 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0435\u0439\");         Iterable&lt;TrackEntity> allTrackedJobs = trackService.getAllQueued();         procedures.checkBuilds(allTrackedJobs);         log.info(\"\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430\");     } <\/code><\/pre>\n<p>\u041f\u043e\u0438\u0441\u043a \u043f\u0440\u043e\u0438\u0441\u0445\u043e\u0434\u0438\u0442 \u0442\u0430\u043a: <\/p>\n<pre><code class=\"java\">  \/**      * \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0434\u0436\u043e\u0431\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0431\u044b\u043b \u0437\u0430\u043f\u0443\u0449\u0435\u043d \u0438\u0437 \u0431\u043e\u0442\u0430      * @param trackedJobs \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0434\u0436\u043e\u0431\u044b      * *\/     @Async     public void checkBuilds (Iterable&lt;TrackEntity> trackedJobs){          for (TrackEntity trackEntity: trackedJobs) {             log.debug(\"\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u043c \u0434\u0436\u043e\u0431\u0435 {}\", trackEntity.toString());             \/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043e jenkins, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u0430 \u0441\u0431\u043e\u0440\u043a\u0430             Jenkins jenkins = trackEntity.getJob().getJenkins();             \/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u044c \u0434\u0436\u043e\u0431\u0430             JobEntity job = trackEntity.getJob();             \/\/\u043f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0443\u0441 \u0441\u0431\u043e\u0440\u043a\u0438             try {                 \/\/\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u043c\u0441\u044f \u043a \u0434\u0436\u0435\u043d\u043a\u0438\u043d\u0441                 JenkinsServer jenkinsServer = new JenkinsServer(new URI(jenkins.getUrl()),                         jenkins.getUser(),                         jenkins.getToken());                  \/\/\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430, \u0447\u0442\u043e \u0431\u0438\u043b\u0434 \u0435\u0449\u0435 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438                 boolean isInQueue = false;                 Queue queue = jenkinsServer.getQueue();                 \/\/\u043f\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0432 \u043f\u043e\u0438\u0441\u043a\u0435 \u043d\u0443\u0436\u043d\u043e\u0433\u043e id                 for (QueueItem queueItem : queue.getItems()) {                     if (queueItem.getId().equals(trackEntity.getQueueId())) {                         isInQueue = true;                         log.debug(\"\u0411\u0438\u043b\u0434 \u0435\u0449\u0435 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438. {}\", trackEntity);                         break;                     }                 }                  log.debug(\"\u0411\u0438\u043b\u0434 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438? {}\", isInQueue);                  if (!isInQueue) {                     log.debug(\"\u0411\u0438\u043b\u0434 \u0443\u0436\u0435 \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f. {}\", trackEntity);                     \/\/\u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0436\u043e\u0431                     JobWithDetails jobWithDetails = jenkinsServer.getJob(trackEntity.getJob().getJob());                      if (trackEntity.getBuildId() == null) {                         for (Build build : jobWithDetails.getAllBuilds()) {                             log.debug(\"\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 id queue item: {} \u0432 \u0431\u0438\u043b\u0434\u0435 - {} \u0432 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u043c\u043e\u0439 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438\", build.details().getQueueId(), trackEntity.getQueueId());                             if (build.details().getQueueId() == trackEntity.getQueueId()) {                                 ... \u043e\u043f\u043e\u0432\u0435\u0449\u0430\u0435\u043c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0447\u0442\u043e \u0431\u0438\u043b\u0434 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u0438                             }                         }                     } else {                         Build buildNoDetails = jobWithDetails.getBuildByNumber(trackEntity.getBuildId());                         BuildWithDetails build = buildNoDetails.details();                         if (build.isBuilding()) {                             log.debug(\"\u0411\u0438\u043b\u0434 \u0432\u0441\u0435 \u0435\u0449\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f. {}\", trackEntity);                         } else {                             \/\/\u043e\u0431\u043d\u043e\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u043f\u0438\u0441\u044c \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0431\u0438\u043b\u0434 \u0443\u0436\u0435 \u043d\u0435 \u0441\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0441\u044f                             trackEntity.setIsBuilding(false);                             trackService.updateTrack(trackEntity);                             \/\/\u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0440\u0430\u0437\u043d\u044b\u0435 \u043e\u0442\u0447\u0435\u0442\u044b                             List&lt;Artifact> artifactList = build.getArtifacts();                             int reportsSendedCounter = 0;                             for (Artifact artifact :                                     artifactList) {                                 if (artifact.getFileName().toLowerCase().matches(\".*tests.html.*\")){                                     try {                                         ... \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0444\u0430\u0439\u043b \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f html \u043e\u0442\u0447\u0435\u0442\u0430 \u0432 \u043d\u0443\u0436\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435                                         ... \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u0447\u0430\u0442                                     } catch (Exception e) {                                         log.error(\"\u0412\u043e\u0437\u043d\u0438\u043a\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0444\u0430\u0439\u043b\u0430 {}.\", artifact.getFileName(), e);                                                                 }                                 } else if (artifact.getFileName().contains(\"allure-report.zip\")) {                                     ... \u043f\u0430\u0440\u0441\u0438\u043d\u0433 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f allure \u0434\u043b\u044f \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f                                     ... \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0432 \u0447\u0430\u0442                                 }                             }                             \/\/\u0435\u0441\u043b\u0438 \u043d\u0435\u0442 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0445 \u043e\u0442\u0447\u0435\u0442\u043e\u0432, \u0442\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u043e\u0442\u043f\u0438\u0441\u043a\u0443                             if (reportsSendedCounter == 0) {                                 ... \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043f\u0443\u0441\u0442\u044b\u0448\u043a\u0443                             }                          }                     }                  }             } catch (URISyntaxException | IOException e) {                 ... \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0438             }         }     }<\/code><\/pre>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/648\/401\/495\/6484014953da51a3d5285104c236dcea.png\" width=\"3120\" height=\"1760\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/648\/401\/495\/6484014953da51a3d5285104c236dcea.png\"\/><figcaption><\/figcaption><\/figure>\n<p><a class=\"anchor\" name=\"5\" id=\"5\"><\/a><\/p>\n<h2>\u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/h2>\n<p>\u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u0431\u043e\u0442 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u0432\u044b\u0434\u0430\u0447\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u0432 \u0432 Telegram.<br \/>\u041a\u043b\u044e\u0447\u0435\u0432\u044b\u0435 \u043e\u0441\u043e\u0431\u0435\u043d\u043d\u043e\u0441\u0442\u0438:<\/p>\n<ul>\n<li>\n<p>\u0418\u043c\u0435\u0435\u0442 \u0440\u043e\u043b\u0435\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u0440\u0430\u0437\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f;<\/p>\n<\/li>\n<li>\n<p>\u0418\u043c\u0435\u0435\u0442 \u043c\u0435\u043d\u044e \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0434\u0436\u043e\u0431\u043e\u0432 \u0432 Jenkins;<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u043e\u0432\u0435\u0449\u0430\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043c \u0442\u0435\u0441\u0442\u0430 \u0441 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u044b\u043c \u043e\u0442\u0447\u0435\u0442\u043e\u043c.<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0434\u043d\u0430\u043a\u043e \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u043a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f \u0431\u043e\u0442\u0430 \u043d\u0435 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u043f\u0442\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439. \u041e \u0442\u043e\u043c, \u043a\u0430\u043a \u0443\u0431\u0440\u0430\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0430 \u0438 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u0443\u0435\u043c\u043e\u0439, \u043c\u044b \u043f\u043e\u0433\u043e\u0432\u043e\u0440\u0438\u043c \u0443\u0436\u0435 \u0432 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435:) Stay tuned.<\/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\/company\/rtlabs\/blog\/708052\/\"> https:\/\/habr.com\/ru\/company\/rtlabs\/blog\/708052\/<\/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<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u041e\u0434\u043d\u0430\u0436\u0434\u044b \u0443 \u043d\u0430\u0441 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0438\u0434\u0435\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043e\u0442\u0447\u0435\u0442\u044b \u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u043e\u0432 \u0432 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440 Telegram. \u041f\u043e\u0441\u0442\u0435\u043f\u0435\u043d\u043d\u043e \u044d\u0442\u0430 \u0438\u0434\u0435\u044f \u043f\u0435\u0440\u0435\u0440\u043e\u0441\u043b\u0430 \u0432 \u0441\u0435\u0440\u0432\u0438\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0435\u0442 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b, \u043e\u043f\u043e\u0432\u0435\u0449\u0430\u0442\u044c \u043e\u0431 \u043e\u0448\u0438\u0431\u043a\u0430\u0445 \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0442\u0447\u0435\u0442\u044b \u0432 \u043b\u044e\u0431\u043e\u043c \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u0435, \u0433\u0434\u0435 \u0435\u0441\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u043d\u0442\u0435\u0433\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u043e\u0442\u0430. \u041f\u043e\u043c\u0438\u043c\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430\u043c \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u043e\u0432, \u0431\u043e\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044e \u0441 Jira \u0438 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0432 \u0420\u0422\u041b\u0430\u0431\u0441. <\/p>\n<p>\u0412 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u0440\u0438\u0438 \u0441\u0442\u0430\u0442\u0435\u0439 \u043c\u044b \u0445\u043e\u0442\u0438\u043c \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u0442\u044c \u043d\u0430\u0448\u0443 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u043e \u0442\u043e\u043c, \u0441 \u0447\u0435\u0433\u043e \u0432\u0441\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u043b\u043e\u0441\u044c, \u043a\u0430\u043a\u0438\u0435 \u0443 \u043d\u0430\u0441 \u0431\u044b\u043b\u0438 \u0438\u0434\u0435\u0438, \u043a\u0430\u043a\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043c\u044b \u0441\u043e\u0432\u0435\u0440\u0448\u0430\u043b\u0438 \u0438 \u043a\u0430\u043a \u043c\u044b \u0438\u0445 \u0440\u0435\u0448\u0438\u043b\u0438 \u0432 \u0438\u0442\u043e\u0433\u043e\u0432\u043e\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438.<\/p>\n<p><a href=\"#1\">1.\u00a0\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/a><\/p>\n<p><a href=\"#2\">2.\u00a0\u0412\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0439 \u0432 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a<\/a><br \/><a href=\"#2.1\">2.1.\u00a0\u0412\u044b\u0431\u043e\u0440 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/a><br \/><a href=\"#2.2\">2.2. \u0414\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430<\/a><\/p>\n<p><a href=\"#3\">3.\u00a0\u041d\u0430\u0448 \u043f\u0435\u0440\u0432\u044b\u0439 \u0431\u043e\u0442<\/a><br \/><a href=\"#3.1\">3.1.\u00a0\u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f<\/a><br \/><a href=\"#3.1.1\">3.1.1. \u0420\u043e\u043b\u0435\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c<\/a><br \/><a href=\"#3.1.2\">3.1.2. \u041a\u043e\u043c\u0430\u043d\u0434\u044b \u0431\u043e\u0442\u0430<\/a><br \/><a href=\"#3.2\">3.2.\u00a0\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/a><\/p>\n<p><a href=\"#4\">4.\u00a0\u0417\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0430 \u043f\u0440\u043e\u0434\u0435<\/a><br \/><a href=\"#4.1\">4.1. \u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f<\/a><br \/><a href=\"#4.2\">4.2. \u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/a><\/p>\n<p><a href=\"#5\">5. \u0417\u0430\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/a><\/p>\n<p><a class=\"anchor\" name=\"1\" id=\"1\"><\/a><\/p>\n<h2>\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435<\/h2>\n<p>\u041f\u0440\u0438\u0432\u0435\u0442! \u041f\u0430\u0440\u0430 \u0441\u043b\u043e\u0432 \u043e \u043d\u0430\u0441. \u041c\u044b \u2014 <a href=\"https:\/\/habr.com\/ru\/users\/Lavenge\/\">\u0421\u0435\u0440\u0433\u0435\u0439 \u041a\u043e\u043d\u0434\u0438\u0442\u0435\u0440\u043e\u0432<\/a> \u0438 <a href=\"https:\/\/habr.com\/ru\/users\/Serj96\/\">\u0421\u0435\u0440\u0433\u0435\u0439 \u0411\u0443\u0448\u043c\u0435\u043b\u0435\u0432<\/a>, \u0432\u0435\u0434\u0443\u0449\u0438\u0435 \u0438\u043d\u0436\u0435\u043d\u0435\u0440\u044b \u043f\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u0420\u0422\u041b\u0430\u0431\u0441. <\/p>\n<p>\u041d\u0430\u0448\u0443 \u0438\u0441\u0442\u043e\u0440\u0438\u044e \u043f\u043e \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u043c\u0435\u0441\u0441\u0435\u043d\u0434\u0436\u0435\u0440\u043e\u0432 \u0432 \u043d\u0430\u0448\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u043c\u043e\u0436\u043d\u043e \u0443\u0441\u043b\u043e\u0432\u043d\u043e \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c \u043d\u0430 \u0447\u0435\u0442\u044b\u0440\u0435 \u044d\u0442\u0430\u043f\u0430 \u0440\u0430\u0437\u0432\u0438\u0442\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>\u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0439 \u0432 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u043e\u0432;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0438 \u0444\u043e\u0440\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0434\u043b\u044f \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u044b;<\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0431\u043e\u0442\u0430 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u043d\u0430 \u043f\u0440\u043e\u0434\u0435 (\u043a\u0441\u0442\u0430\u0442\u0438, \u043e \u0442\u043e\u043c, \u043a\u0430\u043a \u043c\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c\u0441\u044f \u043d\u0430 \u043f\u0440\u043e\u0434\u0435, \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0432 <a href=\"https:\/\/habr.com\/ru\/company\/rtlabs\/blog\/646815\/\">\u0441\u0442\u0430\u0442\u044c\u0435<\/a> \u0414\u043c\u0438\u0442\u0440\u0438\u044f \u041f\u0438\u0440\u0443\u043c\u043e\u0432\u0430);<\/p>\n<\/li>\n<li>\n<p>\u0431\u043e\u0442 \u0441 \u043d\u0435\u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u043d\u044b\u043c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e\u043c \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0439 \u0438 \u043d\u0430\u0431\u043e\u0440\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b\u044c\u043d\u043e\u0441\u0442\u0435\u0439.<\/p>\n<\/li>\n<\/ul>\n<p>\u041d\u0430 \u043a\u0430\u0436\u0434\u043e\u043c \u0438\u0437 \u044d\u0442\u0430\u043f\u043e\u0432 \u043c\u044b \u043f\u0440\u0435\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043b\u0438 \u0440\u0430\u0437\u043d\u044b\u0435 \u0446\u0435\u043b\u0438, \u043d\u043e \u0438\u0445 \u0432\u0441\u0435\u0445 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u043b\u0430 \u043e\u0434\u043d\u043e \u2014 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043d\u0430\u0448\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0438\u043b\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u044b \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u043c\u0438 \u0432 \u0442\u0435\u043b\u0435\u0444\u043e\u043d\u0435.<\/p>\n<p>\u041c\u044b \u043d\u0430\u0434\u0435\u0435\u043c\u0441\u044f, \u0447\u0442\u043e \u043d\u0430\u0448\u0438 \u0438\u0434\u0435\u0438 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0443\u043b\u0443\u0447\u0448\u0438\u0442\u044c \u0432\u0430\u0448\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u0438\u043b\u0438 \u043f\u043e\u043c\u043e\u0433\u0443\u0442 \u0438\u0437\u0431\u0435\u0436\u0430\u0442\u044c \u0432\u0430\u043c \u043e\u0448\u0438\u0431\u043e\u043a \u043f\u0440\u0438 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0438 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p><a class=\"anchor\" name=\"2\" id=\"2\"><\/a><\/p>\n<h2>\u0412\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0439 \u0432 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a<\/h2>\n<p>\u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043b\u0435\u0442 \u043d\u0430\u0437\u0430\u0434 \u0443 \u043d\u0430\u0441 \u043f\u043e\u044f\u0432\u0438\u043b\u0430\u0441\u044c \u0437\u0430\u0434\u0430\u0447\u0430 \u043f\u043e \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u044e \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u0430\u043c\u0438 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 \u043d\u0430\u0448\u0438\u0445 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0445 \u0441\u0438\u0441\u0442\u0435\u043c. \u0417\u0430\u0434\u0430\u0447\u0430 \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u043b\u0430\u0441\u044c \u043e\u0442 \u0434\u0440\u0443\u0433\u0438\u0445:<\/p>\n<ul>\n<li>\n<p>\u043d\u0430\u043f\u0438\u0441\u0430\u043b \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u044b<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u043b\u0443\u0447\u0438\u043b \u0434\u043e\u0441\u0442\u0443\u043f \u0432 Jenkins <\/p>\n<\/li>\n<li>\n<p>\u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b \u0434\u0436\u043e\u0431<\/p>\n<\/li>\n<li>\n<p>\u0442\u0435\u0441\u0442-\u043c\u0435\u043d\u0435\u0434\u0436\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442 \u043e\u0442\u0447\u0435\u0442\u044b \u0432 \u043f\u043e\u0447\u0442\u0443<\/p>\n<\/li>\n<li>\n<p>PROFIT<\/p>\n<\/li>\n<\/ul>\n<p>\u041f\u0440\u043e\u0435\u043a\u0442 \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u043e\u0432 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u043b\u0441\u044f, \u0440\u0430\u0441\u0448\u0438\u0440\u044f\u043b\u043e\u0441\u044c \u0442\u0435\u0441\u0442\u043e\u0432\u043e\u0435 \u043f\u043e\u043a\u0440\u044b\u0442\u0438\u0435, \u0443\u0432\u0435\u043b\u0438\u0447\u0438\u0432\u0430\u043b\u043e\u0441\u044c \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u0442\u0440\u0435\u0431\u0438\u0442\u0435\u043b\u0435\u0439 \u043e\u0442\u0447\u0435\u0442\u0430. \u041d\u0430\u0447\u0430\u043b\u0438 \u043f\u043e\u0441\u0442\u0443\u043f\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u00ab\u0445\u043e\u0442\u0435\u043b\u043a\u0438\u00bb \u0438 \u043f\u0440\u043e\u044f\u0432\u0438\u043b\u0438\u0441\u044c \u043f\u0435\u0440\u0432\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b:<\/p>\n<ul>\n<li>\n<p>\u043d\u0435 \u0443 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0435\u0441\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a Jenkins \u0438 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c <\/p>\n<\/li>\n<li>\n<p>\u043d\u0435\u0443\u0434\u043e\u0431\u043d\u043e \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0438 \u0432 Jenkins<\/p>\n<\/li>\n<li>\n<p>\u043e\u0442\u0447\u0435\u0442\u044b \u0432 \u043f\u043e\u0447\u0442\u0443 \u043f\u0440\u0435\u0432\u0440\u0430\u0449\u0430\u043b\u0438\u0441\u044c \u0432 \u0441\u043f\u0430\u043c<\/p>\n<\/li>\n<\/ul>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p><a class=\"anchor\" name=\"2.1\" id=\"2.1\"><\/a><\/p>\n<h3>\u0412\u044b\u0431\u043e\u0440 \u0440\u0435\u0448\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0412 \u043d\u0430\u0448\u0435\u0439 \u043a\u043e\u043c\u043f\u0430\u043d\u0438\u0438 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c Telegram \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0430 \u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u0439 \u0432 Telegram \u043f\u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u044b\u043c \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u043c.<\/p>\n<p>\u041d\u0430 \u0442\u043e\u0442 \u043c\u043e\u043c\u0435\u043d\u0442 \u0431\u044b\u043b\u043e \u0443\u0436\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0432 \u0432\u0438\u0434\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u043e\u0432 \u0434\u043b\u044f Jenkins, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <a href=\"https:\/\/plugins.jenkins.io\/telegram-notifications\/#documentation\"><u>\u043f\u0435\u0440\u0432\u044b\u0439 \u0432 \u0432\u044b\u0434\u0430\u0447\u0435 Google<\/u><\/a>. \u041d\u043e \u043e\u0442 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043c\u044b \u043e\u0442\u043a\u0430\u0437\u0430\u043b\u0438\u0441\u044c \u043f\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u043c \u043f\u0440\u0438\u0447\u0438\u043d\u0430\u043c:<\/p>\n<ul>\n<li>\n<p>\u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043d\u0443\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u043f\u043e\u0442\u0440\u0430\u0442\u0438\u0442\u044c \u043d\u0430 \u0441\u043e\u0433\u043b\u0430\u0441\u043e\u0432\u0430\u043d\u0438\u0435 \u0435\u0433\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438<\/p>\n<\/li>\n<li>\n<p>\u0435\u0441\u043b\u0438 \u0431\u044b \u043c\u044b \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u0438 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 Jenkins, \u0442\u043e \u043f\u043b\u0430\u0433\u0438\u043d \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c \u0437\u0430\u043d\u043e\u0432\u043e<\/p>\n<\/li>\n<li>\n<p>\u043f\u043e\u0441\u043b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0437\u043c\u0435\u043d\u044f\u0442\u044c \u043f\u0430\u0439\u043f\u043b\u0430\u0439\u043d \u0434\u0436\u043e\u0431\u0430<\/p>\n<\/li>\n<li>\n<p>\u0431\u044b\u043b\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u043e\u0434 \u0441\u0432\u043e\u0438 \u043d\u0443\u0436\u0434\u044b<\/p>\n<\/li>\n<li>\n<p>\u043d\u0435\u0442 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438, \u0447\u0442\u043e \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0438 \u0434\u043e\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0442\u044c\u0441\u044f (\u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0435 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 \u0432\u044b\u0445\u043e\u0434\u0438\u043b\u043e 3 \u0433\u043e\u0434\u0430 \u043d\u0430\u0437\u0430\u0434) <\/p>\n<\/li>\n<\/ul>\n<p>\u041c\u044b \u043f\u0440\u0438\u043d\u044f\u043b\u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u0438\u0434\u0442\u0438 \u0434\u0440\u0443\u0433\u0438\u043c \u043f\u0443\u0442\u0435\u043c \u2014 \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043f\u0440\u044f\u043c\u043e \u0438\u0437 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430 \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<p><a class=\"anchor\" name=\"2.2\" id=\"2.2\"><\/a><\/p>\n<h3>\u0414\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0430<\/h3>\n<p>\u041d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435 \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u0443\u0434\u043e\u0431\u043d\u043e\u0439 \u0432 \u0434\u043b\u044f \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f.<\/p>\n<p>\u041d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u043b\u043e\u0441\u044c \u0442\u043e\u043b\u044c\u043a\u043e <a href=\"https:\/\/core.telegram.org\/bots#how-do-i-create-a-bot\"><u>\u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0431\u043e\u0442\u0430 \u0432 Telegram<\/u><\/a>, \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u0433\u043e \u0432 \u043e\u0431\u0449\u0438\u0439 \u0447\u0430\u0442 (\u0433\u0434\u0435 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u044b) \u0438 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0435\u0442\u043e\u0434\u043e\u0432 \u0432 \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a (Java + Junit 4 + Cucumber).<\/p>\n<p>\u0411\u044b\u043b \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d \u043c\u0435\u0442\u043e\u0434 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0432 Telegram \u0447\u0435\u0440\u0435\u0437 API:<\/p>\n<pre><code class=\"java\">public static void report(String text) throws IOException{          String urlString = \"https:\/\/api.telegram.org\/bot%s\/sendMessage?parse_mode=HTML&amp;chat_id=%s&amp;text=%s\";         urlString = String.format(urlString, TOKEN, CHAT, text);         \/\/\u043f\u0440\u043e\u043a\u0441\u0438   \/\/      Proxy proxy = new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(PROXY_HOST, PROXY_PORT));         \/\/\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u044f \u0432 \u043f\u0440\u043e\u043a\u0441\u0438         Authenticator.setDefault(new MyAuthenticator());          URL url = new URL(urlString);   \/\/      URLConnection conn = url.openConnection(proxy);         URLConnection conn = url.openConnection();          ...     }<\/code><\/pre>\n<p>\u0412 \u043d\u0430\u0448\u0435\u043c \u0444\u0440\u0435\u0439\u043c\u0432\u043e\u0440\u043a\u0435 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043d\u043e\u0432\u044b\u0445 \u043c\u0435\u0442\u043e\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0447\u0435\u0440\u0435\u0437 REST API Telegram:<\/p>\n<ul>\n<li>\n<p><code>@After<\/code>, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u043b \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043f\u043e\u0441\u043b\u0435 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430 \u0432 \u0447\u0430\u0442<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"java\">@After     public void tearDown(Scenario scenario) throws IOException {                  ... \u0432\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043a\u0430\u043a\u0438\u0435-\u0442\u043e \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u043f\u043e\u0441\u043b\u0435 \u0442\u0435\u0441\u0442\u0430          String result;         if (scenario.isFailed()) {                          ... \u0444\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0441\u0442\u0440\u043e\u043a\u0443 \u0434\u043b\u044f \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c, \u0435\u0441\u043b\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0430 \u043d\u0443\u0436\u043d\u0430 (\u0438\u043d\u0430\u0447\u0435 \u043f\u0440\u043e\u0441\u0442\u043e \u043b\u043e\u0433\u0438\u0440\u0443\u0435\u043c)                          if (System.getProperty(\"tg\") != null) {                 report(result);             }         }         ...     } <\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435!<\/summary>\n<div class=\"spoiler__content\">\n<p>\u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0440\u0435\u043f\u043e\u0440\u0442\u044b \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u043b\u0438 \u043d\u0430 \u0432\u0441\u0435 \u0442\u0435\u0441\u0442\u044b, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u044b\u0435. \u041d\u0438\u043a\u043e\u0433\u0434\u0430 \u0442\u0430\u043a \u043d\u0435 \u0434\u0435\u043b\u0430\u0439\u0442\u0435, \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0432\u044b\u0439\u0434\u0443\u0442 \u0438\u0437 \u0447\u0430\u0442\u0430 \u043f\u043e\u0441\u043b\u0435 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0436\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430. \u041f\u0440\u0438\u043b\u0430\u0433\u0430\u0435\u043c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<\/p>\n<\/div>\n<\/details>\n<ul>\n<li>\n<p><code>@BeforeClass<\/code> \u0438 <code>@AfterClass<\/code> \u0432 Junit RunnerClass, \u0447\u0442\u043e\u0431\u044b \u043e\u043f\u043e\u0432\u0435\u0441\u0442\u0438\u0442\u044c \u043e \u043d\u0430\u0447\u0430\u043b\u0435 \u0442\u0435\u0441\u0442\u043e\u0432 \u0438 \u0438\u0445 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u0438<\/p>\n<\/li>\n<\/ul>\n<pre><code class=\"java\">@RunWith(Cucumber.class)  @CucumberOptions(        \u2026\u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043e\u0433\u0443\u0440\u0446\u0430 )   public class RunnerTest {     \u2026     @BeforeClass     public static void start_report() throws Exception {         \u2026             \/\/\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u043f\u043e\u0440\u0442\u0430 \u0432 \u0442\u0433         if (System.getProperty(\"tg\") == null){             \/\/\u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u0440\u0435\u043f\u043e\u0440\u0442\u044b \u0432 \u0442\u0433         } else {            String text;            \u2026 \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f             report(text);         }        \u2026     }      @AfterClass     public static void finish_report() throws Exception {         \u2026             \/\/\u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0440\u0435\u043f\u043e\u0440\u0442\u0430 \u0432 \u0442\u0433         if (System.getProperty(\"tg\") == null){             \/\/\u043d\u0435 \u043d\u0443\u0436\u043d\u044b \u0440\u0435\u043f\u043e\u0440\u0442\u044b \u0432 \u0442\u0433         } else {            String text;            \u2026 \u0424\u043e\u0440\u043c\u0438\u0440\u0443\u0435\u043c \u0442\u0435\u043a\u0441\u0442 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f             report(text);         }        \u2026     } }<\/code><\/pre>\n<p>\u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u0438\u043c \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0434\u043e\u0440\u0430\u0431\u043e\u0442\u043a\u0430\u043c \u0443 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u043e\u0432 \u0435\u0441\u0442\u044c \u0432\u0441\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u043f\u0440\u043e\u0432\u0435\u0434\u0435\u043d\u043d\u043e\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438: <\/p>\n<ul>\n<li>\n<p>\u0441\u0440\u0435\u0434\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f <\/p>\n<\/li>\n<li>\n<p>\u0442\u0435\u0433\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0430<\/p>\n<\/li>\n<li>\n<p>\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u0440\u043e\u0448\u0435\u0434\u0448\u0438\u0445\/\u0443\u043f\u0430\u0432\u0448\u0438\u0445 \u0442\u0435\u0441\u0442\u043e\u0432<\/p>\n<\/li>\n<li>\n<p>\u0434\u0435\u0442\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f \u043f\u043e \u0443\u043f\u0430\u0432\u0448\u0438\u043c \u043a\u0435\u0439\u0441\u0430\u043c<\/p>\n<\/li>\n<\/ul>\n<p>\u042d\u0442\u0438\u0445 \u0434\u0430\u043d\u043d\u044b\u0445 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0434\u043b\u044f \u043f\u0440\u0438\u043d\u044f\u0442\u0438\u044f \u0440\u0435\u0448\u0435\u043d\u0438\u044f \u043e\u0431 \u0443\u0441\u043f\u0435\u0448\u043d\u043e\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0440\u0435\u043b\u0438\u0437\u0430.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0414\u0430\u043d\u043d\u044b\u0439 \u0432\u0438\u0434 \u043e\u0442\u0447\u0435\u0442\u043d\u043e\u0441\u0442\u0438 \u0445\u043e\u0440\u043e\u0448\u043e \u043f\u0440\u0438\u0436\u0438\u043b\u0441\u044f \u043d\u0430 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0435. \u041e\u0434\u043d\u0430\u043a\u043e \u043e\u043d \u043f\u0435\u0440\u0435\u0436\u0438\u043b \u043c\u043d\u043e\u0436\u0435\u0441\u0442\u0432\u043e \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u0441\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0441\u043e\u0431\u0438\u0440\u0430\u044e\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e), \u043d\u043e \u044d\u0442\u043e \u0443\u0436\u0435 \u0434\u0440\u0443\u0433\u0430\u044f \u0438\u0441\u0442\u043e\u0440\u0438\u044f.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p><a class=\"anchor\" name=\"3\" id=\"3\"><\/a><\/p>\n<h2>\u041d\u0430\u0448 \u043f\u0435\u0440\u0432\u044b\u0439 \u0431\u043e\u0442<\/h2>\n<p>\u0420\u0430\u043d\u0435\u0435 \u043c\u044b \u0433\u043e\u0432\u043e\u0440\u0438\u043b\u0438, \u0447\u0442\u043e \u043d\u0435 \u0443 \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u0430\u0432\u0442\u043e\u0442\u0435\u0441\u0442\u043e\u0432 \u0431\u044b\u043b\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u0432 Jenkins. \u0411\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0440\u0430\u0437 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043d\u0435 \u0438\u0434\u0435\u0442 \u0432 Jenkins, \u0442\u043e Jenkins \u043f\u0440\u0438\u0434\u0435\u0442 \u043a \u043d\u0438\u043c \u0432 \u0442\u0435\u043b\u0435\u0444\u043e\u043d. <\/p>\n<p>\u0418\u0437\u0443\u0447\u0438\u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e, \u0441\u0442\u0430\u0442\u044c\u0438 \u043d\u0430 habr \u0438 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0433\u043e\u0442\u043e\u0432\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439, \u0431\u044b\u043b\u043e \u0440\u0435\u0448\u0435\u043d\u043e \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0431\u043e\u0442\u0430 \u0432 Telegram.<\/p>\n<p><a class=\"anchor\" name=\"3.1\" id=\"3.1\"><\/a><\/p>\n<h3>\u041a\u043e\u043d\u0446\u0435\u043f\u0446\u0438\u044f<\/h3>\n<p>\u041d\u0430\u0448 \u0431\u043e\u0442 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0434\u0430\u0442\u044c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0442\u0435\u0441\u0442\u044b, \u0441\u0433\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043e\u0442\u0447\u0435\u0442 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e.<\/p>\n<p><a class=\"anchor\" name=\"3.1.1\" id=\"3.1.1\"><\/a><\/p>\n<h4>\u0420\u043e\u043b\u0435\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c<\/h4>\n<p>\u041c\u043e\u0434\u0435\u043b\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0430\u0441\u044c \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e\u0439. \u041f\u0440\u0435\u0434\u043f\u043e\u043b\u0430\u0433\u0430\u043b\u043e\u0441\u044c, \u0447\u0442\u043e \u043a\u0430\u0436\u0434\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c, \u043d\u0430\u043f\u0438\u0441\u0430\u0432\u0448\u0438\u0439 \u0431\u043e\u0442\u0443, \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 \u0431\u0430\u0437\u0443 \u0434\u0430\u043d\u043d\u044b\u0445 \u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0440\u043e\u043b\u044c &#8212; \u043d\u0435\u0430\u0432\u0442\u043e\u0440\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c. \u0414\u0430\u043b\u0435\u0435 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u043c\u043e\u0436\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0435\u043c\u0443 \u043f\u0440\u0430\u0432\u0430. \u041c\u043e\u0434\u0435\u043b\u044c \u0432\u043a\u043b\u044e\u0447\u0430\u043b\u0430 \u0432 \u0441\u0435\u0431\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0440\u043e\u043b\u0438:<\/p>\n<ul>\n<li>\n<p><code>UNAUTHORIZED<\/code><strong> <\/strong>\u2014<strong> <\/strong>\u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442<\/p>\n<\/li>\n<li>\n<p><code>USER<\/code><strong> <\/strong>\u2014<strong> <\/strong>\u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u043e\u0442\u0447\u0435\u0442\u043e\u0432 \u0438 \u0441\u043f\u0440\u0430\u0432\u043e\u0447\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438<\/p>\n<\/li>\n<li>\n<p><code>JENKINS_USER<\/code><strong> <\/strong>\u2014<strong> <\/strong>\u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0432 \u0441\u0435\u0431\u044f \u043f\u0440\u0430\u0432\u0430 USER \u0438 \u0438\u043c\u0435\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c \u0442\u0435\u0441\u0442\u044b<\/p>\n<\/li>\n<li>\n<p><code>ADMIN<\/code><strong> <\/strong>\u2014<strong> <\/strong>\u0438\u043c\u0435\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a\u043e \u0432\u0441\u0435\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c<\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"3.1.2\" id=\"3.1.2\"><\/a><\/p>\n<h4>\u041a\u043e\u043c\u0430\u043d\u0434\u044b \u0431\u043e\u0442\u0430<\/h4>\n<p>\u0412 \u0431\u043e\u0442\u0435 \u043c\u044b \u043f\u043b\u0430\u043d\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b:<\/p>\n<ul>\n<li>\n<p><code>\/test<\/code> \u2014 \u0437\u0430\u043f\u0443\u0441\u043a \u0442\u0435\u0441\u0442\u043e\u0432, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442 \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0440\u0435\u0434\u044b \u0438 \u0442\u0435\u0433\u0438 \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430<\/p>\n<\/li>\n<li>\n<p><code>\/reports<\/code> \u2014 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f excel \u043e\u0442\u0447\u0435\u0442\u0430 \u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0438\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043a \u043e\u0442\u0447\u0435\u0442\u0443 \u043e \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438<\/p>\n<\/li>\n<li>\n<p><code>\/links<\/code> \u2014 \u043f\u043e\u043b\u0435\u0437\u043d\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438<\/p>\n<\/li>\n<li>\n<p><code>\/help<\/code> \u2014 \u0441\u043f\u0440\u0430\u0432\u043a\u0430 \u043f\u043e \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c<\/p>\n<\/li>\n<li>\n<p><code>\/anekdot<\/code> \u2014 \u043f\u0440\u0438\u0441\u043b\u0430\u0442\u044c \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b \u0430\u043d\u0435\u043a\u0434\u043e\u0442 \u0432 \u0447\u0430\u0442 (\u043d\u0435\u043c\u043d\u043e\u0433\u043e \u044e\u043c\u043e\u0440\u0430 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u0432\u0440\u0435\u0434\u0438\u0442)<\/p>\n<\/li>\n<li>\n<p><code>\/access<\/code> \u2014 \u043a\u043e\u043c\u0430\u043d\u0434\u0430 \u0434\u043b\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0431\u043e\u0442\u0430, \u0447\u0442\u043e\u0431\u044b \u0434\u0430\u0432\u0430\u0442\u044c \u043b\u044e\u0434\u044f\u043c \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u043c \u043a\u043e\u043c\u0430\u043d\u0434\u0430\u043c<\/p>\n<\/li>\n<\/ul>\n<p><a class=\"anchor\" name=\"3.2\" id=\"3.2\"><\/a><\/p>\n<h3>\u0420\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f<\/h3>\n<p>\u042d\u0442\u0430 \u0447\u0430\u0441\u0442\u044c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0435\u0439 \u0438 \u043c\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0437\u0434\u0435\u0441\u044c \u0443\u0434\u043e\u0431\u043d\u044b\u0439 \u044f\u043a\u043e\u0440\u044c \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0430 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0439 <a href=\"#4\"><u>\u0433\u043b\u0430\u0432\u0435<\/u><\/a>.<\/p>\n<p>\u0411\u043e\u0442\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u044b\u0432\u0430\u043b\u0438 \u043d\u0430 Java, \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f\u0445 \u043f\u043e\u0434\u043d\u044f\u043b\u0438 \u0411\u0414 PostgreSQL. \u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430:<\/p>\n<pre><code class=\"java\">&lt;dependency>  \u00a0\u00a0\u00a0 &lt;groupId>org.telegram&lt;\/groupId>  \u00a0\u00a0\u00a0 &lt;artifactId>telegrambots&lt;\/artifactId>  \u00a0\u00a0\u00a0 &lt;version>4.9.1&lt;\/version>  &lt;\/dependency><\/code><\/pre>\n<p>\u0411\u044b\u043b\u043e \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043d\u0430\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d \u043e\u0442 <code>TelegramLongPollingCommandBot<\/code>. \u0412 \u044d\u0442\u043e\u043c \u043a\u043b\u0430\u0441\u0441\u0435 \u043c\u044b \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c \u0438\u043c\u044f \u0438 \u0442\u043e\u043a\u0435\u043d \u043d\u0430\u0448\u0435\u0433\u043e \u0431\u043e\u0442\u0430, \u0434\u0430\u043b\u0435\u0435 \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c\u00a0\u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0438 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0431\u0435\u0437 \u043a\u043e\u043c\u0430\u043d\u0434: <\/p>\n<pre><code class=\"java\">public final class RunnerBot extends TelegramLongPollingCommandBot {     \/\/ \u0438\u043c\u044f \u0431\u043e\u0442\u0430, \u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u043c\u044b \u0443\u043a\u0430\u0437\u0430\u043b\u0438 \u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430 \u0443 BotFather     \/\/ \u0438 \u0442\u043e\u043a\u0435\u043d, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0432 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0435     private static final String BOT_NAME = \"\u0438\u043c\u044f_\u0432\u0430\u0448\u0435\u0433\u043e_\u0431\u043e\u0442\u0430\";     private static final String BOT_TOKEN = \"\u0442\u043e\u043a\u0435\u043d_\u0432\u0430\u0448\u0435\u0433\u043e_\u0431\u043e\u0442\u0430\";       public RunnerBot(DefaultBotOptions botOptions) {          super(botOptions, BOT_NAME);          \/\/ \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0432\u0441\u0435\u0445 \u043a\u0430\u0441\u0442\u043e\u043c\u043d\u044b\u0445 \u043a\u043e\u043c\u0430\u043d\u0434         System.out.println(\"Registering '\/test'...\");         register(new TestCommand());         ... \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u043c \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043a\u043e\u043c\u0430\u043d\u0434\u044b          \/\/ \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u044b         System.out.println(\"Registering default action'...\");         registerDefaultAction(((absSender, message) -> {             ... \u043f\u0438\u0448\u0435\u043c, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0442\u044c \u0441 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u043e\u0439 \u043a\u043e\u043c\u0430\u043d\u0434\u043e\u0439         }));     }      @Override     public String getBotToken() {         return BOT_TOKEN;     }      \/\/ \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043d\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0449\u0435\u0433\u043e\u0441\u044f \u0441 '\/'     @Override     public void processNonCommandUpdate(Update update) {         System.out.println(\"Processing non-command update...\");         if (!update.hasMessage()) {            System.out.println(\"Update doesn't have a body!\");             throw new IllegalStateException(\"Update doesn't have a body!\");         }     } }<\/code><\/pre>\n<p>\u0414\u0430\u043b\u0435\u0435 \u0431\u043e\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432 Main-Class:<\/p>\n<pre><code class=\"java\">public class BotInitializer {      private static final String PROXY_HOST = \"XX.XX.XX.XX\";     private static final int PROXY_PORT = 8080; \/\/    private static final String PROXY_USER = \"bot\"; \/\/    private static final String PROXY_PASSWORD = \"bot\";      public static void main(String[] args) {          try {              Authenticator.setDefault(new MyAuthenticator());              System.out.println(\"Initializing API context...\");<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\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-343308","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/343308","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=343308"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/343308\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=343308"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=343308"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=343308"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}