{"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\/sq\/blog\/administrirovanie\/ot-skriptov-k-sobstvennoj-platforme-kak-my-avtomatizirovali-razrabotku-v-tsian","title":{"rendered":"Nga skriptet n\u00eb platform\u00ebn ton\u00eb: si e automatizuam zhvillimin n\u00eb CIAN","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Nga skriptet n\u00eb platform\u00ebn ton\u00eb: si e automatizuam zhvillimin n\u00eb CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/965f1944c95e2020bec512a05d980a32.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00eb RIT 2019, kolegu yn\u00eb Aleksand\u00ebr Korotkov b\u00ebri <noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=0wvUyjexoIg\">raport<\/a><\/noindex> p\u00ebr automatizimin e zhvillimit n\u00eb CIAN: q\u00eb t\u00eb thjeshtojm\u00eb jet\u00ebn dhe pun\u00ebn, ne p\u00ebrdorim platform\u00ebn ton\u00eb t\u00eb brendshme Integro. Ajo ndjek ciklin jet\u00ebsor t\u00eb detyrave, eliminon operacionet rutin\u00eb nga zhvilluesit dhe zvog\u00eblon ndjesh\u00ebm numrin e defekteve n\u00eb prodhim. N\u00eb k\u00ebt\u00eb postim, ne do t\u00eb plot\u00ebsojm\u00eb referatin e Aleksandrit dhe do t\u00eb tregojm\u00eb si kaluam nga skriptet e thjeshta n\u00eb bashkimin e produkteve open source p\u00ebrmes platform\u00ebs son\u00eb dhe me \u00e7far\u00eb merret nj\u00eb ekip i ve\u00e7ant\u00eb p\u00ebr automatizimin.<br \/>\n\u00a0<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Niveli zero<\/h2>\n<p>\n<i><b>\"Niveli zero nuk ekziston, un\u00eb nuk e di nj\u00eb t\u00eb till\u00eb\"<\/b><br \/>\nM\u00ebsuesi Shifu nga filmi \"Kung Fu Panda\"<\/i><\/p>\n<p>Automatizimi n\u00eb CIAN filloi pas 14 vjet\u00ebsh nga themelimi i kompanis\u00eb. At\u00ebher\u00eb ekipi i zhvillimit kishte 35 njer\u00ebz. E v\u00ebshtir\u00eb p\u00ebr t'u besuar, apo jo? Sigurisht, n\u00eb nj\u00ebfar\u00eb forme automatizimi tashm\u00eb ekzistonte, por nj\u00eb drejtim i ve\u00e7ant\u00eb p\u00ebr integrimin dhe shp\u00ebrndarjen e vazhdueshme t\u00eb kodit filloi t\u00eb formohej pik\u00ebrisht n\u00eb vitin 2015.\u00a0<\/p>\n<p>N\u00eb at\u00eb koh\u00eb ne kishim nj\u00eb monolit t\u00eb madh nga Python, C# dhe PHP, i instaluar n\u00eb serverat Linux\/Windows. P\u00ebr t\u00eb b\u00ebr\u00eb deploy t\u00eb k\u00ebtij monst\u00ebr ne kishim nj\u00eb set skriptesh, q\u00eb i aktivizonim manualisht. Ishte gjithashtu nd\u00ebrtimi i monolitit, q\u00eb sillte dhimbje dhe vuajtje p\u00ebr shkak t\u00eb konflikteve gjat\u00eb bashkimit t\u00eb deg\u00ebve, rregullimit t\u00eb defekteve dhe rin nd\u00ebrtimit \"me nj\u00eb set tjet\u00ebr detyrash n\u00eb nd\u00ebrtim\". Procesi dukej thjesht k\u00ebshtu:<\/p>\n<p><img decoding=\"async\" alt=\"Nga skriptet n\u00eb platform\u00ebn ton\u00eb: si e automatizuam zhvillimin n\u00eb CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/03c4dd97e2ba0073bab1c33f6003a9ec.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKjo nuk na k\u00ebnaqte, dhe ne d\u00ebshironim t\u00eb nd\u00ebrtuonim nj\u00eb proces nd\u00ebrtimi dhe shp\u00ebrndarjeje t\u00eb rip\u00ebrs\u00ebritsh\u00ebm, t\u00eb automatizuar dhe t\u00eb menaxhuar. P\u00ebr k\u00ebt\u00eb na duhej nj\u00eb sistem CI\/CD, dhe ne zgjodh\u00ebm midis versionit falas t\u00eb Teamcity dhe Jenkins t\u00eb lir\u00eb, pasi kishim punuar me to dhe t\u00eb dy na plot\u00ebsonin me t\u00eb nj\u00ebjtat funksionalitete. Zgjodh\u00ebm Teamcity si produkt m\u00eb t\u00eb ri. At\u00ebher\u00eb ne ende nuk kishim p\u00ebrdorur arkitektur\u00ebn mikrosh\u00ebrbimesh dhe nuk prisnim shum\u00eb detyra dhe projekte.<\/p>\n<h2>Arrijm\u00eb te ideja p\u00ebr nj\u00eb sistem t\u00eb brendsh\u00ebm<\/h2>\n<p>\nZgjedhja e Teamcity hoqi vet\u00ebm nj\u00eb pjes\u00eb t\u00eb pun\u00ebs manuale: mbeti ende krijimi i Pull Request-eve, avancimi i detyrave sipas statusit n\u00eb Jira, zgjedhja e detyrave p\u00ebr rrelease. Me k\u00ebt\u00eb, sistemi Teamcity nuk munde m\u00eb t\u00eb p\u00ebrballoj\u00eb. Duhej t\u00eb zgjidheshin rrug\u00ebt e m\u00ebtejshme t\u00eb automatizimit. Ne shqyrtuam mund\u00ebsit\u00eb e pun\u00ebs me skriptet n\u00eb Teamcity ose kalimin n\u00eb sisteme t\u00eb jashtme t\u00eb automatizimit. Por n\u00eb fund, vendos\u00ebm se na duhej fleksibiliteti maksimal, t\u00eb cilin e jep vet\u00ebm nj\u00eb zgjidhje e brendshme. K\u00ebshtu u shfaq versioni i par\u00eb i sistemit t\u00eb brendsh\u00ebm t\u00eb automatizimit t\u00eb quajtur Integro.<\/p>\n<p>Teamcity merret me automatizimin n\u00eb nivelin e fillimit t\u00eb proceseve t\u00eb nd\u00ebrtimit dhe dep_limit, nd\u00ebrsa Integro \u00ebsht\u00eb fokusuar n\u00eb automatizimin e proceseve t\u00eb zhvillimit n\u00eb nivel m\u00eb t\u00eb lart\u00eb. Duhej t\u00eb bashkonte pun\u00ebn me detyrat n\u00eb Jira me p\u00ebrpunimin e kodit burimor t\u00eb lidhur n\u00eb Bitbucket. N\u00eb k\u00ebt\u00eb faz\u00eb, brenda Integro filluan t\u00eb shfaqen workflow t\u00eb veta p\u00ebr t\u00eb punuar me detyra t\u00eb tipave t\u00eb ndrysh\u00ebm.\u00a0<\/p>\n<p>P\u00ebr shkak t\u00eb rritjes s\u00eb automatizimit n\u00eb proceset e biznesit, numri i projekteve dhe run-eve n\u00eb Teamcity u rrit. K\u00ebshtu erdhi nj\u00eb problem i ri: nj\u00eb instanc\u00eb falas e Teamcity nuk mjaftonte (3 agjent\u00eb dhe 100 projekte), ne shtuam nj\u00eb instanc\u00eb tjet\u00ebr (edhe 3 agjent\u00eb dhe 100 projekte), pastaj edhe nj\u00eb tjet\u00ebr. N\u00eb fund mor\u00ebm nj\u00eb sistem prej disa klasteresh, t\u00eb cilin ishte e v\u00ebshtir\u00eb ta menaxhonim:<\/p>\n<p><img decoding=\"async\" alt=\"Nga skriptet n\u00eb platform\u00ebn ton\u00eb: si e automatizuam zhvillimin n\u00eb CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/d95565e01e70e31f6b139dfb9b9caf95.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKur doli n\u00eb pyetje nj\u00eb instanc\u00eb e kat\u00ebrt, ne kuptuam q\u00eb nuk mund t\u00eb jetonim m\u00eb k\u00ebshtu, sepse shpenzimet totale p\u00ebr mb\u00ebshtetje e kat\u00ebr instancave nuk p\u00ebrballoheshin m\u00eb. U hodh n\u00eb diskutim blerja e nj\u00eb Teamcity me pages\u00eb ose zgjedhja e Jenkins-it falas. Ne b\u00ebm\u00eb llogaritjet p\u00ebr instancat dhe planet p\u00ebr automatizimin dhe vendos\u00ebm q\u00eb do t\u00eb jetonim me Jenkins. Pasi kaluam disa jav\u00eb, u kaluam n\u00eb Jenkins dhe u liruar nga nj\u00eb pjes\u00eb e dhimbjes s\u00eb kok\u00ebs lidhur me mb\u00ebshtetjen e disa instancave t\u00eb Teamcity. K\u00ebshtu, arrit\u00ebm t\u00eb p\u00ebrqendrohemi n\u00eb zhvillimin e Integro dhe p\u00ebrshtatjen e Jenkins sipas nevojave tona.<\/p>\n<p>Me rritjen e automatizimit baz\u00eb (n\u00eb form\u00ebn e krijimit automatik t\u00eb Pull Request-eve, grumbullimit dhe publikimit t\u00eb Code coverage dhe kontrollesh t\u00eb tjera) u shfaq nj\u00eb d\u00ebshir\u00eb e fort\u00eb p\u00ebr t\u00eb minimizuar n\u00eb maksimum l\u00ebshimet manuale dhe p\u00ebr t'i dh\u00ebn\u00eb k\u00ebt\u00eb pun\u00eb robot\u00ebve. P\u00ebrve\u00e7 k\u00ebsaj, brenda kompanis\u00eb filloi kalimi n\u00eb mikrosh\u00ebrbime, t\u00eb cilat k\u00ebrkonin l\u00ebshime t\u00eb shpeshta, dhe p\u00ebrve\u00e7 k\u00ebsaj, t\u00eb ndara nga nj\u00ebra-tjetra. K\u00ebshtu ne gradualisht arrit\u00ebm te l\u00ebshimet automatike t\u00eb mikrosh\u00ebrbimeve tona (monoliti e l\u00ebshojm\u00eb akoma manualisht p\u00ebr shkak t\u00eb kompleksitetit t\u00eb procesit). Por, si\u00e7 ndodh zakonisht, lind\u00ebn v\u00ebshtir\u00ebsi t\u00eb reja.\u00a0<\/p>\n<h2>Automatizojm\u00eb testimin<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Nga skriptet n\u00eb platform\u00ebn ton\u00eb: si e automatizuam zhvillimin n\u00eb CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/9518ee0956922c6eb615bdef068ac525.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nP\u00ebr shkak t\u00eb automatizimit t\u00eb l\u00ebshimeve, proceset e zhvillimit u p\u00ebrshpejtuan, pjes\u00ebrisht p\u00ebrmes anashkalimit t\u00eb disa fazave t\u00eb testimit. Dhe kjo \u00e7oi n\u00eb humbje t\u00eb p\u00ebrkohshme t\u00eb cil\u00ebsis\u00eb. Duket banale, por s\u00eb bashku me p\u00ebrshpejtimin e l\u00ebshimeve, duhej t\u00eb ndryshonim edhe metodologjin\u00eb e zhvillimit t\u00eb produktit. Duhej t\u00eb mendonim p\u00ebr automatizimin e testimit, p\u00ebr forcimin e p\u00ebrgjegj\u00ebsis\u00eb personale (k\u00ebtu flasim p\u00ebr 'pranimin e ideve n\u00eb mendje', dhe jo p\u00ebr gjoba financiare) t\u00eb zhvilluesit p\u00ebr kodin e l\u00ebshuar dhe p\u00ebr gabit\u00eb q\u00eb ndodhen n\u00eb t\u00eb, si dhe p\u00ebr nj\u00eb zgjidhje p\u00ebr l\u00ebshimin\/nuk l\u00ebshimin e detyrave p\u00ebrmes automatizimeve t\u00eb deploy.\u00a0<\/p>\n<p>Duke eliminuar problemet me cil\u00ebsin\u00eb, arrit\u00ebm dy vendime t\u00eb r\u00ebnd\u00ebsishme: filluam t\u00eb b\u00ebjm\u00eb testim kanar dhe kemi implementuar monitorim automatik t\u00eb gabimeve me reagim automatike n\u00eb rast se kalon nj\u00eb nivel t\u00eb caktuar. Vendimi i par\u00eb leht\u00ebsoi gjetjen e gabimeve evidente para se kodi t\u00eb arrij\u00eb n\u00eb production, nd\u00ebrsa vendimi i dyt\u00eb zvog\u00ebloi koh\u00ebn e reagimit ndaj problemeve n\u00eb production. Gabimet, natyrisht, ndodhin, por ne shpenzojm\u00eb shumic\u00ebn e koh\u00ebs dhe forc\u00ebs jo p\u00ebr t'i korrigjuar ato, por p\u00ebr t'i minimizuar.\u00a0<\/p>\n<h2>Ekipi i automatizimit<\/h2>\n<p>\nTani kemi nj\u00eb staf prej 130 zhvilluesish, dhe ne vazhdojm\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/article\/469965\/\">t\u00eb rritemi<\/a><\/noindex>. Ekipi p\u00ebr integrimin dhe dor\u00ebzimin e vazhduesh\u00ebm t\u00eb kodit (n\u00eb vazhdim \u2014 ekipi Deploy and Integration ose DI) p\u00ebrb\u00ebhet nga 7 veta dhe punon n\u00eb 2 drejtime: zhvillimin e platform\u00ebs s\u00eb automatizimit Integro dhe DevOps.\u00a0<\/p>\n<p>DevOps \u00ebsht\u00eb p\u00ebrgjegj\u00ebs p\u00ebr ambientet Dev\/Beta t\u00eb faqes CIAN, ambientet Integro, ndihmon zhvilluesit n\u00eb zgjidhjen e problemeve dhe zhvillon qasje t\u00eb reja p\u00ebr shkall\u00ebzimin e ambienteve. Direksioni i zhvillimit t\u00eb Integro merret si me Integro-n vet\u00eb, ashtu edhe me sh\u00ebrbime t\u00eb ngjashme, si p\u00ebr shembull me plugin-et p\u00ebr Jenkins, Jira, Confluence, dhe gjithashtu zhvillon mjete ndihm\u00ebse dhe aplikacione p\u00ebr ekipet e zhvilluesve.\u00a0<\/p>\n<p>Ekipi DI punon s\u00eb bashku me ekipin e Platform\u00ebs, i cili merret me zhvillimin e arkitektur\u00ebs, librarive dhe qasjeve t\u00eb zhvillimit brenda kompanis\u00eb. Bashk\u00eb me k\u00ebt\u00eb, \u00e7do zhvillues brenda CIAN-it mund t\u00eb kontribuoj\u00eb n\u00eb automatizim, p\u00ebr shembull, t\u00eb b\u00ebj\u00eb mikroautomatik min p\u00ebr nevojat e ekipit ose t\u00eb ndaj\u00eb nj\u00eb ide interesante, si t\u00eb b\u00ebj\u00eb automatizimin akoma m\u00eb t\u00eb mir\u00eb.<\/p>\n<h2>Tort\u00eb e shum\u00ebfisht\u00eb e automatizimit n\u00eb CIAN<\/h2>\n<p>\n<img decoding=\"async\" alt=\"Nga skriptet n\u00eb platform\u00ebn ton\u00eb: si e automatizuam zhvillimin n\u00eb CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/22dcd2d0cc283d53bdaac081885657f8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nT\u00eb gjitha sistemet e angazhuara n\u00eb automatizim mund t\u00eb ndahen n\u00eb disa nivele:<\/p>\n<ol>\n<li>Sistemet e jashtme (Jira, Bitbucket etj.). Ekipet e zhvillimit punojn\u00eb me to.\n<\/li>\n<li>Platforma Integro. Zakonisht, zhvilluesit nuk punojn\u00eb drejtp\u00ebrs\u00ebdrejti me t\u00eb, por pik\u00ebrisht ajo mb\u00ebshtet pun\u00ebn e gjith\u00eb automatizimit.\n<\/li>\n<li>Sh\u00ebrbimet e dor\u00ebzimit, orkestrimit dhe zbulimit (p\u00ebr shembull, Jenkins, Consul, Nomad). Me to ne vendosim kodin n\u00eb serverat dhe sigurojm\u00eb funksionimin e sh\u00ebrbimeve me nj\u00ebra-tjetr\u00ebn.\n<\/li>\n<li>Niveli fizik (servera, OS, softuer i ngjash\u00ebm). N\u00eb k\u00ebt\u00eb nivel funksionon kodi yn\u00eb. Kjo mund t\u00eb jet\u00eb nj\u00eb server fizik, ashtu si dhe nj\u00eb virtual (LXC, KVM, Docker).\n<\/li>\n<\/ol>\n<p>\nDuke u bazuar n\u00eb k\u00ebt\u00eb koncept ne ndajm\u00eb zonat e p\u00ebrgjegj\u00ebsive brenda ekipit DI. Dy nivelet e para bien n\u00eb zon\u00ebn e p\u00ebrgjegj\u00ebsis\u00eb s\u00eb drejtimeve t\u00eb zhvillimit t\u00eb Integro, nd\u00ebrsa dy nivelet e fundit jan\u00eb n\u00eb zon\u00ebn e p\u00ebrgjegj\u00ebsis\u00eb t\u00eb DevOps. Kjo ndarje lejon p\u00ebrqendrimin n\u00eb detyra dhe nuk pengon bashk\u00ebpunimin, pasi jemi af\u00ebr nj\u00ebri-tjetrit dhe vazhdimisht shk\u00ebmbejm\u00eb dije dhe p\u00ebrvoj\u00eb.<\/p>\n<h2>Integro<\/h2>\n<p>\nT\u00eb p\u00ebrqendrohemi n\u00eb Integro dhe t\u00eb fillojm\u00eb me tech stack-un:<\/p>\n<ul>\n<li>CentOs 7\n<\/li>\n<li>Docker + Nomad + Consul + Vault\n<\/li>\n<li>Java 11 (monoliti i vjet\u00ebr i Integro do t\u00eb mbetet n\u00eb Java 8)\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>\nNeve\u00e7 t'i p\u00ebrmbahemi parimit t\u00eb zhvillimit mikrosh\u00ebrbimeve, megjith\u00ebse ne kemi nj\u00eb trash\u00ebgimi n\u00eb form\u00ebn e nj\u00eb monoliti nga versioni i hersh\u00ebm i Integro. \u00c7do mikrosh\u00ebrbim funksionon n\u00eb kontejnerin e tij docker, sh\u00ebrbimet komunikojn\u00eb me nj\u00ebra-tjetr\u00ebn p\u00ebrmes k\u00ebrkesave HTTP dhe mesazheve RabbitMQ. Mikrosh\u00ebrbimet nj\u00ebsoj e gjejn\u00eb nj\u00ebra-tjetr\u00ebn p\u00ebrmes Consul dhe iu d\u00ebrgojn\u00eb atij k\u00ebrkesa, duke kaluar autorizimin p\u00ebrmes SSO (Keycloak, OAuth 2\/OpenID Connect).<\/p>\n<p><img decoding=\"async\" alt=\"Nga skriptet n\u00eb platform\u00ebn ton\u00eb: si e automatizuam zhvillimin n\u00eb CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/e7630c0bd62a40f397de1bf1c1097926.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nSi nj\u00eb shembull real, le t\u00eb shqyrtojm\u00eb nd\u00ebrveprimin me Jenkins, i cili p\u00ebrb\u00ebhet nga hapat e m\u00ebposht\u00ebm:<\/p>\n<ol>\n<li>Mikrosh\u00ebrbimi i menaxhimit t\u00eb pun\u00ebve (tani mikrosh\u00ebrbimi Flow) d\u00ebshiron t\u00eb nis\u00eb nj\u00eb nd\u00ebrtim n\u00eb Jenkins. P\u00ebr k\u00ebt\u00eb, ai e gjen IP:PORT e mikrosh\u00ebrbimit t\u00eb integrimit me Jenkins (tani mikrosh\u00ebrbimi Jenkins) p\u00ebrmes Consul dhe i d\u00ebrgon nj\u00eb k\u00ebrkes\u00eb asinkrone p\u00ebr t\u00eb filluar nd\u00ebrtimin n\u00eb Jenkins.\n<\/li>\n<li>Mikrosh\u00ebrbimi Jenkins, pas marrjes s\u00eb k\u00ebrkes\u00ebs, formon dhe kthen n\u00eb p\u00ebrgjigje nj\u00eb ID pune, me t\u00eb cil\u00ebn m\u00eb von\u00eb do t\u00eb mund t\u00eb identifikohet rezultati i pun\u00ebs. P\u00ebrve\u00e7 k\u00ebsaj, ai nis nd\u00ebrtimin n\u00eb Jenkins p\u00ebrmes thirrjes s\u00eb REST API.\n<\/li>\n<li>Jenkins realizon nd\u00ebrtimin dhe pas p\u00ebrfundimit t\u00eb tij d\u00ebrgon nj\u00eb webhook me rezultatet e ekzekutimit n\u00eb mikrosh\u00ebrbimin Jenkins.\n<\/li>\n<li>Mikroservisi Jenkins, pasi merr webhook, formon nj\u00eb mesazh p\u00ebrfundimtar t\u00eb p\u00ebrpunimit t\u00eb k\u00ebrkes\u00ebs dhe e lidh me rezultatet e ekzekutimit. Mesazhi i formuar d\u00ebrgohet n\u00eb radh\u00ebn RabbitMQ.\n<\/li>\n<li>P\u00ebrmes RabbitMQ, mesazhi i publikuar arrin n\u00eb mikroservisin Flow, i cili merr informacion mbi rezultatet e p\u00ebrpunimit t\u00eb detyr\u00ebs s\u00eb tij duke p\u00ebrputhur ID-n\u00eb e Pun\u00ebs nga k\u00ebrkesa me mesazhin e marr\u00eb.\n<\/li>\n<\/ol>\n<p>\nAktualisht, kemi rreth 30 mikroservisar\u00eb, t\u00eb cil\u00ebt mund t\u00eb ndahen n\u00eb disa grupe:<\/p>\n<ol>\n<li>Menaxhimi i konfigurimeve.\n<\/li>\n<li>Informimi dhe nd\u00ebrveprimi me p\u00ebrdoruesit (mesazher\u00ebt, posta).\n<\/li>\n<li>Puna me kodin burimor.\n<\/li>\n<li>Integrimi me mjetet e shp\u00ebrndarjes (jenkins, nomad, consul, etj.).\n<\/li>\n<li>Monitorimi (l\u00ebshimeve, gabimeve, etj.).\n<\/li>\n<li>Web-utilitar\u00ebt (UI p\u00ebr menaxhimin e ambient\u00ebve t\u00eb testimit, mbledhjen e statistikave, etj.).\n<\/li>\n<li>Integrimi me sistemet e gjurmimit t\u00eb detyrave dhe sisteme t\u00eb ngjashme.\n<\/li>\n<li>Menaxhimi i flukseve t\u00eb pun\u00ebs p\u00ebr detyra t\u00eb ndryshme.\n<\/li>\n<\/ol>\n<p><\/p>\n<h2>Fluksi i pun\u00ebs i detyr\u00ebs<\/h2>\n<p>\nIntegro automatizon veprimet q\u00eb lidhen me ciklin jet\u00ebsor t\u00eb detyr\u00ebs. N\u00eb m\u00ebnyr\u00eb t\u00eb thjesht\u00eb, n\u00ebn ciklin jet\u00ebsor t\u00eb detyr\u00ebs kuptojm\u00eb fluksin e pun\u00ebs t\u00eb detyr\u00ebs n\u00eb Jira. N\u00eb proceset tona t\u00eb zhvillimit, kemi disa variacione t\u00eb flukseve t\u00eb pun\u00ebs n\u00eb var\u00ebsi t\u00eb projektit, llojit t\u00eb detyr\u00ebs dhe opsioneve t\u00eb zgjedhura p\u00ebr detyr\u00ebn p\u00ebrkat\u00ebse.\u00a0<\/p>\n<p>Le t\u00eb shqyrtojm\u00eb fluksin e pun\u00ebs q\u00eb p\u00ebrdorim m\u00eb shpesh:<\/p>\n<p><img decoding=\"async\" alt=\"Nga skriptet n\u00eb platform\u00ebn ton\u00eb: si e automatizuam zhvillimin n\u00eb CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/62555be6bab024dd30f3cf70d4fe3cba.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00eb skem\u00eb, ingranazhi tregon se kalimi ndodhi automatikisht nga Integro, nd\u00ebrsa figura e njeriut tregon se kalimi u aktivizua manualisht nga nj\u00eb person. Le t\u00eb shqyrtojm\u00eb disa rrug\u00eb, p\u00ebrmes t\u00eb cilave nj\u00eb detyr\u00eb mund t\u00eb kaloj\u00eb n\u00eb k\u00ebt\u00eb fluks pune.<\/p>\n<p>Testim plot\u00ebsisht manual n\u00eb DEV+BETA pa teste kanaribe (zakonisht k\u00ebshtu e l\u00ebshojm\u00eb monolitin):<\/p>\n<p><img decoding=\"async\" alt=\"Nga skriptet n\u00eb platform\u00ebn ton\u00eb: si e automatizuam zhvillimin n\u00eb CIAN\" src=\"\/wp-content\/uploads\/2020\/01\/775528862e14817dff5f69db6de654dd.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nMund t\u00eb ket\u00eb edhe kombinime t\u00eb tjera t\u00eb kalimeve. Ndonj\u00ebher\u00eb, rruga q\u00eb do t\u00eb ndjek\u00eb detyra mund t\u00eb zgjidhet p\u00ebrmes opsioneve n\u00eb Jira.<\/p>\n<h2>L\u00ebvizja e detyr\u00ebs<\/h2>\n<p>\nT\u00eb shqyrtojm\u00eb hapat kryesor\u00eb q\u00eb ndiqen gjat\u00eb l\u00ebvizjes s\u00eb detyr\u00ebs n\u00eb fluksin e pun\u00ebs \"Testimi n\u00eb DEV + testet kanaribe\":<\/p>\n<p>1. Zhvilluesi ose PM krijon nj\u00eb detyr\u00eb.<\/p>\n<p>2. Zhvilluesi e merr n\u00eb pun\u00eb detyr\u00ebn. Pas p\u00ebrfundimit, e kalon at\u00eb n\u00eb statusin IN REVIEW.<\/p>\n<p>3. Jira d\u00ebrgon nj\u00eb Webhook drejt mikroservisit Jira (i cili p\u00ebrgjigjet p\u00ebr integrimin me Jira).<\/p>\n<p>4. Mikroservisi Jira d\u00ebrgon nj\u00eb k\u00ebrkes\u00eb n\u00eb sh\u00ebrbimin Flow (i cili \u00ebsht\u00eb p\u00ebrgjegj\u00ebs p\u00ebr flukset e brendshme t\u00eb pun\u00ebs, ku b\u00ebhet puna) p\u00ebr t\u00eb nisur fluksin e pun\u00ebs.<\/p>\n<p>5. Brenda sh\u00ebrbimit Flow:<\/p>\n<ul>\n<li>Caktohen rishikuesit p\u00ebr detyr\u00ebn (mikroservisi Users, i cili di gjith\u00e7ka p\u00ebr p\u00ebrdoruesit + mikroservisi Jira).<\/li>\n<li>P\u00ebrmes mikroservisit Source (i cili di p\u00ebr depozit\u00eb dhe deg\u00eb, por nuk punon me kodin vet\u00eb), b\u00ebhet k\u00ebrkimi i depozitave n\u00eb t\u00eb cilat ndodhet dega e detyr\u00ebs son\u00eb (p\u00ebr t\u00eb thjeshtuar k\u00ebrkimin, emri i deg\u00ebs p\u00ebrputhet me numrin e detyr\u00ebs n\u00eb Jira). Shpesh, detyra ka vet\u00ebm nj\u00eb deg\u00eb n\u00eb nj\u00eb depo t\u00eb vetme, duke e thjeshtuar menaxhimin e radh\u00ebs p\u00ebr shp\u00ebrndarje dhe duke reduktuar lidhshm\u00ebrin\u00eb midis depozitave.<\/li>\n<li>P\u00ebr \u00e7do deg\u00eb t\u00eb gjetur, ndiqet kjo radh\u00eb veprimesh:\n<p> i) Bashkimi i deg\u00ebs master (mikroservisi Git p\u00ebr pun\u00ebn me kodin).<br \/>\n ii) Dega bllokohet nga ndryshimet nga zhvilluesi (mikroservisi Bitbucket).<br \/>\n iii) Krijohet nj\u00eb Pull Request n\u00eb k\u00ebt\u00eb deg\u00eb (mikroservisi Bitbucket).<br \/>\n iv) D\u00ebrgohet nj\u00eb mesazh p\u00ebr Pull Requestin e ri n\u00eb bisedat e zhvilluesve (mikroservisi Notify p\u00ebr pun\u00ebn me njoftimet).<br \/>\n v) Nisin nd\u00ebrtimin, testimin dhe shp\u00ebrndarjen e detyr\u00ebs n\u00eb DEV (mikroservisi Jenkins p\u00ebr pun\u00ebn me Jenkins).<br \/>\n vi) N\u00ebse t\u00eb gjith\u00eb hapat e m\u00ebparsh\u00ebm p\u00ebrfundojn\u00eb me sukses, Integro vendos miratimin e tij n\u00eb Pull Request (mikroservisi Bitbucket).<\/li>\n<li>Integro pret miratimin n\u00eb Pull Request nga rishikuesit e caktuar.<\/li>\n<li>Sapohar\u00eb t\u00eb gjitha miratimet e nevojshme (p\u00ebrfshir\u00eb testet automatizuar q\u00eb jan\u00eb kaluar pozitivisht), Integro e kalon detyr\u00ebn n\u00eb statusin Test on Dev (mikroservisi Jira).<\/li>\n<\/ul>\n<p>\n6. Testuesit kryejn\u00eb testimin e detyr\u00ebs. N\u00ebse nuk ka probleme, ata e kalojn\u00eb detyr\u00ebn n\u00eb statusin Ready For Build.<\/p>\n<p>7. Integro \"sheh\" q\u00eb detyra \u00ebsht\u00eb gati p\u00ebr l\u00ebshim dhe e nis shp\u00ebrndarjen n\u00eb m\u00ebnyr\u00eb kanaribe (mikroservisi Jenkins). Gatishm\u00ebria p\u00ebr l\u00ebshim p\u00ebrcaktohet nga nj\u00eb grup rregullash. P\u00ebr shembull, detyra \u00ebsht\u00eb n\u00eb statusin e duhur, nuk ka bllokime p\u00ebr detyra t\u00eb tjera, aktualisht nuk ka shp\u00ebrndarje aktive t\u00eb k\u00ebtij mikroservisi, etj.<\/p>\n<p>8. Detyra kalon n\u00eb statusin Canary (mikroservisi Jira).<\/p>\n<p>9. Jenkins nis shp\u00ebrndarjen e detyr\u00ebs n\u00eb m\u00ebnyr\u00eb kanaribe p\u00ebrmes Nomad (zakonisht 1-3 instanca) dhe njofton sh\u00ebrbimin e monitorimit t\u00eb l\u00ebshimeve (mikroservisi DeployWatch).<\/p>\n<p>10. DeployWatch-mikroservisi mbledh sfondin e gabimeve dhe reagon n\u00ebse \u00ebsht\u00eb e nevojshme. Kur sfondi i gabimeve tejkalohet (norma e sfondit llogaritet automatikisht), zhvilluesit njoftohen p\u00ebrmes mikroservisit Notify. N\u00ebse pas 5 minutash zhvilluesi nuk reagon (n\u00eb nj\u00ebsi Revert ose Stay), fillon rikthimi automatik i instancave kanaric. N\u00ebse sfondi nuk \u00ebsht\u00eb tejkaluar, zhvilluesi duhet t\u00eb niset manualisht procesin e deploy-t n\u00eb Production (duke klikuar butonin n\u00eb UI). N\u00ebse brenda 60 minutash zhvilluesi nuk ka nisur deploy n\u00eb Production, instancat kanaric do t\u00eb rikthehen gjithashtu p\u00ebr q\u00ebllime sigurie.<\/p>\n<p>11. Pas nisjes s\u00eb deploy-t n\u00eb Production:<\/p>\n<ul>\n<li>Detyra kalon n\u00eb statusin Production (mikroservisi Jira).<\/li>\n<li>Mikroservisi Jenkins nis procesin e deploy-t dhe njofton p\u00ebr hedhjen mikroservisin DeployWatch.<\/li>\n<li>Mikroservisi DeployWatch kontrollon q\u00eb t\u00eb gjitha kontejner\u00ebt n\u00eb Production jan\u00eb p\u00ebrdit\u00ebsuar (ka pasur raste kur nuk \u00ebsht\u00eb p\u00ebrdit\u00ebsuar gjith\u00e7ka).<\/li>\n<li>P\u00ebrmes mikroservisit Notify d\u00ebrgohet nj\u00eb njoftim mbi rezultatet e deploy-t n\u00eb Production.<\/li>\n<\/ul>\n<p>\n12. Zhvilluesit do t\u00eb ken\u00eb 30 minuta p\u00ebr t\u00eb nisur rikthimin e detyr\u00ebs nga Production n\u00eb rast se shfaqet nj\u00eb sjellje e gabuar e mikroservisit. Pas k\u00ebtij afati, detyra do t\u00eb p\u00ebrfshihet automatikisht n\u00eb master (mikroservisi Git).<\/p>\n<p>13. Pas nj\u00eb bashk\u00ebngjitjeje t\u00eb suksesshme n\u00eb master, statusi i detyr\u00ebs do t\u00eb ndryshohet n\u00eb Closed (mikroservisi Jira).<\/p>\n<p>Skema nuk pretendon t\u00eb jet\u00eb komplekse (n\u00eb realitet ka m\u00eb shum\u00eb hapa), por lejon t\u00eb vler\u00ebsohet shkalla e integrimit n\u00eb proceset. Ne nuk e mendojm\u00eb k\u00ebt\u00eb skem\u00eb perfekte dhe p\u00ebrmir\u00ebsojm\u00eb proceset e mb\u00ebshtetjes automatike t\u00eb ril\u00ebsave dhe deploy-t.<\/p>\n<h2>\u00c7far\u00eb ndodh m\u00eb pas<\/h2>\n<p>\nKemi plane t\u00eb m\u00ebdha p\u00ebr zhvillimin e automatizimit, p\u00ebr shembull, heqja e operacioneve manuale gjat\u00eb ril\u00ebsave t\u00eb monolit, p\u00ebrmir\u00ebsimin e monitorimit gjat\u00eb deploy-t automatike, p\u00ebrmir\u00ebsimin e bashk\u00ebpunimit me zhvilluesit.<\/p>\n<p>Por p\u00ebr momentin do t\u00eb ndalemi k\u00ebtu. Shum\u00eb tema n\u00eb p\u00ebrmbledhjen e automatizimit i kemi trajtuar sip\u00ebrfaq\u00ebsisht, disa nuk i kemi prekur fare, prandaj jemi t\u00eb gatsh\u00ebm t\u00eb p\u00ebrgjigjemi n\u00eb pyetje. Presim propozime p\u00ebr \u00e7far\u00eb duhet t\u00eb shqyrtojm\u00eb n\u00eb detaje, shkruani n\u00eb komente.<br \/>\n<br \/>Burimi: <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\/sq\/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=\"sq_AL\" \/>\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\/sq\/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\udd47Nga skriptet n\u00eb platform\u00ebn ton\u00eb: si e automatizuam zhvillimin n\u00eb CIAN | ProHoster","description":"N\u00eb RIT 2019.","canonical_url":"https:\/\/prohoster.info\/sq\/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":"sq_AL","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\/sq\/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\/sq\/wp-json\/wp\/v2\/posts\/55870","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/comments?post=55870"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/55870\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=55870"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=55870"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=55870"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}