{"id":333497,"date":"2022-05-23T03:00:23","date_gmt":"2022-05-23T03:00:23","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=333497"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=333497","title":{"rendered":"<span>\u00ab\u0410\u0442\u0430\u043a\u0430 \u043a\u043b\u043e\u043d\u043e\u0432\u00bb \u0438\u043b\u0438 \u043f\u0438\u0448\u0435\u043c \u043c\u0430\u043a\u0440\u043e\u0441 \u0434\u043b\u044f \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f GitLab \u0432\u043d\u0443\u0442\u0440\u044c XWiki<\/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\/541\/c15\/65e\/541c1565e6f3c6edad93f4f23d673869.png\" width=\"780\" height=\"462\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/541\/c15\/65e\/541c1565e6f3c6edad93f4f23d673869.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u044f &#171;\u0440\u0430\u0437\u0434\u043e\u0431\u044b\u043b&#187; \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043f\u0440\u0438\u0448\u043b\u0430 \u043f\u043e\u0440\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0441\u0435\u0440\u0438\u044e \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u043e\u0432 \u043f\u043e XWiki.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u0438\u0445 \u0438\u0437 \u0441\u0442\u0430\u0442\u0435\u0439 <a href=\"https:\/\/habr.com\/ru\/users\/maxk82\/\" rel=\"noopener noreferrer nofollow\">MaxK82<\/a> \u0441\u043f\u0440\u043e\u0441\u0438\u043b \u0443 \u043c\u0435\u043d\u044f, \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u043a\u0430\u043a-\u0442\u043e \u0432 XWiki \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0438\u0437 git \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u0442\u0430\u043a \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u043b\u0430\u0434\u0438\u0442\u044c \u0435\u0451 \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. <br \/>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f <strong>\u043d\u0435<\/strong> <strong>\u043e\u0442\u0432\u0435\u0442\u0438\u0442 \u043d\u0430 \u0435\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441<\/strong>, \u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0436\u0435\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0442\u043e\u0438\u0442 &#171;\u043a\u043e\u043f\u0430\u0442\u044c&#187;.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0441 \u0432\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/667166#a1\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439, \u0437\u0430\u0442\u043e \u0441\u0432\u043e\u0439 \u043c\u0430\u043a\u0440\u043e\u0441 \u0432 XWiki<\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/667166\/#a2\" rel=\"noopener noreferrer nofollow\">\u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u044f\u043c\u043e \u0432 XWiki \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 GitLab<\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/667166\/#a3\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u043c Readme.md \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b XWiki<\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>C\u0440\u0430\u0437\u0443 \u0434\u0430\u043c <strong>\u0434\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440<\/strong> &#8212; \u044f \u0442\u0435\u0445\u043f\u0438\u0441, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442. <br \/>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435, \u0445\u043e\u0440\u043e\u0448\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u0434\u0430 \u0438 \u0443\u0434\u0430\u0447\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439. <br \/>\u042d\u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0435\u0439 \u0438\u043b\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c docops, \u043a\u043e\u0442\u043e\u0440\u044b\u043c  \u0432\u044b\u043f\u0430\u0434\u0435\u0442 \u0447\u0435\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 XWiki.<\/p>\n<p>\u0423\u0434\u0435\u043b\u0438\u043c \u043f\u0430\u0440\u0443 \u043c\u0438\u043d\u0443\u0442 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u043c\u0443:<\/p>\n<ol>\n<li>\n<p>\u0414\u043b\u044f \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0430 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u0432 Gitlab (\u043d\u0435 \u0432\u0430\u0436\u043d\u043e \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043b\u0438 \u043d\u0430 \u0432\u0430\u0448\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435).<\/p>\n<\/li>\n<li>\n<p>\u041d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c access token \u043a \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0443.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0443\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e &#171;Learn GitLab&#187; (\u043d\u0435 \u043f\u043e\u043c\u043d\u044e \u043e\u0442\u043a\u0443\u0434\u0430 \u043e\u043d \u0443 \u043c\u0435\u043d\u044f \u0432\u0437\u044f\u043b\u0441\u044f). \u041d\u043e \u0432\u0430\u043c \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u043b\u044e\u0431\u043e\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0435\u0441\u0442\u044c Readme.md (\u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 markdown \u0444\u0430\u0439\u043b). \u041b\u043e\u0433\u0438\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0445\u043e\u0436\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0441\u0432\u043e\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b docker \u0432\u0435\u0440\u0441\u0438\u044e XWiki 13.10.5 \u0441\u043e Standart Flavor, \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0438 \u0432 XWiki 12.X. <\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 <a href=\"https:\/\/extensions.xwiki.org\/xwiki\/bin\/view\/Extension\/Git%20Module\" rel=\"noopener noreferrer nofollow\">GitAPI<\/a>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/461\/a15\/603\/461a15603ce51b6e28dcf88932471d5d.png\" width=\"741\" height=\"230\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/461\/a15\/603\/461a15603ce51b6e28dcf88932471d5d.png\"\/><figcaption><\/figcaption><\/figure>\n<\/li>\n<\/ol>\n<p>\u041d\u0443 \u0438 \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 <a href=\"https:\/\/extensions.xwiki.org\/xwiki\/bin\/view\/Extension\/MarkdownSyntax\/Markdown%20Syntax%201.2\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 Markdown<\/a>.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/28c\/2b8\/71c\/28c2b871cd51a27090dcc02132e517e8.png\" width=\"891\" height=\"219\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/28c\/2b8\/71c\/28c2b871cd51a27090dcc02132e517e8.png\"\/><figcaption><\/figcaption><\/figure>\n<p>.<\/p>\n<p><a class=\"anchor\" name=\"a1\" id=\"a1\"><\/a><\/p>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435 \u0443 Xwiki \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 git, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u043c\u043f\u043e\u0440\u0442 \u0441 <a href=\"https:\/\/snippets.xwiki.org\/xwiki\/bin\/view\/Extension\/Github%20wiki%20import\/\" rel=\"noopener noreferrer nofollow\">GitHub wiki<\/a> \u0438\u043b\u0438 \u0432\u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a <a href=\"https:\/\/snippets.xwiki.org\/xwiki\/bin\/view\/Extension\/GitHub%20Integration\" rel=\"noopener noreferrer nofollow\">GitHub \u0447\u0435\u0440\u0435\u0437 \u0435\u0433\u043e API<\/a>.<br \/>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0412\u0430\u043c \u0443\u0434\u0430\u0441\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c <strong>\u043e\u0447\u0435\u043d\u044c \u0442\u043e\u043f\u043e\u0440\u043d\u044b\u0439<\/strong> \u043c\u0430\u043a\u0440\u043e\u0441, \u0435\u0433\u043e \u043f\u0440\u043e\u043e\u0431\u0440\u0430\u0437  \u043c\u043d\u0435 \u0431\u044b\u043b \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u043e\u043c\u0435\u043d \u0441 XWiki \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 CORS \u043d\u0430\u0448\u0435\u0433\u043e GitLab.<\/p>\n<p><strong>\u041f\u0440\u043e\u0448\u0443 \u0432\u0430\u0441<\/strong> \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0439\u0442\u0435 \u044d\u0442\u043e\u0442 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b \u0441\u043a\u043e\u0440\u0435\u0435 \u043a\u0430\u043a \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044e, \u0430 \u043d\u0435 \u043a\u0430\u043a \u0447\u0435\u0442\u043a\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0446\u0435\u043b\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 XWiki \u0440\u0430\u0434\u0438 1 markdown \u0444\u0430\u0439\u043b\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u043b\u0443\u0447\u0448\u0435\u0439 \u0438\u0434\u0435\u0435\u0439. <\/p>\n<p>\u041f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043c\u0430\u043a\u0440\u043e\u0441. <br \/>\u041c\u0430\u043a\u0440\u043e\u0441 \u0432 Xwiki &#8212; \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0432 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 Conflunce, \u0442\u043e \u0432\u0430\u043c \u044d\u0442\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u043e.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043c\u0430\u043a\u0440\u043e\u0441 \u0432 XWiki \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/www.xwiki.org\/xwiki\/bin\/view\/Documentation\/DevGuide\/Tutorials\/WritingMacros\/WikiMacroTutorial\/\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438.<\/a><\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0440\u043d\u0435. <br \/>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043d\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e, \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/26f\/1db\/08e\/26f1db08ef8fa41c05ac863e82eb2ed5.png\" alt=\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u043b\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u0430\" title=\"\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u043b\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u0430\" width=\"794\" height=\"550\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/26f\/1db\/08e\/26f1db08ef8fa41c05ac863e82eb2ed5.png\"\/><figcaption>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u043b\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u0430<\/figcaption><\/figure>\n<p>\u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0432\u043e\u0437\u044c\u043c\u0435\u0442\u0435\u0441\u044c \u0437\u0430 \u0434\u0435\u043b\u043e \u0432\u0441\u0435\u0440\u044c\u0435\u0437, \u0442\u043e \u044f \u0431\u044b \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043b \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b &#171;Macros&#187;). <em><br \/><\/em><br \/>\u0414\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0436\u0430\u0442\u044c \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0443\u044e \u043a\u043b\u0430\u0432\u0438\u0448\u0443 &#171;O&#187; \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043f\u043e\u0441\u043b\u0435 \u0435\u0451 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f <br \/><em>(\u0435\u0441\u043b\u0438 \u0447\u0443\u0434\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043a\u0430\u043a \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 <\/em><a href=\"https:\/\/habr.com\/ru\/post\/573626\/\" rel=\"noopener noreferrer nofollow\"><em>\u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439<\/em><\/a><em>).<\/em><\/p>\n<p>\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 <code>WikiMacroClass<\/code><\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9aa\/716\/186\/9aa71618669491df0f848def2ae26fa0.png\" width=\"571\" height=\"107\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9aa\/716\/186\/9aa71618669491df0f848def2ae26fa0.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u042d\u0442\u043e \u043f\u043e \u0441\u0443\u0442\u0438 \u0438 \u0435\u0441\u0442\u044c \u0441\u0430\u043c \u043c\u0430\u043a\u0440\u043e\u0441, \u043d\u043e \u043f\u0440\u0435\u0436\u0434\u0435, \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0435\u0433\u043e \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u0430<code>WikiMacroParameterClass<\/code> \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/9a5\/532\/5e6\/9a55325e6f2004a8854c8195a5a8a997.png\" width=\"551\" height=\"44\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/9a5\/532\/5e6\/9a55325e6f2004a8854c8195a5a8a997.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 6 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438, \u043e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u043d\u0430\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c \u0438\u0437 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u044f \u0434\u0430\u043c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430\u043c\u0438 \u043d\u0438\u0436\u0435.<\/p>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/83f\/52b\/3dd\/83f52b3dd88fd0cf16db7fb9545df57e.png\" width=\"480\" height=\"541\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/83f\/52b\/3dd\/83f52b3dd88fd0cf16db7fb9545df57e.png\"\/><figcaption><\/figcaption><\/figure>\n<p>\u041c\u044b \u0437\u0430\u0434\u0430\u0435\u043c \u043f\u0443\u0442\u044c \u043a \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044e \u0432 git. <\/p>\n<ul>\n<li>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430  (GIT_URL), \u0442\u043e \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0435 \u0432 UI \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 &#8212; \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0443 (\u0441\u0441\u044b\u043b\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443\u0442).<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 &#8212; \u0435\u0441\u043b\u0438 \u0434\u0430, \u0442\u043e \u043c\u0430\u043a\u0440\u043e\u0441 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c\u0441\u044f \u0431\u0435\u0437 \u0432\u0432\u043e\u0434\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0435\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0442\u044c, \u0442\u043e \u043f\u043e\u043b\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0438\u043f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 &#8212; \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u044f \u0442\u0430\u043a \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b JAVA \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 String. <em>\u0415\u0441\u043b\u0438 \u0447\u0435\u0441\u0442\u043d\u043e, \u044f \u0443\u0436\u0435 \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u043f\u043e\u043c\u043d\u044e, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0442\u0430\u043a.<\/em><\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u044f \u0441\u043f\u0440\u044f\u0447\u0443 \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e.<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/4dd\/dfb\/85e\/4dddfb85ebaed7bed7fceb89a16b52ce.png\" alt=\"\u0410\u0434\u0440\u0435\u0441 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 XWiki\" title=\"\u0410\u0434\u0440\u0435\u0441 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 XWiki\" width=\"461\" height=\"562\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/4dd\/dfb\/85e\/4dddfb85ebaed7bed7fceb89a16b52ce.png\"\/><figcaption>\u0410\u0434\u0440\u0435\u0441 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 XWiki<\/figcaption><\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/57b\/2db\/c08\/57b2dbc081fbae9669d0c3be869c181a.png\" alt=\"\u041f\u0443\u0442\u044c \u043a \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0435\u0433\u043e \u0438\u043c\u044f.\" title=\"\u041f\u0443\u0442\u044c \u043a \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0435\u0433\u043e \u0438\u043c\u044f.\" width=\"418\" height=\"485\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/57b\/2db\/c08\/57b2dbc081fbae9669d0c3be869c181a.png\"\/><figcaption>\u041f\u0443\u0442\u044c \u043a \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0435\u0433\u043e \u0438\u043c\u044f.<\/figcaption><\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/a71\/0b3\/cb4\/a710b3cb44f1689441ae8e4246ed0f1b.png\" alt=\"\u0424\u043e\u0440\u043c\u0430\u0442 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u0435\u043a\u0441\u0442 (\u0432\u0434\u0440\u0443\u0433 \u043c\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u043c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e markdown)\" title=\"\u0424\u043e\u0440\u043c\u0430\u0442 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u0435\u043a\u0441\u0442 (\u0432\u0434\u0440\u0443\u0433 \u043c\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u043c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e markdown)\" width=\"417\" height=\"471\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/a71\/0b3\/cb4\/a710b3cb44f1689441ae8e4246ed0f1b.png\"\/><figcaption>\u0424\u043e\u0440\u043c\u0430\u0442 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u0435\u043a\u0441\u0442 (\u0432\u0434\u0440\u0443\u0433 \u043c\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u043c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e markdown)<\/figcaption><\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1eb\/936\/e04\/1eb936e04d574cbe04b9e4ba8fb87da0.png\" alt=\"\u0412\u0435\u0442\u043a\u0430 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0449\u0435\u043c \u0444\u0430\u0439\u043b.\" title=\"\u0412\u0435\u0442\u043a\u0430 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0449\u0435\u043c \u0444\u0430\u0439\u043b.\" width=\"235\" height=\"510\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1eb\/936\/e04\/1eb936e04d574cbe04b9e4ba8fb87da0.png\"\/><figcaption>\u0412\u0435\u0442\u043a\u0430 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0449\u0435\u043c \u0444\u0430\u0439\u043b.<\/figcaption><\/figure>\n<figure class=\"\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/084\/706\/64e\/08470664e242043cf6a32f3ec4dc3cc9.png\" alt=\"\u0418\u043d\u043e\u0433\u0434\u0430 \u0431\u044b\u0432\u0430\u044e\u0442 \u0433\u043b\u044e\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u0430\u043f\u043a\u0438 \u043f\u0435\u0440\u0435\u0434 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c.\" title=\"\u0418\u043d\u043e\u0433\u0434\u0430 \u0431\u044b\u0432\u0430\u044e\u0442 \u0433\u043b\u044e\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u0430\u043f\u043a\u0438 \u043f\u0435\u0440\u0435\u0434 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c.\" width=\"391\" height=\"532\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/084\/706\/64e\/08470664e242043cf6a32f3ec4dc3cc9.png\"\/><figcaption>\u0418\u043d\u043e\u0433\u0434\u0430 \u0431\u044b\u0432\u0430\u044e\u0442 \u0433\u043b\u044e\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u0430\u043f\u043a\u0438 \u043f\u0435\u0440\u0435\u0434 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c.<\/figcaption><\/figure>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0415\u0441\u043b\u0438 \u0431\u043e\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u0437\u0430\u0431\u044b\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0435\u0431\u044f \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0435 <a href=\"#a3\" rel=\"noopener noreferrer nofollow\">UI \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b<\/a>.<br \/>\u0422\u0430\u043a \u0436\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0431\u0440\u0430\u0442\u044c \u0438\u0437 <a href=\"https:\/\/github.com\/bosonbeard\/Funny-models-and-scripts\/tree\/master\/7.%20Xwiki\/FirstMacroForGit\" rel=\"noopener noreferrer nofollow\"><strong>GitHub<\/strong><\/a> (\u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0435\u0451 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0435\u043b\u044c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 &#171;\u041a\u043e\u043d\u0442\u0435\u043d\u0442&#187;)<\/p>\n<p>\u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u041c\u0430\u043a\u0440\u043e\u0441\u0443<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/525\/801\/806\/525801806b4894c51117b3b18198be8e.png\" alt=\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\" title=\"\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\" width=\"876\" height=\"911\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/525\/801\/806\/525801806b4894c51117b3b18198be8e.png\"\/><figcaption>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u0430<\/figcaption><\/figure>\n<ul>\n<li>\n<p>ID \u043c\u0430\u043a\u0440\u043e\u0441\u0430 &#8212; \u0442\u043e \u043a\u0430\u043a \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u0430 &#8212; \u0442\u043e \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 UI \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 &#8212; \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f &#8212; \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0434\u043b\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432 \u043f\u043e \u0442\u0438\u043f\u0430\u043c \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c  \u0432 \u043b\u0438\u043d\u0438\u044e &#8212; \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u043d\u0443\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0441\u0442\u0443\u043f \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441\u0430 &#8212; \u0432 \u043a\u0430\u043a\u0438\u0445 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c (\u0443 \u043d\u0430\u0441 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0438\u043a\u0438)<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0432 \u043c\u0430\u043a\u0440\u043e\u0441 &#8212; \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u0442<\/p>\n<\/li>\n<li>\n<p>\u0422\u0438\u043f \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 &#8212; \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 Wiki.<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a\u043e\u0434 \u043c\u0430\u043a\u0440\u043e\u0441\u0430.<br \/>\u041d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0435 \u0432\u0430\u0448 \u0442\u0440\u0443\u0434 \u0438 \u0432\u0437\u0434\u043e\u0445\u043d\u0438\u0442\u0435 \u0441 \u043e\u0431\u043b\u0435\u0433\u0447\u0435\u043d\u0438\u0435\u043c.<\/p>\n<h2>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f<\/h2>\n<p><a class=\"anchor\" name=\"a2\" id=\"a2\"><\/a><\/p>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a \u043a\u043e\u0434\u0443.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>{{groovy}} import org.apache.commons.io.* import org.eclipse.jgit.api.* import org.eclipse.jgit.lib.* import org.eclipse.jgit.revwalk.* import org.eclipse.jgit.storage.file.* import org.eclipse.jgit.transport.*; import org.xwiki.environment.*; import org.apache.commons.io.FilenameUtils; import groovy.io.*; import org.apache.commons.io.FileUtils;  Git git;   def CredentialsProvider getCredentialsProvider() {   return new UsernamePasswordCredentialsProvider(\"UXXXX\", \"glXXXt-XXXXXXXXXXXXXXXXXXXXX\") }  def service = services.get(\"git\");  def Repository getRepository(String repositoryURI, String localDirectoryName) {   Repository repository;   Environment environment = services.component.getInstance(Environment);   File permDir = environment.getPermanentDirectory();   File localGitDirectory = new File(permDir, \"git\")   File localDirectory = new File(localGitDirectory, localDirectoryName);   File gitDirectory = new File(localDirectory, \".git\");  \/\/ println \"Local Git repository is at [${gitDirectory}]\"   FileRepositoryBuilder builder = new FileRepositoryBuilder();   try {     \/\/ Step 1: Initialize Git environment     repository = builder.setGitDir(gitDirectory)                         .readEnvironment()                         .findGitDir()                         .build();     Git git = new Git(repository);     \/\/ Step 2: Verify if the directory exists and isn't empty.     if (!gitDirectory.exists()) {       \/\/ Step 2.1: Need to clone the remote repository since it doesn't exist       git.cloneRepository()          .setCredentialsProvider(getCredentialsProvider())          .setDirectory(localDirectory)          .setURI(repositoryURI).setCloneAllBranches(false).setBranch(wikimacro.parameters.GIT_TREE)          .call();            }   } catch (Exception e) {     throw new RuntimeException(String.format(\"Failed to execute Git command in [%s]\", gitDirectory), e);   }   return repository; }   def sourceRepoURL = wikimacro.parameters.GIT_URL; def sourceRepoName = org.apache.commons.io.FilenameUtils.getName(\"\/\" + wikimacro.parameters.GIT_LOCAL_PATH);  \/\/ delete folder before cloning, for clean pull.    if (wikimacro.parameters.DELETE_FOLDER)   {       def file = new File(\"..\/xwiki\/data\/git\/\"+sourceRepoName)   if (file.exists()){      FileUtils.deleteDirectory(file)   } }    def textFilePath = wikimacro.parameters.TEXT_FILE_PATH;  def shortFileName = org.apache.commons.io.FilenameUtils.getName(textFilePath)    def repo = getRepository(sourceRepoURL, sourceRepoName)    result = new Git(repo).pull().setCredentialsProvider(getCredentialsProvider()).call()  def baseUrl = repo.getWorkTree().toString(); def fileName =org.apache.commons.io.FilenameUtils.separatorsToSystem(baseUrl + \"\/\" + textFilePath);  def String fileContents = new File(fileName).getText('UTF-8');   xcontext.put(\"fileContent\", fileContents)  {{\/groovy}}  {{velocity}} #set($fileText =$xcontext.get(\"fileContent\"))   {{content syntax=\"$wikimacro.parameters.OUTFORMAT.trim()\"}}      $fileText   {{\/content}} {{\/velocity}}<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c \u044f \u043d\u0435 \u043d\u0430 100% \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u044d\u0442\u043e\u0442 \u043a\u043e\u0434, \u0442\u0430\u043a \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u043b. \u041d\u043e \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0447\u0442\u043e \u0441\u043c\u043e\u0433\u0443.<\/p>\n<pre><code>{{groovy}} import org.apache.commons.io.* import org.eclipse.jgit.api.* import org.eclipse.jgit.lib.* import org.eclipse.jgit.revwalk.* import org.eclipse.jgit.storage.file.* import org.eclipse.jgit.transport.*; import org.xwiki.environment.*; import org.apache.commons.io.FilenameUtils; import groovy.io.*; import org.apache.commons.io.FileUtils;  Git git;<\/code><\/pre>\n<p>\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<pre><code>def CredentialsProvider getCredentialsProvider() {   return new UsernamePasswordCredentialsProvider(\"UXXXX\", \"glXXXt-XXXXXXXXXXXXXXXXXXXXX\") }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 GitLab,  \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0435 U\u0425\u0425\u0425\u0425 \u043d\u0430 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0430 glXX-XXX \u043d\u0430 access token.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u0443\u0441\u043e\u043a \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>def service = services.get(\"git\");  def Repository getRepository(String repositoryURI, String localDirectoryName) {   Repository repository;   Environment environment = services.component.getInstance(Environment);   File permDir = environment.getPermanentDirectory();   File localGitDirectory = new File(permDir, \"git\")   File localDirectory = new File(localGitDirectory, localDirectoryName);   File gitDirectory = new File(localDirectory, \".git\");  \/\/ println \"Local Git repository is at [${gitDirectory}]\"   FileRepositoryBuilder builder = new FileRepositoryBuilder();   try {     \/\/ Step 1: Initialize Git environment     repository = builder.setGitDir(gitDirectory)                         .readEnvironment()                         .findGitDir()                         .build();     Git git = new Git(repository);     \/\/ Step 2: Verify if the directory exists and isn't empty.     if (!gitDirectory.exists()) {       \/\/ Step 2.1: Need to clone the remote repository since it doesn't exist       git.cloneRepository()          .setCredentialsProvider(getCredentialsProvider())          .setDirectory(localDirectory)          .setURI(repositoryURI).setCloneAllBranches(false).setBranch(wikimacro.parameters.GIT_TREE)          .call();            }   } catch (Exception e) {     throw new RuntimeException(String.format(\"Failed to execute Git command in [%s]\", gitDirectory), e);   }   return repository; }  <\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u042d\u0442\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u0430\u043a \u044f \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439.<\/p>\n<pre><code>def sourceRepoURL = wikimacro.parameters.GIT_URL; def sourceRepoName = org.apache.commons.io.FilenameUtils.getName(\"\/\" + wikimacro.parameters.GIT_LOCAL_PATH);<\/code><\/pre>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0438 \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441 URL \u0438\u0437 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u043c\u0430\u043a\u0440\u043e\u0441\u0430.<\/p>\n<pre><code>\/\/ delete folder before cloning, for clean pull.    if (wikimacro.parameters.DELETE_FOLDER)   {       def file = new File(\"..\/xwiki\/data\/git\/\"+sourceRepoName)   if (file.exists()){      FileUtils.deleteDirectory(file)   } }<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 &#171;\u0423\u0434\u0430\u043b\u044f\u0442\u044c \u043f\u0430\u043f\u043a\u0443&#187;, \u0442\u043e \u043c\u044b \u0435\u0435 \u0443\u0434\u0430\u043b\u044f\u0435\u043c.<\/p>\n<p><code>..\/xwiki\/data\/git\/ - \u044f \u0443\u0436\u0435 <\/code>\u043f\u043b\u043e\u0445\u043e \u043f\u043e\u043c\u043d\u044e, \u043d\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e \u044d\u0442\u043e \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c, \u043a\u0443\u0434\u0430 Xwiki  \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0438.<\/p>\n<pre><code>def textFilePath = wikimacro.parameters.TEXT_FILE_PATH;  def shortFileName = org.apache.commons.io.FilenameUtils.getName(textFilePath)    def repo = getRepository(sourceRepoURL, sourceRepoName)    result = new Git(repo).pull().setCredentialsProvider(getCredentialsProvider()).call()  def baseUrl = repo.getWorkTree().toString(); def fileName =org.apache.commons.io.FilenameUtils.separatorsToSystem(baseUrl + \"\/\" + textFilePath);  def String fileContents = new File(fileName).getText('UTF-8');<\/code><\/pre>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0438 \u0441\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0438\u0445 \u0432 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0443\u044e.<\/p>\n<pre><code>xcontext.put(\"fileContent\", fileContents)  {{\/groovy}}<\/code><\/pre>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u043e\u0435 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u0432 \u043e\u0431\u0449\u0438\u0439 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442, \u0447\u0442\u043e\u0431\u044b \u0437\u0430\u0431\u0440\u0430\u0442\u044c \u0438\u0437 \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u043d\u0430 Velocity. <br \/><em>\u041f\u043e \u0438\u0434\u0435\u0435 \u044d\u0442\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e, \u0442\u0430\u043a \u043a\u0430\u043a \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u043b \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043e\u0431\u043c\u0435\u043d <\/em><a href=\"https:\/\/www.xwiki.org\/xwiki\/bin\/view\/Documentation\/DevGuide\/Scripting\/#HSharevariablebetweenlanguages\" rel=\"noopener noreferrer nofollow\"><em>\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u043c\u0435\u0436\u0434\u0443 \u044f\u0437\u044b\u043a\u0430\u043c\u0438<\/em><\/a><em>, \u043d\u043e \u0443 \u043c\u0435\u043d\u044f \u0447\u0442\u043e-\u0442\u043e \u043f\u043e\u0448\u043b\u043e \u043d\u0435 \u0442\u0430\u043a.<\/em><\/p>\n<p>\u041d\u0430 \u044d\u0442\u043e\u043c \u043a\u0443\u0441\u043e\u043a Groovy \u043a\u043e\u0434\u0430 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f. <\/p>\n<p>\u0418 \u043d\u0430\u0447\u0438\u043d\u0430\u0435\u0442\u0441\u044f \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043a\u0443\u0441\u043e\u0447\u0435\u043a \u043a\u043e\u0434\u0430 \u043d\u0430 Velocity.<\/p>\n<p>\u041a\u043e\u0434 \u043d\u0430 Velocity \u043d\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0438\u0437 \u043d\u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0442\u044c \u0434\u0440\u0443\u0433\u0438\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u044b XWiki,  \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043c\u0430\u043a\u0440\u043e\u0441 Content, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043d\u0430\u043c \u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u0442\u044c \u043d\u0430\u0448 \u0442\u0435\u043a\u0441\u0442 \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c \u0444\u043e\u0440\u043c\u0430\u0442\u0435. \u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u043a\u0430\u043a \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u0430\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u0430 (OUTFORMAT) \u0432 Velocity.<\/p>\n<p><em>\u041a\u0441\u0442\u0430\u0442\u0438 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u0431\u044b\u043b\u043e \u043d\u0435 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0438\u0441\u0430\u0442\u044c \u0441 \u0431\u043e\u043b\u044c\u0448\u0438\u0445 \u0431\u0443\u043a\u0432, \u044d\u0442\u043e \u043c\u043e\u044f \u043f\u0440\u0438\u0445\u043e\u0442\u044c.<\/em><\/p>\n<pre><code>{{velocity}} #set($fileText =$xcontext.get(\"fileContent\"))   {{content syntax=\"$wikimacro.parameters.OUTFORMAT.trim()\"}}      $fileText   {{\/content}} {{\/velocity}}<\/code><\/pre>\n<p>\u041d\u0443 \u0432\u043e\u0442 \u0438 \u0432\u0441\u0451.<\/p>\n<p>\u041e\u0441\u0442\u0430\u0435\u0442\u0441\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043a\u0430\u043a \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0435.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/66c\/0ac\/9d1\/66c0ac9d120a4ac82994b0e04c3d729f.png\" width=\"1824\" height=\"890\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/66c\/0ac\/9d1\/66c0ac9d120a4ac82994b0e04c3d729f.png\"\/><figcaption><\/figcaption><\/figure>\n<h2>\u041d\u0430\u0441\u043b\u0430\u0436\u0434\u0430\u0435\u043c\u0441\u044f \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u043e\u043c<\/h2>\n<p><a class=\"anchor\" name=\"a3\" id=\"a3\"><\/a><\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0435\u0449\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443 \u0438 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043c \u043d\u0430 \u043d\u0435\u0439 \u043d\u0430\u0448 \u0441\u0432\u0435\u0436\u0435\u043d\u044c\u043a\u0438\u0439 \u043c\u0430\u043a\u0440\u043e\u0441.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/1a2\/06a\/f04\/1a206af04b356055d5dbc17f2b07b83b.png\" alt=\"\u041e\u043a\u043d\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\" title=\"\u041e\u043a\u043d\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043c\u0430\u043a\u0440\u043e\u0441\u0430\" width=\"589\" height=\"490\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/1a2\/06a\/f04\/1a206af04b356055d5dbc17f2b07b83b.png\"\/><figcaption>\u041e\u043a\u043d\u043e \u0432\u044b\u0431\u043e\u0440\u0430 \u043c\u0430\u043a\u0440\u043e\u0441\u0430<\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/903\/ccb\/c68\/903ccbc68dc7dafe280e1b44c1a7f1dd.png\" alt=\"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u0430\u043a\u0440\u043e\u0441\u0430\" title=\"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u0430\u043a\u0440\u043e\u0441\u0430\" width=\"582\" height=\"730\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/903\/ccb\/c68\/903ccbc68dc7dafe280e1b44c1a7f1dd.png\"\/><figcaption>\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u043c\u0430\u043a\u0440\u043e\u0441\u0430<\/figcaption><\/figure>\n<p>\u0421\u043e\u0445\u0440\u0430\u043d\u044f\u0435\u043c \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c.<\/p>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/60f\/1bc\/82c\/60f1bc82c4c4a9f7d24334d86d7a8014.png\" alt=\"GitLab\" title=\"GitLab\" width=\"960\" height=\"770\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/60f\/1bc\/82c\/60f1bc82c4c4a9f7d24334d86d7a8014.png\"\/><figcaption>GitLab<\/figcaption><\/figure>\n<figure class=\"full-width\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/habrastorage.org\/r\/w1560\/getpro\/habr\/upload_files\/40a\/ae9\/3dc\/40aae93dcb1c786bd994041c0583aa33.png\" alt=\"Xwiki\" title=\"Xwiki\" width=\"1128\" height=\"843\" data-src=\"https:\/\/habrastorage.org\/getpro\/habr\/upload_files\/40a\/ae9\/3dc\/40aae93dcb1c786bd994041c0583aa33.png\"\/><figcaption>Xwiki<\/figcaption><\/figure>\n<p>\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435 \u0432\u043d\u0438\u043c\u0430\u043d\u0438\u0435, \u0447\u0442\u043e \u0432\u0441\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043f\u0443\u0442\u0438 \u0432 \u0441\u0441\u044b\u043b\u043a\u0430\u0445 \u0438 \u0443 \u043a\u0430\u0440\u0442\u0438\u043d\u043e\u043a, \u0441\u043b\u043e\u043c\u0430\u044e\u0442\u0441\u044f. \u041b\u0443\u0447\u0448\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0430\u0431\u0441\u043e\u043b\u044e\u0442\u043d\u044b\u0435.<\/p>\n<p>\u041d\u0443 \u0432\u043e\u0442 \u0438 \u0432\u0441\u0451. \u042f \u043f\u043e\u043d\u0438\u043c\u0430\u044e, \u0447\u0442\u043e \u043f\u0440\u0438\u043c\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0441\u044f \u043d\u0435 \u0441\u0430\u043c\u044b\u043c \u043b\u0443\u0447\u0448\u0438\u043c, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u044f \u0443\u0436\u0435 \u0441\u0430\u043c \u043f\u043e\u0434\u0437\u0430\u0431\u044b\u043b \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0447\u0430\u0441\u0442\u044c \u043a\u043e\u0434\u0430 \u0438 \u043f\u043e\u043b\u0435\u0439, \u043d\u043e \u043e\u043d \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u0440\u0430\u0437\u043d\u044b\u0435 \u043f\u0440\u0438\u0435\u043c\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441 XWiki \u0438 \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0447\u0442\u043e \u0431\u0443\u0434\u0435\u0442 \u043a\u043e\u043c\u0443-\u0442\u043e \u043f\u043e\u043b\u0435\u0437\u0435\u043d \u0432 \u0443\u0441\u043b\u043e\u0432\u0438\u044f\u0445 \u043d\u0435\u0434\u043e\u0441\u0442\u0430\u0442\u043a\u0430 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u043d\u0430 \u0440\u0443\u0441\u0441\u043a\u043e\u043c \u044f\u0437\u044b\u043a\u0435.<\/p>\n<p><strong>P.S.<\/strong> \u0418\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0432\u043c\u0435\u0441\u0442\u043e \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u044f \u0445\u043e\u0442\u0435\u043b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043e \u043c\u043e\u0451\u043c \u0441\u0443\u0431\u044a\u0435\u043a\u0442\u0438\u0432\u043d\u043e\u043c \u043e\u043f\u044b\u0442\u0435 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f XWiki \u0438 Confluence \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0431\u0430\u0437\u044b \u0437\u043d\u0430\u043d\u0438\u0439 \u0434\u043b\u044f \u043a\u043e\u043c\u0430\u043d\u0434\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438.<br \/>\u041e\u0434\u043d\u0430\u043a\u043e, \u0432 \u0438\u0442\u043e\u0433\u0435 \u0440\u0435\u0448\u0438\u043b, \u0447\u0442\u043e \u0447\u0435\u043b\u043e\u0432\u0435\u0447\u0435\u0441\u0442\u0432\u043e \u043a \u0442\u0430\u043a\u043e\u043c\u0443 \u043f\u043e\u043a\u0430 \u0435\u0449\u0435 \u043d\u0435 \u0433\u043e\u0442\u043e\u0432\u043e. <br \/>\u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0432\u0441\u0435 \u0436\u0435 \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u043d\u0430 \u0442\u0435\u043c\u0443 Confluence vs Xwiki \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u043e\u0431 \u044d\u0442\u043e\u043c \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u044f\u0445.<\/p>\n<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"v-portal\" style=\"display:none;\"><\/div>\n<\/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\/post\/667166\/\"> https:\/\/habr.com\/ru\/post\/667166\/<\/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>\u041d\u0430\u043a\u043e\u043d\u0435\u0446-\u0442\u043e \u044f &#171;\u0440\u0430\u0437\u0434\u043e\u0431\u044b\u043b&#187; \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438, \u0430 \u0437\u043d\u0430\u0447\u0438\u0442 \u043f\u0440\u0438\u0448\u043b\u0430 \u043f\u043e\u0440\u0430 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u0441\u0435\u0440\u0438\u044e \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u043e\u0432 \u043f\u043e XWiki.<\/p>\n<p>\u041f\u043e\u0441\u043b\u0435 \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u043e\u0434\u043d\u043e\u0439 \u043c\u043e\u0438\u0445 \u0438\u0437 \u0441\u0442\u0430\u0442\u0435\u0439 <a href=\"https:\/\/habr.com\/ru\/users\/maxk82\/\" rel=\"noopener noreferrer nofollow\">MaxK82<\/a> \u0441\u043f\u0440\u043e\u0441\u0438\u043b \u0443 \u043c\u0435\u043d\u044f, \u043c\u043e\u0436\u043d\u043e \u043b\u0438 \u043a\u0430\u043a-\u0442\u043e \u0432 XWiki \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0438\u0437 git \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f, \u0442\u0430\u043a \u0447\u0442\u043e\u0431\u044b \u043d\u0430\u043b\u0430\u0434\u0438\u0442\u044c \u0435\u0451 \u0432\u0435\u0440\u0441\u0438\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. <br \/>\u041a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u044d\u0442\u0430 \u0441\u0442\u0430\u0442\u044c\u044f <strong>\u043d\u0435<\/strong> <strong>\u043e\u0442\u0432\u0435\u0442\u0438\u0442 \u043d\u0430 \u0435\u0433\u043e \u0432\u043e\u043f\u0440\u043e\u0441<\/strong>, \u043d\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0443\u043a\u0430\u0436\u0435\u0442 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0441\u0442\u043e\u0438\u0442 &#171;\u043a\u043e\u043f\u0430\u0442\u044c&#187;.<\/p>\n<p>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0441 \u0432\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/667166#a1\" rel=\"noopener noreferrer nofollow\">\u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043f\u0440\u043e\u0441\u0442\u0435\u043d\u044c\u043a\u0438\u0439, \u0437\u0430\u0442\u043e \u0441\u0432\u043e\u0439 \u043c\u0430\u043a\u0440\u043e\u0441 \u0432 XWiki<\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/667166\/#a2\" rel=\"noopener noreferrer nofollow\">\u043a\u043b\u043e\u043d\u0438\u0440\u0443\u0435\u043c \u043f\u0440\u044f\u043c\u043e \u0432 XWiki \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0441 GitLab<\/a>;<\/p>\n<\/li>\n<li>\n<p><a href=\"https:\/\/habr.com\/ru\/post\/667166\/#a3\" rel=\"noopener noreferrer nofollow\">\u043e\u0442\u043e\u0431\u0440\u0430\u0437\u0438\u043c Readme.md \u0438\u0437 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b XWiki<\/a>.<\/p>\n<\/li>\n<\/ul>\n<p>C\u0440\u0430\u0437\u0443 \u0434\u0430\u043c <strong>\u0434\u0438\u0441\u043a\u043b\u0435\u0439\u043c\u0435\u0440<\/strong> &#8212; \u044f \u0442\u0435\u0445\u043f\u0438\u0441, \u0430 \u043d\u0435 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442. <br \/>\u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u043e\u0436\u0438\u0434\u0430\u0442\u044c \u0432 \u0441\u0442\u0430\u0442\u044c\u0435, \u0445\u043e\u0440\u043e\u0448\u0438\u0445 \u043f\u0440\u0438\u043c\u0435\u0440\u043e\u0432 \u043a\u043e\u0434\u0430 \u0438 \u0443\u0434\u0430\u0447\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439. <br \/>\u042d\u0442\u043e \u0441\u043a\u043e\u0440\u0435\u0435 \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0442\u0435\u0445\u043d\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u043f\u0438\u0441\u0430\u0442\u0435\u043b\u0435\u0439 \u0438\u043b\u0438 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c docops, \u043a\u043e\u0442\u043e\u0440\u044b\u043c  \u0432\u044b\u043f\u0430\u0434\u0435\u0442 \u0447\u0435\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 XWiki.<\/p>\n<p>\u0423\u0434\u0435\u043b\u0438\u043c \u043f\u0430\u0440\u0443 \u043c\u0438\u043d\u0443\u0442 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u043e\u043c\u0443:<\/p>\n<ol>\n<li>\n<p>\u0414\u043b\u044f \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b\u0430 \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u0432 Gitlab (\u043d\u0435 \u0432\u0430\u0436\u043d\u043e \u043a\u043e\u043c\u043c\u0435\u0440\u0447\u0435\u0441\u043a\u0438\u0439 \u0438\u043b\u0438 \u043d\u0430 \u0432\u0430\u0448\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435).<\/p>\n<\/li>\n<li>\n<p>\u041d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c access token \u043a \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0443.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0443\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439, \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e &#171;Learn GitLab&#187; (\u043d\u0435 \u043f\u043e\u043c\u043d\u044e \u043e\u0442\u043a\u0443\u0434\u0430 \u043e\u043d \u0443 \u043c\u0435\u043d\u044f \u0432\u0437\u044f\u043b\u0441\u044f). \u041d\u043e \u0432\u0430\u043c \u043f\u043e\u0434\u043e\u0439\u0434\u0435\u0442 \u043b\u044e\u0431\u043e\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0435\u0441\u0442\u044c Readme.md (\u0438\u043b\u0438 \u0434\u0440\u0443\u0433\u043e\u0439 markdown \u0444\u0430\u0439\u043b). \u041b\u043e\u0433\u0438\u043a\u0430 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0445\u043e\u0436\u0435\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0441\u0432\u043e\u0435\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b docker \u0432\u0435\u0440\u0441\u0438\u044e XWiki 13.10.5 \u0441\u043e Standart Flavor, \u043d\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u0442 \u0438 \u0432 XWiki 12.X. <\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 <a href=\"https:\/\/extensions.xwiki.org\/xwiki\/bin\/view\/Extension\/Git%20Module\" rel=\"noopener noreferrer nofollow\">GitAPI<\/a>.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<\/li>\n<\/ol>\n<p>\u041d\u0443 \u0438 \u0441\u0430\u043c\u043e\u0435 \u0433\u043b\u0430\u0432\u043d\u043e\u0435, \u043d\u0430\u043c \u043d\u0443\u0436\u043d\u043e \u0431\u0443\u0434\u0435\u0442 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 <a href=\"https:\/\/extensions.xwiki.org\/xwiki\/bin\/view\/Extension\/MarkdownSyntax\/Markdown%20Syntax%201.2\" rel=\"noopener noreferrer nofollow\">\u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0438 \u0441\u0438\u043d\u0442\u0430\u043a\u0441\u0438\u0441\u0430 Markdown<\/a>.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>.<\/p>\n<p><a class=\"anchor\" name=\"a1\" id=\"a1\"><\/a><\/p>\n<p>\u0412\u043e\u043e\u0431\u0449\u0435 \u0443 Xwiki \u0435\u0441\u0442\u044c \u0440\u0430\u0437\u043d\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438 \u0441 git, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u0438\u043c\u043f\u043e\u0440\u0442 \u0441 <a href=\"https:\/\/snippets.xwiki.org\/xwiki\/bin\/view\/Extension\/Github%20wiki%20import\/\" rel=\"noopener noreferrer nofollow\">GitHub wiki<\/a> \u0438\u043b\u0438 \u0432\u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a <a href=\"https:\/\/snippets.xwiki.org\/xwiki\/bin\/view\/Extension\/GitHub%20Integration\" rel=\"noopener noreferrer nofollow\">GitHub \u0447\u0435\u0440\u0435\u0437 \u0435\u0433\u043e API<\/a>.<br \/>\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0412\u0430\u043c \u0443\u0434\u0430\u0441\u0442\u0441\u044f \u043d\u0430\u0439\u0442\u0438 \u0433\u043e\u0442\u043e\u0432\u044b\u0435 \u043f\u0440\u0438\u043c\u0435\u0440\u044b \u0438 \u0440\u0435\u0448\u0435\u043d\u0438\u044f.<\/p>\n<p>\u0421\u0440\u0430\u0437\u0443 \u0441\u043a\u0430\u0436\u0443, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u0442 \u0440\u0430\u0437 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c <strong>\u043e\u0447\u0435\u043d\u044c \u0442\u043e\u043f\u043e\u0440\u043d\u044b\u0439<\/strong> \u043c\u0430\u043a\u0440\u043e\u0441, \u0435\u0433\u043e \u043f\u0440\u043e\u043e\u0431\u0440\u0430\u0437  \u043c\u043d\u0435 \u0431\u044b\u043b \u043d\u0443\u0436\u0435\u043d \u0434\u043b\u044f \u0442\u043e\u0433\u043e \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043b\u043b\u0435\u0433\u0430\u043c \u043d\u0435 \u043f\u0440\u0438\u0448\u043b\u043e\u0441\u044c \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0442\u044c \u0434\u043e\u043c\u0435\u043d \u0441 XWiki \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 CORS \u043d\u0430\u0448\u0435\u0433\u043e GitLab.<\/p>\n<p><strong>\u041f\u0440\u043e\u0448\u0443 \u0432\u0430\u0441<\/strong> \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0439\u0442\u0435 \u044d\u0442\u043e\u0442 \u0442\u0443\u0442\u043e\u0440\u0438\u0430\u043b \u0441\u043a\u043e\u0440\u0435\u0435 \u043a\u0430\u043a \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044e, \u0430 \u043d\u0435 \u043a\u0430\u043a \u0447\u0435\u0442\u043a\u043e\u0435 \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043a \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044e, \u043f\u043e\u0442\u043e\u043c\u0443 \u0447\u0442\u043e \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0446\u0435\u043b\u044b\u0439 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 XWiki \u0440\u0430\u0434\u0438 1 markdown \u0444\u0430\u0439\u043b\u0430 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043d\u0435 \u043b\u0443\u0447\u0448\u0435\u0439 \u0438\u0434\u0435\u0435\u0439. <\/p>\n<p>\u041f\u0430\u0440\u0443 \u0441\u043b\u043e\u0432 \u043e \u0442\u043e\u043c, \u0447\u0442\u043e \u0442\u0430\u043a\u043e\u0435 \u043c\u0430\u043a\u0440\u043e\u0441. <br \/>\u041c\u0430\u043a\u0440\u043e\u0441 \u0432 Xwiki &#8212; \u044d\u0442\u043e \u043d\u0430\u0431\u043e\u0440 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0432\u043a\u043b\u044e\u0447\u0435\u043d \u0432 \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b. \u0415\u0441\u043b\u0438 \u0432\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b\u0438 Conflunce, \u0442\u043e \u0432\u0430\u043c \u044d\u0442\u043e \u0437\u043d\u0430\u043a\u043e\u043c\u043e.<\/p>\n<p>\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u0432\u043e\u0439 \u043c\u0430\u043a\u0440\u043e\u0441 \u0432 XWiki \u043e\u0447\u0435\u043d\u044c \u043f\u0440\u043e\u0441\u0442\u043e, \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u0434\u043e \u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u044c <a href=\"https:\/\/www.xwiki.org\/xwiki\/bin\/view\/Documentation\/DevGuide\/Tutorials\/WritingMacros\/WikiMacroTutorial\/\" rel=\"noopener noreferrer nofollow\">\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438.<\/a><\/p>\n<p>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0441\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0432 \u043a\u043e\u0440\u043d\u0435. <br \/>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043d\u0435 \u043a\u0440\u0438\u0442\u0438\u0447\u043d\u043e, \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u043c\u043e\u0436\u043d\u043e \u043d\u0435 \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c.<\/p>\n<figure class=\"full-width\"><figcaption>\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u0434\u043b\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u0430<\/figcaption><\/figure>\n<p>\u041d\u043e \u0435\u0441\u043b\u0438 \u0432\u044b \u0432\u043e\u0437\u044c\u043c\u0435\u0442\u0435\u0441\u044c \u0437\u0430 \u0434\u0435\u043b\u043e \u0432\u0441\u0435\u0440\u044c\u0435\u0437, \u0442\u043e \u044f \u0431\u044b \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043b \u0440\u0430\u0437\u043c\u0435\u0449\u0430\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441\u044b \u0432 \u043a\u0430\u043a\u043e\u043c-\u0442\u043e \u043e\u0434\u043d\u043e\u043c \u043c\u0435\u0441\u0442\u0435 (\u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0432\u043d\u0443\u0442\u0440\u0438 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b &#171;Macros&#187;). <em><br \/><\/em><br \/>\u0414\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432. \u041c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u043d\u0430\u0436\u0430\u0442\u044c \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0443\u044e \u043a\u043b\u0430\u0432\u0438\u0448\u0443 &#171;O&#187; \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0435 \u043f\u043e\u0441\u043b\u0435 \u0435\u0451 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f <br \/><em>(\u0435\u0441\u043b\u0438 \u0447\u0443\u0434\u043e \u043d\u0435 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u043e, \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u0442\u0435 \u043a\u0430\u043a \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u0434\u0432\u0438\u043d\u0443\u0442\u044b\u0439 \u0440\u0435\u0436\u0438\u043c \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 <\/em><a href=\"https:\/\/habr.com\/ru\/post\/573626\/\" rel=\"noopener noreferrer nofollow\"><em>\u043f\u0440\u043e\u0448\u043b\u044b\u0445 \u0441\u0442\u0430\u0442\u0435\u0439<\/em><\/a><em>).<\/em><\/p>\n<p>\u0421\u0442\u0440\u0430\u043d\u0438\u0446\u0430 \u0441\u0442\u0430\u043d\u0435\u0442 \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c, \u043a\u0430\u043a \u0442\u043e\u043b\u044c\u043a\u043e \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0439 \u043e\u0431\u044a\u0435\u043a\u0442 <code>WikiMacroClass<\/code><\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u042d\u0442\u043e \u043f\u043e \u0441\u0443\u0442\u0438 \u0438 \u0435\u0441\u0442\u044c \u0441\u0430\u043c \u043c\u0430\u043a\u0440\u043e\u0441, \u043d\u043e \u043f\u0440\u0435\u0436\u0434\u0435, \u0447\u0435\u043c \u043f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0435\u0433\u043e \u0434\u0435\u0442\u0430\u043b\u044c\u043d\u043e\u043c\u0443 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u044e, \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0435\u0449\u0435 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438 \u0434\u043b\u044f \u043c\u0430\u043a\u0440\u043e\u0441\u0430<code>WikiMacroParameterClass<\/code> \u043d\u0430 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443.<\/p>\n<figure class=\"full-width\"><figcaption><\/figcaption><\/figure>\n<p>\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 6 \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432 \u0441 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u043c\u0438, \u043e\u043d\u0438 \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u0442 \u043d\u0430\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u043c \u0438\u0437 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u043e\u0433\u043e \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0430.<\/p>\n<p>\u041f\u0435\u0440\u0432\u044b\u0439 \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435, \u0430 \u043e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u044f \u0434\u0430\u043c \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0430\u043c\u0438 \u043d\u0438\u0436\u0435.<\/p>\n<figure class=\"\"><figcaption><\/figcaption><\/figure>\n<p>\u041c\u044b \u0437\u0430\u0434\u0430\u0435\u043c \u043f\u0443\u0442\u044c \u043a \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044e \u0432 git. <\/p>\n<ul>\n<li>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430  (GIT_URL), \u0442\u043e \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043b\u0435 \u0432 UI \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 &#8212; \u0442\u0435\u043a\u0441\u0442 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 \u043a \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0443 (\u0441\u0441\u044b\u043b\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u043d\u0435 \u0431\u0443\u0434\u0443\u0442).<\/p>\n<\/li>\n<li>\n<p>\u041e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 &#8212; \u0435\u0441\u043b\u0438 \u0434\u0430, \u0442\u043e \u043c\u0430\u043a\u0440\u043e\u0441 \u043d\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c\u0441\u044f \u0431\u0435\u0437 \u0432\u0432\u043e\u0434\u0430 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f. \u0412 \u043f\u0435\u0440\u0432\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440 \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439.<\/p>\n<\/li>\n<li>\n<p>\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0435\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0442\u044c, \u0442\u043e \u043f\u043e\u043b\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u0440\u0435\u0434\u0437\u0430\u043f\u043e\u043b\u043d\u0435\u043d\u043d\u043e.<\/p>\n<\/li>\n<li>\n<p>\u0422\u0438\u043f \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430 &#8212; \u0444\u043e\u0440\u043c\u0430\u0442 \u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439, \u044f \u0442\u0430\u043a \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0442\u0438\u043f\u044b JAVA \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u043d\u043e\u0440\u043c\u0430\u043b\u044c\u043d\u043e, \u0432 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 String. <em>\u0415\u0441\u043b\u0438 \u0447\u0435\u0441\u0442\u043d\u043e, \u044f \u0443\u0436\u0435 \u0442\u043e\u0447\u043d\u043e \u043d\u0435 \u043f\u043e\u043c\u043d\u044e, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0441\u0442\u0430\u0432\u0438\u043c \u0442\u0430\u043a.<\/em><\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b \u0441 \u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u0430\u043c\u0438 \u044f \u0441\u043f\u0440\u044f\u0447\u0443 \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440, \u0447\u0442\u043e\u0431\u044b \u043d\u0435 \u0440\u0430\u0437\u0434\u0443\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u044c\u044e.<\/p>\n<details class=\"spoiler\">\n<summary>\u041e\u0441\u0442\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b<\/summary>\n<div class=\"spoiler__content\">\n<figure class=\"\"><figcaption>\u0410\u0434\u0440\u0435\u0441 \u0440\u0430\u0437\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 XWiki<\/figcaption><\/figure>\n<figure class=\"\"><figcaption>\u041f\u0443\u0442\u044c \u043a \u0432\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c\u043e\u043c\u0443 \u0444\u0430\u0439\u043b\u0443, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0435\u0433\u043e \u0438\u043c\u044f.<\/figcaption><\/figure>\n<figure class=\"\"><figcaption>\u0424\u043e\u0440\u043c\u0430\u0442 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u043c \u0432\u044b\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0442\u0435\u043a\u0441\u0442 (\u0432\u0434\u0440\u0443\u0433 \u043c\u044b \u0437\u0430\u0445\u043e\u0442\u0438\u043c \u043d\u0435 \u0442\u043e\u043b\u044c\u043a\u043e markdown)<\/figcaption><\/figure>\n<figure class=\"\"><figcaption>\u0412\u0435\u0442\u043a\u0430 \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0438\u0449\u0435\u043c \u0444\u0430\u0439\u043b.<\/figcaption><\/figure>\n<figure class=\"\"><figcaption>\u0418\u043d\u043e\u0433\u0434\u0430 \u0431\u044b\u0432\u0430\u044e\u0442 \u0433\u043b\u044e\u043a\u0438, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u043c\u044b \u0441\u0434\u0435\u043b\u0430\u0435\u043c \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0447\u0438\u0441\u0442\u043a\u0438 \u043f\u0430\u043f\u043a\u0438 \u043f\u0435\u0440\u0435\u0434 \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435\u043c.<\/figcaption><\/figure>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0415\u0441\u043b\u0438 \u0431\u043e\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u0447\u0442\u043e-\u0442\u043e \u0437\u0430\u0431\u044b\u043b\u0438 \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c \u0441\u0435\u0431\u044f \u043d\u0430 \u0441\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u0435 <a href=\"#a3\" rel=\"noopener noreferrer nofollow\">UI \u043c\u0430\u043a\u0440\u043e\u0441\u0430 \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b<\/a>.<br \/>\u0422\u0430\u043a \u0436\u0435 \u0441\u0442\u0440\u0430\u043d\u0438\u0447\u043a\u0443 \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0431\u0440\u0430\u0442\u044c \u0438\u0437 <a href=\"https:\/\/github.com\/bosonbeard\/Funny-models-and-scripts\/tree\/master\/7.%20Xwiki\/FirstMacroForGit\" rel=\"noopener noreferrer nofollow\"><strong>GitHub<\/strong><\/a> (\u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0435\u0451 \u0438\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0447\u0435\u0440\u0435\u0437 \u043f\u0430\u043d\u0435\u043b\u044c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0432 \u0440\u0430\u0437\u0434\u0435\u043b\u0435 &#171;\u041a\u043e\u043d\u0442\u0435\u043d\u0442&#187;)<\/p>\n<p>\u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u041c\u0430\u043a\u0440\u043e\u0441\u0443<\/p>\n<figure class=\"full-width\"><figcaption>\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043c\u0430\u043a\u0440\u043e\u0441\u0430<\/figcaption><\/figure>\n<ul>\n<li>\n<p>ID \u043c\u0430\u043a\u0440\u043e\u0441\u0430 &#8212; \u0442\u043e \u043a\u0430\u043a \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u0437\u044b\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u0440\u0435\u0436\u0438\u043c\u0435 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0430 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u043c\u0430\u043a\u0440\u043e\u0441\u0430 &#8212; \u0442\u043e \u043a\u0430\u043a \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c\u0441\u044f \u0432 UI \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f<\/p>\n<\/li>\n<li>\n<p>\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 &#8212; \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0430 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f &#8212; \u043a\u0430\u0442\u0435\u0433\u043e\u0440\u0438\u044f \u0434\u043b\u044f \u0444\u0438\u043b\u044c\u0442\u0440\u043e\u0432 \u043f\u043e \u0442\u0438\u043f\u0430\u043c \u043c\u0430\u043a\u0440\u043e\u0441\u043e\u0432.<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c  \u0432 \u043b\u0438\u043d\u0438\u044e &#8212; \u0435\u0441\u043b\u0438 \u043d\u0435\u0442, \u0442\u043e \u043d\u0443\u0436\u0435\u043d \u0431\u0443\u0434\u0435\u0442 \u043e\u0442\u0441\u0442\u0443\u043f \u0432 \u0440\u0435\u0434\u0430\u043a\u0442\u043e\u0440\u0435 \u0438\u0441\u0445\u043e\u0434\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<\/li>\n<li>\n<p>\u0412\u0438\u0434\u0438\u043c\u043e\u0441\u0442\u044c \u043c\u0430\u043a\u0440\u043e\u0441\u0430 &#8212; \u0432 \u043a\u0430\u043a\u0438\u0445 \u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c (\u0443 \u043d\u0430\u0441 \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0442\u0435\u043a\u0443\u0449\u0435\u0439 \u0432\u0438\u043a\u0438)<\/p>\n<\/li>\n<li>\n<p>\u041c\u043e\u0436\u043d\u043e \u043b\u0438 \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0435\u043d\u0442 \u0432 \u043c\u0430\u043a\u0440\u043e\u0441 &#8212; \u0432 \u043d\u0430\u0448\u0435\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043d\u0435\u0442<\/p>\n<\/li>\n<li>\n<p>\u0422\u0438\u043f \u043a\u043e\u043d\u0442\u0435\u043d\u0442\u0430 &#8212; \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 Wiki.<\/p>\n<\/li>\n<\/ul>\n<p>\u041e\u0441\u0442\u0430\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a\u043e\u0434 \u043c\u0430\u043a\u0440\u043e\u0441\u0430.<br \/>\u041d\u0430 \u0432\u0441\u044f\u043a\u0438\u0439 \u0441\u043b\u0443\u0447\u0430\u0439 \u0441\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u0435 \u0432\u0430\u0448 \u0442\u0440\u0443\u0434 \u0438 \u0432\u0437\u0434\u043e\u0445\u043d\u0438\u0442\u0435 \u0441 \u043e\u0431\u043b\u0435\u0433\u0447\u0435\u043d\u0438\u0435\u043c.<\/p>\n<h2>\u0414\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043b\u043e\u043d\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u043f\u043e\u0437\u0438\u0442\u043e\u0440\u0438\u044f<\/h2>\n<p><a class=\"anchor\" name=\"a2\" id=\"a2\"><\/a><\/p>\n<p>\u041f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u043a \u043a\u043e\u0434\u0443.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u043b\u043d\u044b\u0439 \u043a\u043e\u0434 \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c.<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>{{groovy}} import org.apache.commons.io.* import org.eclipse.jgit.api.* import org.eclipse.jgit.lib.* import org.eclipse.jgit.revwalk.* import org.eclipse.jgit.storage.file.* import org.eclipse.jgit.transport.*; import org.xwiki.environment.*; import org.apache.commons.io.FilenameUtils; import groovy.io.*; import org.apache.commons.io.FileUtils;  Git git;   def CredentialsProvider getCredentialsProvider() {   return new UsernamePasswordCredentialsProvider(\"UXXXX\", \"glXXXt-XXXXXXXXXXXXXXXXXXXXX\") }  def service = services.get(\"git\");  def Repository getRepository(String repositoryURI, String localDirectoryName) {   Repository repository;   Environment environment = services.component.getInstance(Environment);   File permDir = environment.getPermanentDirectory();   File localGitDirectory = new File(permDir, \"git\")   File localDirectory = new File(localGitDirectory, localDirectoryName);   File gitDirectory = new File(localDirectory, \".git\");  \/\/ println \"Local Git repository is at [${gitDirectory}]\"   FileRepositoryBuilder builder = new FileRepositoryBuilder();   try {     \/\/ Step 1: Initialize Git environment     repository = builder.setGitDir(gitDirectory)                         .readEnvironment()                         .findGitDir()                         .build();     Git git = new Git(repository);     \/\/ Step 2: Verify if the directory exists and isn't empty.     if (!gitDirectory.exists()) {       \/\/ Step 2.1: Need to clone the remote repository since it doesn't exist       git.cloneRepository()          .setCredentialsProvider(getCredentialsProvider())          .setDirectory(localDirectory)          .setURI(repositoryURI).setCloneAllBranches(false).setBranch(wikimacro.parameters.GIT_TREE)          .call();            }   } catch (Exception e) {     throw new RuntimeException(String.format(\"Failed to execute Git command in [%s]\", gitDirectory), e);   }   return repository; }   def sourceRepoURL = wikimacro.parameters.GIT_URL; def sourceRepoName = org.apache.commons.io.FilenameUtils.getName(\"\/\" + wikimacro.parameters.GIT_LOCAL_PATH);  \/\/ delete folder before cloning, for clean pull.    if (wikimacro.parameters.DELETE_FOLDER)   {       def file = new File(\"..\/xwiki\/data\/git\/\"+sourceRepoName)   if (file.exists()){      FileUtils.deleteDirectory(file)   } }    def textFilePath = wikimacro.parameters.TEXT_FILE_PATH;  def shortFileName = org.apache.commons.io.FilenameUtils.getName(textFilePath)    def repo = getRepository(sourceRepoURL, sourceRepoName)    result = new Git(repo).pull().setCredentialsProvider(getCredentialsProvider()).call()  def baseUrl = repo.getWorkTree().toString(); def fileName =org.apache.commons.io.FilenameUtils.separatorsToSystem(baseUrl + \"\/\" + textFilePath);  def String fileContents = new File(fileName).getText('UTF-8');   xcontext.put(\"fileContent\", fileContents)  {{\/groovy}}  {{velocity}} #set($fileText =$xcontext.get(\"fileContent\"))   {{content syntax=\"$wikimacro.parameters.OUTFORMAT.trim()\"}}      $fileText   {{\/content}} {{\/velocity}}<\/code><\/pre>\n<\/p>\n<\/div>\n<\/details>\n<p>\u0412 \u0446\u0435\u043b\u043e\u043c \u044f \u043d\u0435 \u043d\u0430 100% \u043f\u043e\u043d\u0438\u043c\u0430\u044e \u044d\u0442\u043e\u0442 \u043a\u043e\u0434, \u0442\u0430\u043a \u043a\u0430\u043a \u0447\u0430\u0441\u0442\u044c \u0440\u0435\u0448\u0435\u043d\u0438\u0439 \u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u043b. \u041d\u043e \u043f\u043e\u0441\u0442\u0430\u0440\u0430\u044e\u0441\u044c \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u0442\u044c \u0447\u0442\u043e \u0441\u043c\u043e\u0433\u0443.<\/p>\n<pre><code>{{groovy}} import org.apache.commons.io.* import org.eclipse.jgit.api.* import org.eclipse.jgit.lib.* import org.eclipse.jgit.revwalk.* import org.eclipse.jgit.storage.file.* import org.eclipse.jgit.transport.*; import org.xwiki.environment.*; import org.apache.commons.io.FilenameUtils; import groovy.io.*; import org.apache.commons.io.FileUtils;  Git git;<\/code><\/pre>\n<p>\u0418\u043c\u043f\u043e\u0440\u0442\u0438\u0440\u0443\u0435\u043c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438.<\/p>\n<pre><code>def CredentialsProvider getCredentialsProvider() {   return new UsernamePasswordCredentialsProvider(\"UXXXX\", \"glXXXt-XXXXXXXXXXXXXXXXXXXXX\") }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0434\u043b\u044f \u0430\u0432\u0442\u043e\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0432 GitLab,  \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u0435 U\u0425\u0425\u0425\u0425 \u043d\u0430 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u0430 glXX-XXX \u043d\u0430 access token.<\/p>\n<details class=\"spoiler\">\n<summary>\u041f\u043e\u0437\u0430\u0438\u043c\u0441\u0442\u0432\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u043a\u0443\u0441\u043e\u043a \u043f\u043e\u0434 \u0441\u043f\u043e\u0439\u043b\u0435\u0440\u043e\u043c<\/summary>\n<div class=\"spoiler__content\">\n<pre><code>def service = services.get(\"git\");  def Repository getRepository(String repositoryURI, String localDirectoryName) {   Repository repository;   Environment environment = services.component.getInstance(Environment);   File permDir = environment.getPermanentDirectory();   File localGitDirectory = new File(permDir, \"git\")   File localDirectory = new File(localGitDirectory, localDirectoryName);   File gitDirectory = new File(localDirectory, \".git\");  \/\/ println \"Local Git repository is at [${gitDirectory}]\"   FileRepositoryBuilder builder = new FileRepositoryBuilder();   try {     \/\/ Step 1: Initialize Git environment     repository = builder.setGitDir(gitDirectory)                         .readEnvironment()                         .findGitDir()                         .build();     Git git = new Git(repository);     \/\/ Step 2: Verify if the directory exists and isn't empty.     if (!gitDirectory.exists()) {       \/\/ Step 2.1: Need to clone the remote repository since it doesn't exist       git.cloneRepository()          .setCredentialsProvider(getCredentialsProvider())          .setDirectory(localDirectory)<\/code><\/pre>\n<\/div>\n<\/details>\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-333497","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/333497","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=333497"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/333497\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=333497"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=333497"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=333497"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}