{"id":55870,"date":"2020-01-30T00:00:00","date_gmt":"2020-01-29T21:00:00","guid":{"rendered":"https:\/\/prohoster.info\/blog\/blog_prohoster\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian"},"modified":"2020-02-18T14:04:02","modified_gmt":"2020-02-18T11:04:02","slug":"ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","status":"publish","type":"post","link":"https:\/\/prohoster.info\/az\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","title":{"rendered":"Skriptd\u0259n \u00f6z platformam\u0131za: CIAN-da inki\u015faf\u0131 nec\u0259 avtomatla\u015fd\u0131rd\u0131q","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Skriptd\u0259n \u00f6z platformam\u0131za: CIAN-da inki\u015faf\u0131 nec\u0259 avtomatla\u015fd\u0131rd\u0131q\" src=\"\/wp-content\/uploads\/2020\/01\/965f1944c95e2020bec512a05d980a32.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nRIT 2019-da \u0259m\u0259kda\u015f\u0131m\u0131z Aleksandr Korotkov avtomatla\u015fd\u0131rma haqq\u0131nda dan\u0131\u015fd\u0131 <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=0wvUyjexoIg\">hesabat<\/a><\/noindex> C\u0130AN-da inki\u015faf \u00fc\u00e7\u00fcn: i\u015fimizi asanla\u015fd\u0131rmaq m\u0259qs\u0259dil\u0259 \u00f6z platformam\u0131z Integro-dan istifad\u0259 edirik. Bu platforma tap\u015f\u0131r\u0131qlar\u0131n h\u0259yat d\u00f6vr\u00fcn\u00fc izl\u0259yir, inki\u015faf\u00e7\u0131lardan g\u00fcnd\u0259lik \u0259m\u0259liyyatlar\u0131 g\u00f6t\u00fcr\u0259r\u0259k production-da olan x\u0259ta say\u0131n\u0131 \u0259h\u0259miyy\u0259tli d\u0259r\u0259c\u0259d\u0259 azald\u0131r. Bu yaz\u0131da Aleksandr\u0131n t\u0259qdimat\u0131n\u0131 tamamlayacaq v\u0259 sad\u0259 skriptl\u0259rd\u0259n \u00f6z platformam\u0131z vasit\u0259sil\u0259 open source m\u0259hsullar\u0131n birl\u0259\u015fdirilm\u0259si yolunu nec\u0259 g\u0259zdiyimizi, habel\u0259 avtomatla\u015fd\u0131rma \u00fczr\u0259 x\u00fcsusi komandam\u0131z\u0131n n\u0259l\u0259r etdiyini izah ed\u0259c\u0259yik.<br \/>\n\u00a0<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>S\u0131f\u0131r s\u0259viyy\u0259si<\/h2>\n<p>\n<i><b>\u00abS\u0131f\u0131r s\u0259viyy\u0259si olmur, bel\u0259 bir \u015fey tan\u0131m\u0131ram\u00bb<\/b><br \/>\n\u015eifu Usta, \u00abKung Fu Panda\u00bb cizgi filmind\u0259n<\/i><\/p>\n<p>C\u0130AN-da avtomatla\u015fd\u0131rma \u015firk\u0259t qurulandan 14 il sonra ba\u015flay\u0131b. O zaman inki\u015faf komandas\u0131nda 35 insan vard\u0131. D\u00fc\u015f\u00fcnm\u0259k \u00e7\u0259tindir, d\u00fczd\u00fcr? \u018flb\u0259tt\u0259 ki, m\u00fc\u0259yy\u0259n bir d\u0259r\u0259c\u0259d\u0259 avtomatla\u015fd\u0131rma m\u00f6vcud idi, lakin davaml\u0131 inteqrasiya v\u0259 kodun \u00e7atd\u0131r\u0131lmas\u0131 \u00fczr\u0259 ayr\u0131 bir istiqam\u0259t 2015-ci ild\u0259n formala\u015fma\u011fa ba\u015flad\u0131.\u00a0<\/p>\n<p>O vaxt bizim Python, C# v\u0259 PHP-d\u0259n ibar\u0259t b\u00f6y\u00fck bir monolit var idi, Linux\/Windows serverl\u0259rind\u0259 yerl\u0259\u015fdirilmi\u015fdi. Bu canavar\u0131 yerl\u0259\u015fdirm\u0259k \u00fc\u00e7\u00fcn \u0259l il\u0259 i\u015f\u0259 sald\u0131\u011f\u0131m\u0131z skriptl\u0259rd\u0259n ibar\u0259t bir toplanmam\u0131z var idi. H\u0259m\u00e7inin monolitin qurulmas\u0131 da var idi, bu is\u0259 budaqlar\u0131n birl\u0259\u015fdirilm\u0259sind\u0259 konfliktl\u0259r, q\u00fcsurlar\u0131n d\u00fcz\u0259li\u015fi v\u0259 \u00abdig\u0259r tap\u015f\u0131r\u0131qlar il\u0259 yenid\u0259n qurulma\u00bb s\u0259b\u0259bind\u0259n a\u011fr\u0131 v\u0259 \u0259zab g\u0259tirirdi. Sad\u0259 ifad\u0259 il\u0259 proses bel\u0259 g\u00f6r\u00fcn\u00fcrd\u00fc:<\/p>\n<p><img decoding=\"async\" alt=\"Skriptd\u0259n \u00f6z platformam\u0131za: CIAN-da inki\u015faf\u0131 nec\u0259 avtomatla\u015fd\u0131rd\u0131q\" src=\"\/wp-content\/uploads\/2020\/01\/03c4dd97e2ba0073bab1c33f6003a9ec.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nBundan m\u0259mnun deyildik v\u0259 t\u0259krarlana bil\u0259n, avtomatla\u015fd\u0131r\u0131lm\u0131\u015f v\u0259 idar\u0259 olunan bir qurma v\u0259 yerl\u0259\u015fdirm\u0259 prosesi yaratmaq ist\u0259yirdik. Bunun \u00fc\u00e7\u00fcn CI\/CD sistemin\u0259 ehtiyac\u0131m\u0131z var idi v\u0259 pulsuz versiya olan Teamcity il\u0259 pulsuz Jenkins aras\u0131nda se\u00e7im edirdik, \u00e7\u00fcnki onlarla i\u015fl\u0259yirdik v\u0259 h\u0259r ikisi funksiyalar\u0131 \u00fczr\u0259 bizi qane edirdi. Daha yeni bir m\u0259hsul oldu\u011fu \u00fc\u00e7\u00fcn Teamcity-ni se\u00e7dik. O zaman mikrosistem arxitekturas\u0131ndan istifad\u0259 etmirdik v\u0259 \u00e7ox sayda tap\u015f\u0131r\u0131qlar v\u0259 layih\u0259l\u0259r g\u00f6zl\u0259mirdik.<\/p>\n<h2>\u00d6z sistemimizin ideyas\u0131na g\u0259lirik<\/h2>\n<p>\nTeamcity-nin t\u0259tbiqi yaln\u0131z bir hiss\u0259sini \u0259l i\u015find\u0259n \u00e7\u0131xard\u0131: h\u0259l\u0259 d\u0259 Pull Request-l\u0259rin yarad\u0131lmas\u0131, Jira-da tap\u015f\u0131r\u0131qlar\u0131n statuslar\u0131na ir\u0259lil\u0259m\u0259si, burax\u0131l\u0131\u015f \u00fc\u00e7\u00fcn tap\u015f\u0131r\u0131qlar\u0131n se\u00e7ilm\u0259si qal\u0131rd\u0131. Teamcity bu i\u015fl\u0259rin \u00f6hd\u0259sind\u0259n g\u0259lmirdi. Daha da avtomatla\u015fd\u0131rma yolu se\u00e7ilm\u0259li idi. Teamcity-d\u0259 skriptl\u0259rl\u0259 i\u015fl\u0259m\u0259 variantlar\u0131n\u0131 v\u0259 ya xarici avtomatla\u015fd\u0131rma sisteml\u0259rin\u0259 ke\u00e7idi n\u0259z\u0259rd\u0259n ke\u00e7irdik. Ancaq n\u0259tic\u0259d\u0259 q\u0259rara ald\u0131q ki, yaln\u0131z \u00f6z h\u0259llimizl\u0259 \u0259ld\u0259 edil\u0259n maksimal \u00e7eviklik laz\u0131md\u0131r. Bel\u0259likl\u0259, Integro adl\u0131 daxili avtomatla\u015fd\u0131rma sisteminin ilk versiyas\u0131 yarand\u0131.<\/p>\n<p>Teamcity, y\u0131\u011fma v\u0259 yerl\u0259\u015fdirm\u0259 prosesl\u0259rinin avtomatla\u015fd\u0131r\u0131lmas\u0131 il\u0259 m\u0259\u015f\u011fuldur, Integro is\u0259 proqram inki\u015faf prosesl\u0259rinin \u00fcst s\u0259viyy\u0259d\u0259 avtomatla\u015fd\u0131r\u0131lmas\u0131na fokusland\u0131. Jira-da tap\u015f\u0131r\u0131q i\u015fl\u0259m\u0259yi Bitbucket-da \u0259laq\u0259li m\u0259nb\u0259 kodu il\u0259 birl\u0259\u015fdirm\u0259k laz\u0131m idi. Bu m\u0259rh\u0259l\u0259d\u0259 Integro daxilind\u0259 m\u00fcxt\u0259lif n\u00f6v tap\u015f\u0131r\u0131qlar \u00fc\u00e7\u00fcn \u00f6z i\u015f ax\u0131nlar\u0131 yaranma\u011fa ba\u015flad\u0131.\u00a0<\/p>\n<p>Biznes prosesl\u0259rind\u0259 avtomatla\u015fd\u0131rman\u0131n artmas\u0131 il\u0259 birlikd\u0259 Teamcity-d\u0259 layih\u0259l\u0259rin v\u0259 run-lar\u0131n say\u0131 artd\u0131. Bel\u0259likl\u0259 yeni bir problem ortaya \u00e7\u0131xd\u0131: bir pulsuz Teamcity instansiyas\u0131 (3 agent v\u0259 100 layih\u0259) art\u0131q yet\u0259rli olmurdu, biz \u0259lav\u0259 bir instansiya (daha 3 agent v\u0259 100 layih\u0259) \u0259lav\u0259 etdik, sonra bir daha. N\u0259tic\u0259d\u0259 \u00e7\u0259tin idar\u0259 olunan bir ne\u00e7\u0259 klasterd\u0259n ibar\u0259t sistem \u0259ld\u0259 etdik:<\/p>\n<p><img decoding=\"async\" alt=\"Skriptd\u0259n \u00f6z platformam\u0131za: CIAN-da inki\u015faf\u0131 nec\u0259 avtomatla\u015fd\u0131rd\u0131q\" src=\"\/wp-content\/uploads\/2020\/01\/d95565e01e70e31f6b139dfb9b9caf95.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n4-c\u00fc instansiya il\u0259 ba\u011fl\u0131 sual ortaya \u00e7\u0131xanda, bildik ki, bu c\u00fcr ya\u015fama\u011f\u0131n m\u00fcmk\u00fcns\u00fcz oldu\u011fu, \u00e7\u00fcnki 4 instansiyan\u0131n d\u0259st\u0259kl\u0259nm\u0259si \u00fc\u00e7\u00fcn c\u0259mi x\u0259rcl\u0259r art\u0131q he\u00e7 bir \u00e7\u0259r\u00e7iv\u0259y\u0259 s\u0131\u011fm\u0131rd\u0131. Pulsuz Jenkins-i se\u00e7m\u0259k v\u0259 ya \u00f6d\u0259ni\u015fli Teamcity almaq bar\u0259d\u0259 sual yarand\u0131. Instansiyalar v\u0259 avtomatla\u015fd\u0131rma planlar\u0131 \u00fcz\u0259rind\u0259 hesablamalar apar\u0131b, Jenkins-d\u0259 ya\u015fama\u011fa q\u0259rar verdik. Bir ne\u00e7\u0259 h\u0259ft\u0259d\u0259n sonra Jenkins-\u0259 ke\u00e7dik v\u0259 bir ne\u00e7\u0259 Teamcity instansiyas\u0131n\u0131 d\u0259st\u0259kl\u0259m\u0259 il\u0259 ba\u011fl\u0131 olan b\u0259zi a\u011fr\u0131lardan qurtulmu\u015f olduq. Bel\u0259likl\u0259, Integro inki\u015faf\u0131na v\u0259 Jenkins-d\u0259n \u00f6z\u00fcm\u00fcz\u0259 uy\u011funla\u015fd\u0131rma\u011fa daha \u00e7ox fokuslana bildik.<\/p>\n<p>\u018fsas avtomatla\u015fd\u0131rman\u0131n artmas\u0131 il\u0259 ( avtomatik Pull Request-l\u0259rin yarad\u0131lmas\u0131, Code coverage-in y\u0131\u011f\u0131lmas\u0131 v\u0259 d\u0259rc edilm\u0259si v\u0259 dig\u0259r yoxlamalar) \u0259l il\u0259 burax\u0131l\u0131\u015flardan m\u00fcmk\u00fcn q\u0259d\u0259r imtina etm\u0259k v\u0259 bu i\u015fi robotlara verm\u0259k ist\u0259yi yarand\u0131. Bundan \u0259lav\u0259, \u015firk\u0259t daxilind\u0259 mikroservisl\u0259r\u0259 ke\u00e7id ba\u015flad\u0131 ki, bu da m\u00fcst\u0259qil \u015f\u0259kild\u0259 tez-tez burax\u0131l\u0131\u015flar\u0131 t\u0259l\u0259b edirdi. Bel\u0259likl\u0259, biz t\u0259dric\u0259n mikroservisl\u0259rimizin avtomatik burax\u0131l\u0131\u015flar\u0131na g\u0259ldik (monolit prosesin m\u00fcr\u0259kk\u0259bliyi s\u0259b\u0259bind\u0259n \u0259l il\u0259 burax\u0131l\u0131r). Ancaq ad\u0259t\u0259n oldu\u011fu kimi, yeni \u00e7\u0259tinlikl\u0259r yarand\u0131.\u00a0<\/p>\n<h2>Testl\u0259rin avtomatla\u015fd\u0131r\u0131lmas\u0131<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Skriptd\u0259n \u00f6z platformam\u0131za: CIAN-da inki\u015faf\u0131 nec\u0259 avtomatla\u015fd\u0131rd\u0131q\" src=\"\/wp-content\/uploads\/2020\/01\/9518ee0956922c6eb615bdef068ac525.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nBurax\u0131l\u0131\u015flar\u0131n avtomatla\u015fd\u0131r\u0131lmas\u0131 inki\u015faf prosesl\u0259rini s\u00fcr\u0259tl\u0259ndirdi, bir hiss\u0259si is\u0259 b\u0259zi test m\u0259rh\u0259l\u0259l\u0259rinin atlanmas\u0131 hesab\u0131na ba\u015f verdi. Bu da keyfiyy\u0259tin m\u00fcv\u0259qq\u0259ti itirilm\u0259sin\u0259 s\u0259b\u0259b oldu. Banal s\u0259sl\u0259nir, amma burax\u0131l\u0131\u015flar\u0131n s\u00fcr\u0259tl\u0259nm\u0259si il\u0259 m\u0259hsul inki\u015faf metodologiyas\u0131n\u0131 da d\u0259yi\u015fm\u0259k vacib idi. Testl\u0259rin avtomatla\u015fd\u0131r\u0131lmas\u0131, inki\u015faf etdiricinin burax\u0131lan kod v\u0259 i\u00e7ind\u0259ki s\u0259hvl\u0259r\u0259 g\u00f6r\u0259 f\u0259rdi m\u0259suliyy\u0259tini (burada s\u00f6hb\u0259t \u00abba\u015fda ideyaya q\u0259bul\u00bb haqq\u0131nda gedir, maliyy\u0259 c\u0259rim\u0259l\u0259ri deyil) n\u0259z\u0259r\u0259 almaq v\u0259 avtomatik yerl\u0259\u015fdirm\u0259 vasit\u0259sil\u0259 tap\u015f\u0131r\u0131q\u0131n burax\u0131lmas\u0131 \/ burax\u0131lmamas\u0131 q\u0259rar\u0131n\u0131 verm\u0259y\u0259 d\u00fc\u015f\u00fcnm\u0259k laz\u0131m idi.\u00a0<\/p>\n<p>Keyfiyy\u0259t probleml\u0259rini aradan qald\u0131rark\u0259n iki m\u00fch\u00fcm q\u0259rara g\u0259ldik: kanar testl\u0259ri ke\u00e7irm\u0259y\u0259 ba\u015flad\u0131q v\u0259 avtomatik monitorinq sistemini t\u0259tbiq etdik ki, bu da onun a\u015f\u0131lmas\u0131na avtomatik cavab verm\u0259yi t\u0259min edir. Birinci q\u0259rar, kodun production-a tam giri\u015find\u0259n \u0259vv\u0259l a\u00e7\u0131q s\u0259hvl\u0259ri tapma\u011fa k\u00f6m\u0259k etdi, ikinci is\u0259 production-da probleml\u0259r\u0259 reaksiyalar\u0131n vaxt\u0131n\u0131 azaltd\u0131. S\u0259hvl\u0259r \u0259lb\u0259tt\u0259 var, amma biz vaxt\u0131m\u0131z\u0131n v\u0259 enerjimizin daha \u00e7oxunu d\u00fcz\u0259ltm\u0259y\u0259 deyil, minimalla\u015fd\u0131rma\u011fa s\u0259rf edirik.\u00a0<\/p>\n<h2>Avtomatla\u015fd\u0131rma komandas\u0131<\/h2>\n<p>\n\u0130ndi 130 inki\u015faf etdiricid\u0259n ibar\u0259t komandam\u0131z var v\u0259 biz davam edirik <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/article\/469965\/\">b\u00f6y\u00fcm\u0259y\u0259<\/a><\/noindex>. Davaml\u0131 inteqrasiya v\u0259 kod \u00e7atd\u0131r\u0131lmas\u0131 komandas\u0131 (daha sonra \u2014 Deploy and Integration komandas\u0131 v\u0259 ya DI) 7 n\u0259f\u0259rd\u0259n ibar\u0259tdir v\u0259 2 istiqam\u0259td\u0259 \u00e7al\u0131\u015f\u0131r: Integro avtomatla\u015fd\u0131rma platformas\u0131n\u0131n inki\u015faf\u0131 v\u0259 DevOps.\u00a0<\/p>\n<p>DevOps, CIAN sayt\u0131n\u0131n Dev\/Beta m\u00fchitin\u0259, Integro m\u00fchitin\u0259 cavabdehdir, inki\u015faf etdiricil\u0259r\u0259 probleml\u0259rinin h\u0259llind\u0259 k\u00f6m\u0259k edir v\u0259 m\u00fchitl\u0259rin \u00f6l\u00e7ekl\u0259nm\u0259si \u00fc\u00e7\u00fcn yeni yana\u015fmalar haz\u0131rlay\u0131r. Integro inki\u015faf\u0131 h\u0259m Integro-nun \u00f6z\u00fcn\u00fc, h\u0259m d\u0259 Jenkins, Jira, Confluence kimi \u0259laq\u0259li xidm\u0259tl\u0259ri, el\u0259c\u0259 d\u0259 inki\u015faf komandalar\u0131 \u00fc\u00e7\u00fcn k\u00f6m\u0259k\u00e7i d\u0259st v\u0259 t\u0259tbiql\u0259r haz\u0131rlay\u0131r.\u00a0<\/p>\n<p>DI komandas\u0131, \u015firk\u0259t daxilind\u0259 arxitektura, kitabxanalar v\u0259 inki\u015faf yana\u015fmalar\u0131 \u00fcz\u0259rind\u0259 i\u015fl\u0259y\u0259n Platform komandas\u0131 il\u0259 birg\u0259 f\u0259aliyy\u0259t g\u00f6st\u0259rir. Bununla yana\u015f\u0131, CIAN i\u00e7\u0259risind\u0259 h\u0259r bir inki\u015faf etdirici avtomatla\u015fd\u0131rmaya t\u00f6hf\u0259 ver\u0259 bil\u0259r, m\u0259s\u0259l\u0259n, komandan\u0131n ehtiyaclar\u0131na uy\u011fun mikroavtomatla\u015fd\u0131rma h\u0259yata ke\u00e7ir\u0259 bil\u0259r v\u0259 ya avtomatla\u015fd\u0131rman\u0131 daha yax\u015f\u0131 etm\u0259k \u00fc\u00e7\u00fcn g\u00f6z\u0259l bir ideya payla\u015fa bil\u0259r.<\/p>\n<h2>CIAN-da avtomatla\u015fd\u0131rma layneri<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Skriptd\u0259n \u00f6z platformam\u0131za: CIAN-da inki\u015faf\u0131 nec\u0259 avtomatla\u015fd\u0131rd\u0131q\" src=\"\/wp-content\/uploads\/2020\/01\/22dcd2d0cc283d53bdaac081885657f8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAvtomatla\u015fd\u0131rmada istifad\u0259 olunan b\u00fct\u00fcn sisteml\u0259ri bir ne\u00e7\u0259 lay\u0259 ay\u0131rmaq m\u00fcmk\u00fcnd\u00fcr:<\/p>\n<ol>\n<li>Xarici sisteml\u0259r (Jira, Bitbucket v\u0259 s.). Onlarla inki\u015faf etdirici komandalar i\u015fl\u0259yir.\n<\/li>\n<li>Integro Platformas\u0131. \u00c7ox vaxt inki\u015faf etdiricil\u0259r bu il\u0259 birba\u015fa i\u015fl\u0259mirl\u0259r, lakin avtomatla\u015fd\u0131rman\u0131n b\u00fct\u00fcn i\u015fini d\u0259st\u0259kl\u0259yir.\n<\/li>\n<li>\u00c7atd\u0131r\u0131lma, orkestrasiya v\u0259 a\u015fkar etm\u0259 xidm\u0259tl\u0259ri (m\u0259s\u0259l\u0259n, Jenkins, Consul, Nomad). Onlar\u0131n k\u00f6m\u0259yi il\u0259 kodu serverl\u0259rd\u0259 yerl\u0259\u015fdirir v\u0259 xidm\u0259tl\u0259rin bir-biri il\u0259 i\u015fl\u0259m\u0259sini t\u0259min edirik.\n<\/li>\n<li>Fiziki s\u0259viyy\u0259 (serverl\u0259r, OS, \u0259laq\u0259li proqram t\u0259minat\u0131). Bu s\u0259viyy\u0259d\u0259 kodumuz i\u015fl\u0259yir. Bu, fiziki bir server, h\u0259m d\u0259 virtual (LXC, KVM, Docker) ola bil\u0259r.\n<\/li>\n<\/ol>\n<p>\nBu konsepsiyadan ir\u0259lil\u0259y\u0259r\u0259k DI komandas\u0131 i\u00e7\u0259risind\u0259 m\u0259suliyy\u0259t sah\u0259l\u0259rini b\u00f6l\u00fcr\u00fck. \u0130lk iki s\u0259viyy\u0259 Integro inki\u015faf\u0131 istiqam\u0259tinin m\u0259suliyy\u0259tind\u0259, son iki s\u0259viyy\u0259 is\u0259 DevOps-un m\u0259suliyy\u0259tind\u0259dir. Bel\u0259 bir b\u00f6l\u00fcnm\u0259 v\u0259zif\u0259l\u0259r\u0259 fokuslanma\u011fa imkan tan\u0131y\u0131r v\u0259 qar\u015f\u0131l\u0131ql\u0131 f\u0259aliyy\u0259t\u0259 mane olmur, \u00e7\u00fcnki biz bir-birimizl\u0259 yan-yana dayan\u0131r\u0131q v\u0259 davaml\u0131 olaraq bilik v\u0259 t\u0259cr\u00fcb\u0259 m\u00fcbadil\u0259si edirik.<\/p>\n<h2>Integro<\/h2>\n<p>\nIntegro-ya fokuslanaq v\u0259 texnoloji y\u0131\u011f\u0131nla ba\u015flayaq:<\/p>\n<ul>\n<li>CentOs 7\n<\/li>\n<li>Docker + Nomad + Consul + Vault\n<\/li>\n<li>Java 11 (k\u00f6hn\u0259 Integro monoliti Java 8-d\u0259 qalacaq)\n<\/li>\n<li>Spring Boot 2.X + Spring Cloud Config\n<\/li>\n<li>PostgreSql 11\n<\/li>\n<li>RabbitMQ\u00a0\n<\/li>\n<li>Apache Ignite\n<\/li>\n<li>Camunda (embedded)\n<\/li>\n<li>Grafana + Graphite + Prometheus + Jaeger + ELK\n<\/li>\n<li>Web UI: React (CSR) + MobX\n<\/li>\n<li>SSO: Keycloak\n<\/li>\n<\/ul>\n<p>\nMikroservis inki\u015faf\u0131 prinsipin\u0259 riay\u0259t edirik, baxmayaraq ki, Integro-nun \u0259vv\u0259lki versiyas\u0131 kimi bir monolit olan miras\u0131m\u0131z da var. H\u0259r bir mikroservis \u00f6z docker konteynerind\u0259 i\u015fl\u0259yir, servisl\u0259r bir-biri il\u0259 HTTP sor\u011fular\u0131 v\u0259 RabbitMQ mesajlar\u0131 vasit\u0259sil\u0259 \u00fcnsiyy\u0259t qururlar. Mikroservisl\u0259r bir-birini Consul vasit\u0259sil\u0259 tap\u0131r v\u0259 ona sor\u011fu g\u00f6nd\u0259rirl\u0259r, SSO (Keycloak, OAuth 2\/OpenID Connect) vasit\u0259sil\u0259 identifikasiya olunurlar.<\/p>\n<p><img decoding=\"async\" alt=\"Skriptd\u0259n \u00f6z platformam\u0131za: CIAN-da inki\u015faf\u0131 nec\u0259 avtomatla\u015fd\u0131rd\u0131q\" src=\"\/wp-content\/uploads\/2020\/01\/e7630c0bd62a40f397de1bf1c1097926.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nReal bir misal olaraq Jenkins il\u0259 qar\u015f\u0131l\u0131ql\u0131 \u0259laq\u0259ni a\u015fa\u011f\u0131dak\u0131 m\u0259rh\u0259l\u0259l\u0259rd\u0259n ibar\u0259t n\u0259z\u0259rd\u0259n ke\u00e7ir\u0259k:<\/p>\n<ol>\n<li>Workflow idar\u0259etm\u0259 mikroservisi (sonrak\u0131 Flow mikroservisi) Jenkins-d\u0259 bir y\u0131\u011f\u0131ncaq ba\u015flatmaq ist\u0259yir. Bunun \u00fc\u00e7\u00fcn Consul vasit\u0259sil\u0259 Jenkins-in inteqrasiya mikroservisinin IP:PORT \u00fcnvan\u0131n\u0131 tap\u0131r v\u0259 Jenkins-d\u0259 y\u0131\u011f\u0131nca\u011f\u0131n ba\u015flanmas\u0131 \u00fc\u00e7\u00fcn ona asinxron bir sor\u011fu g\u00f6nd\u0259rir.\n<\/li>\n<li>Jenkins mikroservisi sor\u011funu ald\u0131qdan sonra tap\u015f\u0131r\u0131\u011f\u0131n n\u0259tic\u0259sini tan\u0131maq \u00fc\u00e7\u00fcn istifad\u0259 edil\u0259c\u0259k \u0130\u015f ID-sini formala\u015fd\u0131r\u0131r v\u0259 cavab olaraq t\u0259qdim edir. Bununla yana\u015f\u0131, Jenkins-d\u0259 y\u0131\u011f\u0131nca\u011f\u0131 ba\u015flatmaq \u00fc\u00e7\u00fcn REST API-d\u0259n \u00e7a\u011f\u0131r\u0131\u015f edir.\n<\/li>\n<li>Jenkins, y\u0131\u011f\u0131nca\u011f\u0131 ba\u015fa \u00e7atd\u0131rd\u0131qdan sonra Jenkins mikroservisin\u0259 n\u0259tic\u0259l\u0259ri il\u0259 birlikd\u0259 webhook g\u00f6nd\u0259rir.\n<\/li>\n<li>Jenkins mikroservisi webhook-u ald\u0131qdan sonra sor\u011funun i\u015fl\u0259nm\u0259sinin ba\u015fa \u00e7atmas\u0131 haqq\u0131nda m\u0259lumat mesaj\u0131n\u0131 formala\u015fd\u0131r\u0131r v\u0259 n\u0259tic\u0259l\u0259ri ona \u0259lav\u0259 edir. Formala\u015fd\u0131r\u0131lm\u0131\u015f mesaj RabbitMQ n\u00f6vb\u0259sin\u0259 g\u00f6nd\u0259rilir.\n<\/li>\n<li>RabbitMQ vasit\u0259sil\u0259 yay\u0131mlanan mesaj Flow mikroservisin\u0259 \u00e7at\u0131r, bu da \u00f6z tap\u015f\u0131r\u0131\u011f\u0131n\u0131n n\u0259tic\u0259si haqq\u0131nda m\u0259lumat al\u0131r, sor\u011fudak\u0131 \u0130\u015f ID-si il\u0259 al\u0131nan mesaj\u0131 uy\u011funla\u015fd\u0131raraq.\n<\/li>\n<\/ol>\n<p>\nHaz\u0131rda 30-a q\u0259d\u0259r mikroservisimiz var ki, bunlar\u0131 bir ne\u00e7\u0259 qrupa ay\u0131rmaq m\u00fcmk\u00fcnd\u00fcr:<\/p>\n<ol>\n<li>Konfiqurasiyalar\u0131n idar\u0259 edilm\u0259si.\n<\/li>\n<li>\u0130stifad\u0259\u00e7il\u0259rl\u0259 m\u0259lumat m\u00fcbadil\u0259si v\u0259 qar\u015f\u0131l\u0131ql\u0131 \u0259laq\u0259 (messenger, e-po\u00e7t).\n<\/li>\n<li>M\u0259nb\u0259 kodu il\u0259 i\u015f.\n<\/li>\n<li>Yay\u0131m al\u0259tl\u0259ri il\u0259 inteqrasiya (Jenkins, Nomad, Consul v\u0259 s.).\n<\/li>\n<li>\u0130zl\u0259m\u0259 (burax\u0131l\u0131\u015flar, x\u0259talar v\u0259 s.).\n<\/li>\n<li>Web al\u0259tl\u0259ri (test m\u00fchitl\u0259rinin idar\u0259si \u00fc\u00e7\u00fcn UI, statistikalar\u0131n toplanmas\u0131 v\u0259 s.).\n<\/li>\n<li>Tap\u015f\u0131r\u0131q izl\u0259yicil\u0259ri v\u0259 b\u0259nz\u0259r sisteml\u0259rl\u0259 inteqrasiya.\n<\/li>\n<li>M\u00fcxt\u0259lif tap\u015f\u0131r\u0131qlar \u00fc\u00e7\u00fcn workflow-un idar\u0259 edilm\u0259si.\n<\/li>\n<\/ol>\n<p><\/p>\n<h2>Tap\u015f\u0131r\u0131\u011f\u0131n workflow-u<\/h2>\n<p>\nIntegro, tap\u015f\u0131r\u0131\u011f\u0131n h\u0259yat d\u00f6vr\u00fc il\u0259 ba\u011fl\u0131 h\u0259r\u0259k\u0259tl\u0259ri avtomatla\u015fd\u0131r\u0131r. Sad\u0259l\u0259\u015fdirilmi\u015f olaraq tap\u015f\u0131r\u0131\u011f\u0131n h\u0259yat d\u00f6vr\u00fcn\u00fc Jira-dak\u0131 tap\u015f\u0131r\u0131\u011f\u0131n workflow-u olaraq ba\u015fa d\u00fc\u015f\u00fcr\u00fck. Bizim inki\u015faf prosesl\u0259rimizd\u0259 layih\u0259y\u0259, tap\u015f\u0131r\u0131\u011f\u0131n n\u00f6v\u00fcn\u0259 v\u0259 konkret tap\u015f\u0131r\u0131qda se\u00e7ilmi\u015f se\u00e7iml\u0259r\u0259 g\u00f6r\u0259 bir ne\u00e7\u0259 workflow variant\u0131 var.\u00a0<\/p>\n<p>\u00c7ox istifad\u0259 etdiyimiz workflow-u n\u0259z\u0259rd\u0259n ke\u00e7ir\u0259k:<\/p>\n<p><img decoding=\"async\" alt=\"Skriptd\u0259n \u00f6z platformam\u0131za: CIAN-da inki\u015faf\u0131 nec\u0259 avtomatla\u015fd\u0131rd\u0131q\" src=\"\/wp-content\/uploads\/2020\/01\/62555be6bab024dd30f3cf70d4fe3cba.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nC\u0259dv\u0259ld\u0259yken di\u015fli, transition-un Integro t\u0259r\u0259find\u0259n avtomatik olaraq \u00e7a\u011f\u0131r\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6st\u0259rir, insan fiquru is\u0259 transition-un insan t\u0259r\u0259find\u0259n \u0259l il\u0259 \u00e7a\u011f\u0131r\u0131ld\u0131\u011f\u0131n\u0131 ifad\u0259 edir. Bir ne\u00e7\u0259 yol \u00fcmumi ax\u0131nda (workflow) m\u0259s\u0259l\u0259nin ke\u00e7\u0259 bil\u0259c\u0259yini n\u0259z\u0259rd\u0259n ke\u00e7ir\u0259k.<\/p>\n<p>Tamamil\u0259 \u0259l il\u0259 test m\u00fchitind\u0259 DEV+BETA kanar\u0131 testl\u0259ri olmadan (ad\u0259t\u0259n monolitl\u0259ri bel\u0259 burax\u0131r\u0131q):<\/p>\n<p><img decoding=\"async\" alt=\"Skriptd\u0259n \u00f6z platformam\u0131za: CIAN-da inki\u015faf\u0131 nec\u0259 avtomatla\u015fd\u0131rd\u0131q\" src=\"\/wp-content\/uploads\/2020\/01\/775528862e14817dff5f69db6de654dd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nTransition-un dig\u0259r kombinasyonlar\u0131 da ola bil\u0259r. B\u0259z\u0259n m\u0259s\u0259l\u0259nin ke\u00e7\u0259c\u0259yi yolu Jira-dak\u0131 se\u00e7iml\u0259rl\u0259 se\u00e7m\u0259k m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<h2>M\u0259s\u0259l\u0259nin h\u0259r\u0259k\u0259ti<\/h2>\n<p>\nDEV + kanar\u0131 testl\u0259rind\u0259 m\u0259s\u0259l\u0259ni h\u0259r\u0259k\u0259t etdirm\u0259k \u00fc\u00e7\u00fcn icra olunan \u0259sas m\u0259rh\u0259l\u0259l\u0259ri n\u0259z\u0259rd\u0259n ke\u00e7ir\u0259k:<\/p>\n<p>1. \u0130nki\u015faf\u00e7\u0131 v\u0259 ya PM m\u0259s\u0259l\u0259 yarad\u0131r.<\/p>\n<p>2. \u0130nki\u015faf\u00e7\u0131 m\u0259s\u0259l\u0259ni i\u015f\u0259 g\u00f6t\u00fcr\u00fcr. Tamamland\u0131qdan sonra onu IN REVIEW statusuna ke\u00e7irir.<\/p>\n<p>3. Jira, Jira-mikroservisin\u0259 Webhook g\u00f6nd\u0259rir (Jira il\u0259 inteqrasiya \u00fc\u00e7\u00fcn m\u0259suliyy\u0259t da\u015f\u0131y\u0131r).<\/p>\n<p>4. Jira-mikroservisi, workflow-u ba\u015flatmaq \u00fc\u00e7\u00fcn Flow-servisin\u0259 sor\u011fu g\u00f6nd\u0259rir (i\u015fin yerin\u0259 yetirildiyi daxili i\u015f ax\u0131nlar\u0131ndan m\u0259suldur).<\/p>\n<p>5. Flow-servisinin daxilind\u0259:<\/p>\n<ul>\n<li>M\u0259s\u0259l\u0259y\u0259 revyuverl\u0259r t\u0259yin edilir (\u0130stifad\u0259\u00e7il\u0259r-mikroservisi, b\u00fct\u00fcn istifad\u0259\u00e7il\u0259r haqq\u0131nda m\u0259lumatlar\u0131 bil\u0259n + Jira-mikroservisi).<\/li>\n<li>Source-mikroservisind\u0259n (repo v\u0259 budaqlar haqq\u0131nda m\u0259lumat\u0131 bil\u0259n, amma kodun \u00f6z\u00fc il\u0259 i\u015fl\u0259mir) m\u0259s\u0259l\u0259mizin buda\u011f\u0131 olan repo-lar\u0131 tapma\u011fa \u00e7al\u0131\u015f\u0131r (axtar\u0131\u015f\u0131 asanla\u015fd\u0131rmaq \u00fc\u00e7\u00fcn budaq ad\u0131 Jira-dak\u0131 m\u0259s\u0259l\u0259 n\u00f6mr\u0259si il\u0259 \u00fcst-\u00fcst\u0259 d\u00fc\u015f\u00fcr). Ad\u0259t\u0259n, m\u0259s\u0259l\u0259 yaln\u0131z bir buda\u011fa malik olsa, bu, d\u0259ploy \u00fczr\u0259 s\u0131ran\u0131n idar\u0259 olunmas\u0131n\u0131 asanla\u015fd\u0131r\u0131r v\u0259 repo-lar aras\u0131nda ba\u011fl\u0131l\u0131\u011f\u0131 azald\u0131r.<\/li>\n<li>H\u0259r bir tap\u0131lan budaq \u00fc\u00e7\u00fcn bel\u0259 bir ard\u0131c\u0131ll\u0131qla add\u0131mlar icra olunur:\n<p> i) Master-buda\u011fa \u0259lav\u0259 edilm\u0259 (Kodla i\u015f \u00fc\u00e7\u00fcn Git-mikroservisi).<br \/>\n ii) Budaq inki\u015faf\u00e7\u0131 t\u0259r\u0259find\u0259n d\u0259yi\u015fiklikl\u0259rd\u0259n qorunur (Bitbucket-mikroservisi).<br \/>\n iii) Bu budaq \u00fc\u00e7\u00fcn Pull Request yarad\u0131l\u0131r (Bitbucket-mikroservisi).<br \/>\n iv) \u0130nki\u015faf\u00e7\u0131lar\u0131n chatlar\u0131na yeni Pull Request haqq\u0131nda mesaj g\u00f6nd\u0259rilir (Olaylar\u0131n bildiri\u015fi \u00fc\u00e7\u00fcn Notify-mikroservisi).<br \/>\n v) M\u0259s\u0259l\u0259nin DEV-d\u0259 y\u0131\u011f\u0131lmas\u0131, test edilm\u0259si v\u0259 da\u015f\u0131ma i\u015fl\u0259ri ba\u015flat\u0131l\u0131r (Jenkins-mikroservisi Jenkins il\u0259 i\u015f \u00fc\u00e7\u00fcn).<br \/>\n vi) \u018fg\u0259r b\u00fct\u00fcn \u0259vv\u0259lki n\u00f6qt\u0259l\u0259r u\u011furla ba\u015fa \u00e7atarsa, Integro Pull Request-d\u0259 \u00f6z\u00fcn\u00fc t\u0259sdiq edir (Bitbucket-mikroservisi).<\/li>\n<li>Integro t\u0259yin olunan revyuverl\u0259rd\u0259n Pull Request-d\u0259 t\u0259sdiq g\u00f6zl\u0259yir.<\/li>\n<li>Laz\u0131mi t\u0259sdiql\u0259r al\u0131nd\u0131qda (o c\u00fcml\u0259d\u0259n avtomatla\u015fd\u0131r\u0131lm\u0131\u015f testl\u0259r m\u00fcsb\u0259t ke\u00e7irildikd\u0259), Integro m\u0259s\u0259l\u0259ni Test on Dev statusuna ke\u00e7irir (Jira-mikroservisi).<\/li>\n<\/ul>\n<p>\n6. Test\u00e7il\u0259r v\u0259zif\u0259nin testini apar\u0131rlar. \u018fg\u0259r problem yoxdursa, v\u0259zif\u0259ni Ready For Build statusuna ke\u00e7irirl\u0259r.<\/p>\n<p>7. Integro g\u00f6r\u00fcr ki, v\u0259zif\u0259 burax\u0131l\u0131\u015fa haz\u0131rd\u0131r v\u0259 onu kanar rejimind\u0259 (Jenkins-mikroservis) yerl\u0259\u015fdirm\u0259y\u0259 ba\u015flay\u0131r. Burax\u0131l\u0131\u015fa haz\u0131r olma bir s\u0131ra qaydalarla m\u00fc\u0259yy\u0259n edilir. M\u0259s\u0259l\u0259n, v\u0259zif\u0259 laz\u0131m olan statusdad\u0131r, dig\u0259r v\u0259zif\u0259l\u0259rd\u0259 he\u00e7 bir blokaj yoxdur, haz\u0131rda bu mikroservis \u00fc\u00e7\u00fcn aktiv g\u00f6nd\u0259ri\u015fl\u0259r yoxdur v\u0259 s.<\/p>\n<p>8. V\u0259zif\u0259 Canary statusuna ke\u00e7irilir (Jira-mikroservis).<\/p>\n<p>9. Jenkins, Nomad vasit\u0259si il\u0259 v\u0259zif\u0259ni kanar rejimind\u0259 (\u00fcmumiyy\u0259tl\u0259 1-3 instans) yerl\u0259\u015fdirir v\u0259 burax\u0131l\u0131\u015f izl\u0259m\u0259 xidm\u0259ti (DeployWatch-mikroservis) il\u0259 m\u0259lumat verir.<\/p>\n<p>10. DeployWatch-mikroservisi x\u0259ta fonunu toplay\u0131r v\u0259 gerek olarsa ona reaksiya verir. X\u0259ta fonu a\u015f\u0131larsa (norma avtomatik hesablan\u0131r), inki\u015faf etdiricil\u0259r\u0259 Notify-mikroservisi vasit\u0259si il\u0259 m\u0259lumat verilir. \u018fg\u0259r 5 d\u0259qiq\u0259 \u0259rzind\u0259 inki\u015faf etdirici reaksiya verm\u0259zs\u0259 (Revert v\u0259 ya Stay d\u00fcym\u0259sini basmazsa), kanar instanslar\u0131n avtomatik geri al\u0131nmas\u0131 ba\u015flay\u0131r. \u018fg\u0259r fon a\u015f\u0131lmay\u0131bsa, inki\u015faf etdirici, v\u0259zif\u0259ni Production-da \u0259l il\u0259 yerl\u0259\u015fdirm\u0259lidir (UI-da d\u00fcym\u0259ni basaraq). \u018fg\u0259r 60 d\u0259qiq\u0259 \u0259rzind\u0259 inki\u015faf etdirici Production-da yerl\u0259\u015fdirm\u0259yi ba\u015flatmazsa, kanar instanslar t\u0259hl\u00fck\u0259sizlik m\u0259qs\u0259dil\u0259 d\u0259 geri al\u0131nacaq.<\/p>\n<p>11. Production-da yerl\u0259\u015fdirm\u0259y\u0259 ba\u015fland\u0131qdan sonra:<\/p>\n<ul>\n<li>V\u0259zif\u0259 Production statusuna ke\u00e7irilir (Jira-mikroservis).<\/li>\n<li>Jenkins-mikroservisi yerl\u0259\u015fdirm\u0259 prosesini ba\u015flat\u0131r v\u0259 DeployWatch-mikroservisin\u0259 burax\u0131l\u0131\u015f haqda m\u0259lumat verir.<\/li>\n<li>DeployWatch-mikroservisi Production-da b\u00fct\u00fcn konteynerl\u0259rin yenil\u0259ndiyini yoxlay\u0131r (b\u0259z\u0259n b\u00fct\u00fcn konteynerl\u0259r yenil\u0259nmir).<\/li>\n<li>Notify-mikroservisi vasit\u0259si il\u0259 Production-da yerl\u0259\u015fdirm\u0259nin n\u0259tic\u0259l\u0259ri bar\u0259d\u0259 m\u0259lumat g\u00f6nd\u0259rilir.<\/li>\n<\/ul>\n<p>\n12. \u0130nki\u015faf etdiricil\u0259r, mikroservisin s\u0259hv davran\u0131\u015f\u0131n\u0131 a\u015fkar etdikd\u0259 Production-dan v\u0259zif\u0259ni geri almaq \u00fc\u00e7\u00fcn 30 d\u0259qiq\u0259y\u0259 malikdirl\u0259r. Bu vaxt bitdikd\u0259n sonra v\u0259zif\u0259 avtomatik olan master (Git-mikroservis) daxil edil\u0259c\u0259k.<\/p>\n<p>13. Master-da u\u011furlu birle\u015ftirm\u0259d\u0259n sonra v\u0259zif\u0259nin statusu Closed (Jira-mikroservis) olaraq d\u0259yi\u015fdiril\u0259c\u0259k.<\/p>\n<p>Schema tam detall\u0131l\u0131\u011fa iddia etmir (real olaraq daha \u00e7ox add\u0131m var), amma prosesl\u0259rd\u0259 inteqrasiya d\u0259r\u0259c\u0259sini qiym\u0259tl\u0259ndirm\u0259y\u0259 imkan verir. Biz bu scheman\u0131 ideal saym\u0131r\u0131q v\u0259 burax\u0131l\u0131\u015flar v\u0259 yerl\u0259\u015fdirm\u0259l\u0259rin avtomatik m\u00fc\u015fayi\u0259t edilm\u0259 prosesl\u0259rini t\u0259kmill\u0259\u015fdiririk.<\/p>\n<h2>N\u00f6vb\u0259ti n\u0259l\u0259rdir<\/h2>\n<p>\nBizim avtomatla\u015fd\u0131rma inki\u015faf\u0131 \u00fc\u00e7\u00fcn b\u00f6y\u00fck planlar\u0131m\u0131z var, m\u0259s\u0259l\u0259n, monolitin burax\u0131l\u0131\u015flar\u0131nda \u0259l \u0259m\u0259liyyatlar\u0131ndan imtina, avtomatik yerl\u0259\u015fdirm\u0259d\u0259 monitorinqin yax\u015f\u0131la\u015fd\u0131r\u0131lmas\u0131 v\u0259 inki\u015faf etdiricil\u0259rl\u0259 \u0259laq\u0259l\u0259rin g\u00fc\u00e7l\u0259ndirilm\u0259si.<\/p>\n<p>Amma burada dayanar\u0131\u011f. Avtomatla\u015fd\u0131rma il\u0259 ba\u011fl\u0131 \u00e7ox m\u00f6vzular\u0131 \u00fcst s\u0259viyy\u0259d\u0259 \u0259hat\u0259 etdik, b\u0259zil\u0259rini tamamil\u0259 toxunmad\u0131q, buna g\u00f6r\u0259 d\u0259 suallar\u0131n\u0131za m\u0259mnuniyy\u0259tl\u0259 cavab ver\u0259c\u0259yik. \u0130st\u0259diyiniz m\u0259s\u0259l\u0259l\u0259ri daha \u0259trafl\u0131 i\u015f\u0131qland\u0131rmaq \u00fc\u00e7\u00fcn \u015f\u0259rhl\u0259rd\u0259 yaz\u0131n.<br \/>\n<br \/>M\u0259nb\u0259: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/cian\/blog\/486056\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041d\u0430 \u0420\u0418\u0422 2019 \u043d\u0430\u0448 \u043a\u043e\u043b\u043b\u0435\u0433\u0430 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440 \u041a\u043e\u0440\u043e\u0442\u043a\u043e\u0432 \u0441\u0434\u0435\u043b\u0430\u043b \u0434\u043e\u043a\u043b\u0430\u0434 \u043f\u0440\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0430\u0446\u0438\u044e \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0432 \u0426\u0418\u0410\u041d: \u0447\u0442\u043e\u0431\u044b \u0443\u043f\u0440\u043e\u0441\u0442\u0438\u0442\u044c \u0436\u0438\u0437\u043d\u044c \u0438 \u0440\u0430\u0431\u043e\u0442\u0443, \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 Integro. \u041e\u043d\u0430 \u043e\u0442\u0441\u043b\u0435\u0436\u0438\u0432\u0430\u0435\u0442 \u0436\u0438\u0437\u043d\u0435\u043d\u043d\u044b\u0439 \u0446\u0438\u043a\u043b \u0437\u0430\u0434\u0430\u0447, \u0441\u043d\u0438\u043c\u0430\u0435\u0442 \u0441 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u043e\u0432 \u0440\u0443\u0442\u0438\u043d\u043d\u044b\u0435 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u0438 \u0437\u0430\u043c\u0435\u0442\u043d\u043e \u0441\u043e\u043a\u0440\u0430\u0449\u0430\u0435\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0431\u0430\u0433\u043e\u0432 \u0432 production. \u0412 \u044d\u0442\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u043c \u0434\u043e\u043a\u043b\u0430\u0434 \u0410\u043b\u0435\u043a\u0441\u0430\u043d\u0434\u0440\u0430 \u0438 \u0440\u0430\u0441\u0441\u043a\u0430\u0436\u0435\u043c, \u043a\u0430\u043a \u043f\u0440\u043e\u0448\u043b\u0438 \u043f\u0443\u0442\u044c \u043e\u0442 \u043f\u0440\u043e\u0441\u0442\u044b\u0445 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-55870","post","type-post","status-publish","format-standard","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.0.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041d\u0430 \u0420\u0418\u0422 2019.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/az\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.0.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"az_AZ\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435: \u043a\u0430\u043a \u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432 \u0426\u0418\u0410\u041d | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041d\u0430 \u0420\u0418\u0422 2019.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/az\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-01-29T21:00:00+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-02-18T11:04:02+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Skriptd\u0259n \u00f6z platformam\u0131za: nec\u0259 bizim CIAN-da inki\u015faf m\u00fcdd\u0259tini avtomatla\u015fd\u0131rd\u0131q | ProHoster","description":"RIT 2019.","canonical_url":"https:\/\/prohoster.info\/az\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"az_AZ","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041e\u0442 \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043a \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435: \u043a\u0430\u043a \u043c\u044b \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0432 \u0426\u0418\u0410\u041d | ProHoster","og:description":"\u041d\u0430 \u0420\u0418\u0422 2019.","og:url":"https:\/\/prohoster.info\/az\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-01-29T21:00:00+00:00","article:modified_time":"2020-02-18T11:04:02+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"55870","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 19:35:40","updated":"2022-09-30 17:42:13","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/posts\/55870","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/comments?post=55870"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/posts\/55870\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/media?parent=55870"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/categories?post=55870"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/az\/wp-json\/wp\/v2\/tags?post=55870"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}