{"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\">referatin<\/a><\/noindex> p\u00ebr automatizimin e zhvillimit n\u00eb CIAN: p\u00ebr t\u00eb thjeshtuar jet\u00ebn dhe pun\u00ebn, ne p\u00ebrdorim platform\u00ebn ton\u00eb t\u00eb brendshme Integro. Ajo ndjek ciklin e jet\u00ebs s\u00eb detyrave, heq nga zhvilluesit operacionet rutin\u00eb dhe zvog\u00eblon ndjesh\u00ebm numrin e gabimeve n\u00eb prodhim. N\u00eb k\u00ebt\u00eb post, do t\u00eb plot\u00ebsojm\u00eb leksionin e Aleksandrit dhe do t\u00eb tregojm\u00eb se si e kaluam rrug\u00ebn nga skenar\u00ebt e thjesht\u00eb n\u00eb integrimin e produkteve open source p\u00ebrmes platform\u00ebs son\u00eb dhe se me \u00e7far\u00eb merret nj\u00eb ekip i ve\u00e7ant\u00eb automatizimi.<br \/>\n\u00a0<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h2>Niveli zero<\/h2>\n<p>\n<i><b>\u00abNiveli zero nuk ekziston, nuk e di nj\u00eb t\u00eb till\u00eb\u00bb<\/b><br \/>\nMjeshtri Shifu nga filmi \u00abKung Fu Panda\u00bb<\/i><\/p>\n<p>Automatizimi n\u00eb CIAN filloi 14 vjet pas themelimit t\u00eb kompanis\u00eb. At\u00ebher\u00eb ekipi i zhvillimit kishte 35 njer\u00ebz. V\u00ebshtir\u00eb t\u00eb besohej, apo jo? Sigurisht, n\u00eb nj\u00eb form\u00eb, automatizimi ekzistonte, por nj\u00eb drejtim i ve\u00e7ant\u00eb p\u00ebr integrimin e vazhduesh\u00ebm dhe shp\u00ebrndarjen e 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, t\u00eb instaluar n\u00eb server\u00eb Linux\/Windows. P\u00ebr depozimin e k\u00ebtij monstruoze, ne kishim nj\u00eb grup skenar\u00ebsh q\u00eb i ekzekutonim manualisht. Ishte gjithashtu nj\u00eb nd\u00ebrtim i monolitit, q\u00eb sillte dhimbje dhe vuajtje p\u00ebr shkak t\u00eb konflikteve t\u00eb bashkimeve t\u00eb deg\u00ebve, rregullimeve t\u00eb defekteve dhe ri-nd\u00ebrtimit \"me nj\u00eb grup tjet\u00ebr detyrash n\u00eb nd\u00ebrtim\". Thjesht, procesi dukej 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 donim t\u00eb nd\u00ebrtonim nj\u00eb proces t\u00eb nd\u00ebrtimit dhe shp\u00ebrndarjes t\u00eb p\u00ebrs\u00ebritur, 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 i lir\u00eb, pasi kishim punuar me t\u00eb dhe t\u00eb dy na k\u00ebnaqin me grupin e funksioneve. Zgjodh\u00ebm Teamcity si nj\u00eb produkt m\u00eb t\u00eb ri. N\u00eb at\u00eb koh\u00eb, ne nuk po p\u00ebrdornim arkitektur\u00eb mikros\u00ebrvish dhe nuk prisnim nj\u00eb num\u00ebr t\u00eb madh detyrash dhe projektesh.<\/p>\n<h2>Arrijm\u00eb n\u00eb iden\u00eb p\u00ebr nj\u00eb sistem t\u00eb brendsh\u00ebm<\/h2>\n<p>\nP\u00ebrvoja e zbatimit t\u00eb Teamcity reduktoi vet\u00ebm nj\u00eb pjes\u00eb t\u00eb pun\u00ebs manuale: mbeti ende krijimi i Pull Request-eve, avancimi i detyrave n\u00eb statuset n\u00eb Jira, dhe p\u00ebrzgjedhja e detyrave p\u00ebr l\u00ebshim. S\u00eb bashku, sistemi Teamcity nuk mund ta menaxhonte k\u00ebt\u00eb. Duhej t\u00eb zgjidhnim rrug\u00ebn p\u00ebr automatik\u00ebn e m\u00ebtejshme. Ne shqyrtuam mund\u00ebsit\u00eb e pun\u00ebs me skriptet n\u00eb Teamcity ose kalimin n\u00eb sisteme t\u00eb jashtme automatizimi. Por n\u00eb fund vendos\u00ebm se na nevojitej maksimalja fleksibilitetit q\u00eb ofron vet\u00ebm nj\u00eb zgjidhje e brendshme. K\u00ebshtu lindi 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 nisjes s\u00eb proceseve t\u00eb nd\u00ebrtimit dhe shp\u00ebrndarrjes, 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 bashkoheshin pun\u00ebt 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-e t\u00eb veta p\u00ebr t\u00eb punuar me detyra t\u00eb llojeve t\u00eb ndryshme.\u00a0<\/p>\n<p>P\u00ebr shkak t\u00eb rritjes s\u00eb automatizmit n\u00eb proceset e biznesit, u rrit numri i projekteve dhe run-eve n\u00eb Teamcity. K\u00ebshtu erdhi nj\u00eb problem i ri: nj\u00eb instanc\u00eb falas e Teamcity nuk ishte e mjaftueshme (3 agjent\u00eb dhe 100 projekte), shtuam nj\u00eb instanc\u00eb tjet\u00ebr (3 agjent\u00eb dhe 100 projekte) dhe pastaj edhe nj\u00eb tjet\u00ebr. N\u00eb p\u00ebrfundim, mor\u00ebm nj\u00eb sistem me disa klaster\u00eb q\u00eb ishte i v\u00ebshtir\u00eb p\u00ebr t'u menaxhuar:<\/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 u shfaq pyetja p\u00ebr nj\u00eb instanc\u00eb t\u00eb kat\u00ebrt, ne kuptuam se nuk mund t\u00eb vazhdojm\u00eb m\u00eb k\u00ebshtu, pasi kostot e mb\u00ebshtetjes p\u00ebr 4 instanca tashm\u00eb ishin jasht\u00eb \u00e7do kufiri. Lind\u00ebn pyetja p\u00ebr blerjen e Teamcity t\u00eb paguar ose zgjedhja e Jenkins falas. Ne b\u00ebm\u00eb llogaritjet mbi instancat dhe planet p\u00ebr automatizimin dhe vendos\u00ebm se do t\u00eb jetonim me Jenkins. Pas disa jav\u00ebsh, u kaluam n\u00eb Jenkins dhe iu shmang\u00ebm nj\u00eb pjese t\u00eb dhimbjeve t\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 p\u00ebr ne.<\/p>\n<p>Me rritja e automatizimit baz\u00eb (si\u00e7 \u00ebsht\u00eb krijimi automatik i Pull Request-eve, mbledhja dhe publikimi i Code coverage dhe kontrollimeve t\u00eb tjera) ka sjell\u00eb d\u00ebshir\u00ebn e fort\u00eb p\u00ebr t'u hequr dor\u00eb maksimalisht nga l\u00ebshimet manuale dhe p\u00ebr t'i l\u00ebn\u00eb k\u00ebto pun\u00eb roboteve. P\u00ebrve\u00e7 k\u00ebsaj, brenda kompanis\u00eb ka filluar nj\u00eb trasladim n\u00eb mikrosh\u00ebrbime, t\u00eb cilat k\u00ebrkonin l\u00ebshime t\u00eb shpeshta, madje dhe ndaras nga nj\u00ebra-tjetra. K\u00ebshtu, ne gradualisht arrit\u00ebm n\u00eb l\u00ebshimet automatike t\u00eb mikrosh\u00ebrbimeve tona (monoliti ende e l\u00ebshojm\u00eb manualisht p\u00ebr shkak t\u00eb kompleksitetit t\u00eb procesit). Por, si\u00e7 ndodh zakonisht, u shfaq nj\u00eb v\u00ebshtir\u00ebsi e re.\u00a0<\/p>\n<h2>Po 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\u00ebr shkak t\u00eb anashkalimit t\u00eb disa fazave t\u00eb testimit. Kjo \u00e7oi n\u00eb nj\u00eb humbje t\u00eb p\u00ebrkohshme t\u00eb cil\u00ebsis\u00eb. Duket banal, 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 ndjenj\u00ebn e p\u00ebrgjegj\u00ebsis\u00eb personale (k\u00ebtu flitet p\u00ebr \"pranimin e ideve n\u00eb mendje\", jo p\u00ebr d\u00ebnime financiare) t\u00eb zhvilluesve p\u00ebr kodin q\u00eb l\u00ebshojn\u00eb dhe gabimet n\u00eb t\u00eb, si dhe p\u00ebr nj\u00eb zgjidhje p\u00ebr l\u00ebshimin\/n\u00eb l\u00ebshimin e detyrave n\u00ebp\u00ebrmjet deploy-it automatik.\u00a0<\/p>\n<p>Duke eliminuar problemet me cil\u00ebsin\u00eb, arrit\u00ebm n\u00eb dy vendime t\u00eb r\u00ebnd\u00ebsishme: filluam t\u00eb kryejm\u00eb testime kanari dhe implementuam monitorim automatik t\u00eb sfondit p\u00ebr gabimet me reagim automatik n\u00ebse ato tejkalonin nj\u00eb nivel t\u00eb caktuar. Vendimi i par\u00eb na lejoji t\u00eb gjejm\u00eb gabimet evidente para se kodi t\u00eb arrinte n\u00eb production, vendimi i dyt\u00eb reduktoi koh\u00ebn e reagimit ndaj problemeve n\u00eb production. Gabimet, sigurisht, ndodhin, por ne shpenzojm\u00eb m\u00eb shum\u00eb koh\u00eb dhe energji p\u00ebr minimizimin e tyre sesa p\u00ebr korrigjimin e tyre.\u00a0<\/p>\n<h2>Ekipi i automatizimit<\/h2>\n<p>\nTani kemi nj\u00eb staf prej 130 zhvilluesish, dhe 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 (m\u00eb pas \u2014 ekipi Deploy and Integration ose DI) p\u00ebrb\u00ebhet nga 7 persona dhe punon n\u00eb 2 drejtime: zhvillimi i platform\u00ebs s\u00eb automatizimit Integro dhe DevOps.\u00a0<\/p>\n<p>DevOps \u00ebsht\u00eb p\u00ebrgjegj\u00ebs p\u00ebr mjediset Dev\/Beta t\u00eb faqes CIAN, mjediset Integro, ndihmon zhvilluesit n\u00eb zgjidhjen e problemeve dhe zhvillon qasje t\u00eb reja p\u00ebr zgjerimin e mjediseve. Drejtimi i zhvillimit Integro merret si me vet\u00eb Integro, ashtu edhe me sh\u00ebrbime t\u00eb lidhura, si\u00e7 jan\u00eb shtesat 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 ngusht\u00eb me ekipin e Platform\u00ebs, i cili merret me zhvillimin e arkitektur\u00ebs, biblioteka dhe qasjes p\u00ebr zhvillim brenda kompanis\u00eb. P\u00ebrve\u00e7 k\u00ebsaj, \u00e7do zhvillues brenda CIAN mund t\u00eb kontribuoj\u00eb n\u00eb automatizim, p\u00ebr shembull, t\u00eb b\u00ebj\u00eb mikro-automatizim sipas nevojave t\u00eb ekipit ose t\u00eb ndaj\u00eb nj\u00eb ide t\u00eb shk\u00eblqyer p\u00ebr t\u00eb p\u00ebrmir\u00ebsuar automatizimin.<\/p>\n<h2>Shtresa 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 shtresa:<\/p>\n<ol>\n<li>Sistemet e jashtme (Jira, Bitbucket dhe t\u00eb tjera). Ekipet e zhvillimit punojn\u00eb me to.\n<\/li>\n<li>Platforma Integro. Zhvilluesit zakonisht nuk punojn\u00eb direkt me t\u00eb, por ajo mb\u00ebshtet funksionimin e gjith\u00eb automatizimit.\n<\/li>\n<li>Sh\u00ebrbimet e dor\u00ebzimit, orkestrimit dhe zbulimit (p.sh., Jenkins, Consul, Nomad). Me ndihm\u00ebn e tyre ne zhvillojm\u00eb kodin n\u00eb servera dhe sigurojm\u00eb funksionimin e sh\u00ebrbimeve me nj\u00ebri-tjetrin.\n<\/li>\n<li>Niveli fizik (serverat, OS, softueri p\u00ebrkat\u00ebs). N\u00eb k\u00ebt\u00eb nivel funksionon kodi yn\u00eb. Kjo mund t\u00eb jet\u00eb si nj\u00eb server fizik, ashtu edhe 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\u00ebsis\u00eb brenda ekipit DI. Dy nivelet e para bien n\u00eb p\u00ebrgjegj\u00ebsin\u00eb e drejtimit t\u00eb zhvillimit Integro, nd\u00ebrsa dy nivelet e fundit bie n\u00eb p\u00ebrgjegj\u00ebsin\u00eb e DevOps. Ky ndarje lejon fokusimin n\u00eb detyra dhe nuk pengon bashk\u00ebpunimin, pasi ne jemi af\u00ebr nj\u00ebri-tjetrit dhe vazhdimisht shk\u00ebmbejm\u00eb njohuri dhe p\u00ebrvoj\u00eb.<\/p>\n<h2>Integro<\/h2>\n<p>\nLe t\u00eb fokusojm\u00eb n\u00eb Integro dhe t\u00eb fillojm\u00eb me stakun teknologjik:<\/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 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 (embeddedd)\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>\nNe mbajm\u00eb parimin e zhvillimit mikrosh\u00ebrbimeve, megjith\u00ebse kemi edhe dep\u00ebrtime t\u00eb vjetra n\u00eb form\u00ebn e monolitit t\u00eb versionit t\u00eb hersh\u00ebm t\u00eb Integro. \u00c7do mikrosh\u00ebrbim operon n\u00eb nj\u00eb kontenier docker t\u00eb tij, sh\u00ebrbimet komunikojn\u00eb me nj\u00ebra-tjetr\u00ebn p\u00ebrmes k\u00ebrkesave HTTP dhe mesazheve RabbitMQ. Mikrosh\u00ebrbimet gjejn\u00eb nj\u00ebra-tjetr\u00ebn p\u00ebrmes Consul dhe kryejn\u00eb nj\u00eb k\u00ebrkes\u00eb p\u00ebr t\u00eb, duke kaluar autorizimin n\u00ebp\u00ebrmjet 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 workflow (m\u00eb tej mikrosh\u00ebrbimi Flow) d\u00ebshiron t\u00eb nis\u00eb nj\u00eb nd\u00ebrtim n\u00eb Jenkins. P\u00ebr k\u00ebt\u00eb, ai p\u00ebrmes Consul gjen IP:PORT-in e mikrosh\u00ebrbimit t\u00eb integrimit me Jenkins (m\u00eb tej mikrosh\u00ebrbimi Jenkins) dhe i d\u00ebrgon atij nj\u00eb k\u00ebrkes\u00eb asinkrone p\u00ebr t\u00eb nisur nd\u00ebrtimin n\u00eb Jenkins.\n<\/li>\n<li>Mikrosh\u00ebrbimi Jenkins, pasi merr k\u00ebrkes\u00ebn, \u0444\u043e\u0440\u043con dhe kthen n\u00eb p\u00ebrgjigje Job ID, me t\u00eb cilin m\u00eb von\u00eb do t\u00eb mund t\u00eb identifikohet rezultati i pun\u00ebs. Bashk\u00eb me k\u00ebt\u00eb, ai nis nd\u00ebrtimin n\u00eb Jenkins p\u00ebrmes nj\u00eb thirrjeje t\u00eb REST API.\n<\/li>\n<li>Jenkins ekzekuton 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>Mikrosh\u00ebrbimi Jenkins, pasi merr webhook, formon nj\u00eb mesazh p\u00ebr p\u00ebrfundimin e p\u00ebrpunimit t\u00eb k\u00ebrkes\u00ebs dhe e ngjit tek ai rezultatet e ekzekutimit. Mesazhi i formuar d\u00ebrgohet n\u00eb radh\u00ebn RabbitMQ.\n<\/li>\n<li>P\u00ebrmes RabbitMQ, mesazhi i publikuar arrin te mikrosh\u00ebrbimi Flow, i cili merr informacion mbi rezultatin e p\u00ebrpunimit t\u00eb detyr\u00ebs s\u00eb tij, duke krahasuar Job ID nga k\u00ebrkesa dhe mesazhi i marr\u00eb.\n<\/li>\n<\/ol>\n<p>\nAktualisht kemi rreth 30 mikrosh\u00ebrbime, t\u00eb cilat 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\u00eb, email).\n<\/li>\n<li>Puna me kodin burimor.\n<\/li>\n<li>Integrimi me mjetet e p\u00ebrhapjes (jenkins, nomad, consul, etj.).\n<\/li>\n<li>Monitorimi (l\u00ebshimeve, gabimeve, etj.).\n<\/li>\n<li>Veglat web (UI p\u00ebr menaxhimin e mjediseve testuese, mbledhjen e statistikave, etj.).\n<\/li>\n<li>Integrimi me sistemet e menaxhimit t\u00eb detyrave dhe sisteme t\u00eb ngjashme.\n<\/li>\n<li>Menaxhimi i workflow p\u00ebr detyra t\u00eb ndryshme.\n<\/li>\n<\/ol>\n<p><\/p>\n<h2>Workflow i detyr\u00ebs<\/h2>\n<p>\nIntegro automatizon veprimet q\u00eb lidhen me ciklin jet\u00ebsor t\u00eb nj\u00eb detyre. N\u00eb m\u00ebnyr\u00eb t\u00eb thjesht\u00eb, n\u00ebn ciklin jet\u00ebsor t\u00eb detyr\u00ebs do t\u00eb kuptojm\u00eb workflow-in e detyr\u00ebs n\u00eb Jira. N\u00eb proceset tona t\u00eb zhvillimit ka disa variante workflow n\u00eb var\u00ebsi t\u00eb projektit, llojit t\u00eb detyr\u00ebs dhe opsioneve t\u00eb zgjedhura n\u00eb detyr\u00ebn specifike.\u00a0<\/p>\n<p>Le t\u00eb shqyrtojm\u00eb workflow-in 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 diagram, ingranazhi tregon se kalimi thirret automatikisht nga Integro, nd\u00ebrsa figura e njeriut tregon se kalimi thirret manualisht nga njeriu. Le t\u00eb shqyrtojm\u00eb disa rrug\u00eb q\u00eb mund t\u00eb ndjek\u00eb detyra n\u00eb k\u00ebt\u00eb proces pune.<\/p>\n<p>Testim krejt\u00ebsisht manual n\u00eb DEV+BETA pa teste kanarin\u00eb (zakonisht k\u00ebshtu e publikojm\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 kalimi. Ndonj\u00ebher\u00eb rruga q\u00eb do t\u00eb ndjek\u00eb detyra, mund t\u00eb zgjidhet n\u00ebp\u00ebrmjet opsioneve n\u00eb Jira.<\/p>\n<h2>L\u00ebvizja e detyr\u00ebs<\/h2>\n<p>\nLe t\u00eb shqyrtojm\u00eb hapat kryesor\u00eb q\u00eb p\u00ebrmbushen gjat\u00eb l\u00ebvizjes s\u00eb detyr\u00ebs n\u00eb procesin e pun\u00ebs \"Testim n\u00eb DEV + teste kanarin\u00eb\":<\/p>\n<p>1. Zhvilluesi ose PM krijon nj\u00eb detyr\u00eb.<\/p>\n<p>2. Zhvilluesi merr detyr\u00ebn p\u00ebr t\u00eb punuar. Pas p\u00ebrfundimit, e kalon at\u00eb n\u00eb statusin IN REVIEW.<\/p>\n<p>3. Jira d\u00ebrgon nj\u00eb Webhook n\u00eb drejtim t\u00eb mikro-sh\u00ebrbimit Jira (p\u00ebrgjegj\u00ebs p\u00ebr integrimin me Jira).<\/p>\n<p>4. Mikro-sh\u00ebrbimi Jira d\u00ebrgon nj\u00eb k\u00ebrkes\u00eb n\u00eb sh\u00ebrbimin Flow (p\u00ebrgjegj\u00ebs p\u00ebr proceset e brendshme t\u00eb pun\u00ebs, n\u00eb t\u00eb cilat kryhet puna) p\u00ebr t\u00eb nisur procesin e pun\u00ebs.<\/p>\n<p>5. Brenda sh\u00ebrbimit Flow:<\/p>\n<ul>\n<li>Rishikuesit caktohen p\u00ebr detyr\u00ebn (mikro-sh\u00ebrbimi Users, i cili di gjith\u00e7ka p\u00ebr p\u00ebrdoruesit + mikro-sh\u00ebrbimi Jira).<\/li>\n<li>N\u00ebp\u00ebrmjet mikro-sh\u00ebrbimit Source (i cili di p\u00ebr repository-t dhe deg\u00ebt, por nuk punon me kodin e vet), b\u00ebhet k\u00ebrkimi i repositor\u00ebve q\u00eb kan\u00eb deg\u00eb t\u00eb detyr\u00ebs ton\u00eb (p\u00ebr thjeshtimin e k\u00ebrkimit, emri i deg\u00ebs p\u00ebrputhet me numrin e detyr\u00ebs n\u00eb Jira). N\u00eb shumic\u00ebn e rasteve, detyra ka vet\u00ebm nj\u00eb deg\u00eb n\u00eb nj\u00eb repository, kjo e thjeshton menaxhimin e radh\u00ebs p\u00ebr publikim dhe zvog\u00eblon lidhshm\u00ebrin\u00eb midis repositor\u00ebve.<\/li>\n<li>P\u00ebr secil\u00ebn deg\u00eb t\u00eb gjetur, kjo sekuenc\u00eb veprimesh realizohet:\n<p> i) P\u00ebrfshirja e deg\u00ebs master (mikro-sh\u00ebrbimi Git p\u00ebr pun\u00ebn me kodin).<br \/>\n ii) Dega bllokohet nga ndryshime nga zhvilluesi (mikro-sh\u00ebrbimi Bitbucket).<br \/>\n iii) Krijohet nj\u00eb Pull Request p\u00ebr k\u00ebt\u00eb deg\u00eb (mikro-sh\u00ebrbimi Bitbucket).<br \/>\n iv) D\u00ebrgohet nj\u00eb mesazh p\u00ebr Pull Request t\u00eb ri n\u00eb bisedat e zhvilluesve (mikro-sh\u00ebrbimi Notify p\u00ebr pun\u00ebn me njoftime).<br \/>\n v) Nis\u00ebn nd\u00ebrtimi, testimi dhe publikimi i detyr\u00ebs n\u00eb DEV (mikro-sh\u00ebrbimi Jenkins p\u00ebr pun\u00ebn me Jenkins).<br \/>\n vi) N\u00ebse t\u00eb gjitha pikat e m\u00ebsip\u00ebrme p\u00ebrfundojn\u00eb me sukses, at\u00ebher\u00eb Integro vendos aprovimin e tij n\u00eb Pull Request (mikro-sh\u00ebrbimi Bitbucket).<\/li>\n<li>Integro pret aprovimin n\u00eb Pull Request nga rishikuesit e caktuar.<\/li>\n<li>Sapo t\u00eb merren t\u00eb gjitha aprovimet e nevojshme (n\u00eb p\u00ebrfshirje t\u00eb testeve automatike t\u00eb kaluara pozitivisht), Integro e kalon detyr\u00ebn n\u00eb statusin Test on Dev (mikro-sh\u00ebrbimi Jira).<\/li>\n<\/ul>\n<p>\n6. Testuesit kryejn\u00eb testimin e detyr\u00ebs. N\u00ebse nuk ka probleme, at\u00ebher\u00eb e kalojn\u00eb detyr\u00ebn n\u00eb statusin Ready For Build.<\/p>\n<p>7. Integro \u00abshikon\u00bb, q\u00eb detyra \u00ebsht\u00eb gati p\u00ebr publikim, dhe e nisin deploy-n e saj n\u00eb modin kanar (mikros\u00ebrvici Jenkins). Gatishm\u00ebria p\u00ebr publikim 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 publikime aktive t\u00eb k\u00ebtij mikroservici, etj.<\/p>\n<p>8. Detyra kalon n\u00eb statusin Canary (mikros\u00ebrvici Jira).<\/p>\n<p>9. Jenkins nisin deploy-n e detyr\u00ebs n\u00eb modin kanar p\u00ebrmes Nomad (zakonisht 1-3 instanca) dhe njofton p\u00ebr publikimin sh\u00ebrbimin e monitorimit t\u00eb publikimeve (mikros\u00ebrvici DeployWatch).<\/p>\n<p>10. Mikros\u00ebrvici DeployWatch mbledh sfondin e gabimeve dhe reagon n\u00eb t\u00eb, n\u00ebse \u00ebsht\u00eb e nevojshme. N\u00ebse sfondi i gabimeve kalon limitin (norma e sfondit llogaritet automatikisht) b\u00ebhet njoftimi i zhvilluesve p\u00ebrmes mikros\u00ebrvicit Notify. N\u00ebse zhvilluesi nuk reagon brenda 5 minutash (n\u00ebp\u00ebrmjet shtypjes s\u00eb Revert ose Stay), at\u00ebher\u00eb fillohet rregullimi automatik i instancave kanar. N\u00ebse sfondi nuk kalon limitin, zhvilluesi duhet t\u00eb nis\u00eb manualisht deploy-n e detyr\u00ebs n\u00eb Production (n\u00ebp\u00ebrmjet nj\u00eb butoni n\u00eb UI). N\u00ebse brenda 60 minutash zhvilluesi nuk ka nisur deploy-n n\u00eb Production, at\u00ebher\u00eb instancat kanar gjithashtu do t\u00eb anulohen p\u00ebr siguri.<\/p>\n<p>11. Pas nisjes s\u00eb deploy-it n\u00eb Production:<\/p>\n<ul>\n<li>Detyra kalon n\u00eb statusin Production (mikros\u00ebrvici Jira).<\/li>\n<li>Mikros\u00ebrvici Jenkins nis procesin e deploy-it dhe njofton p\u00ebr publikimin mikros\u00ebrvicin DeployWatch.<\/li>\n<li>Mikros\u00ebrvici DeployWatch kontrollon q\u00eb t\u00eb gjith\u00eb kontenier\u00ebt n\u00eb Production jan\u00eb p\u00ebrdit\u00ebsuar (ka pasur raste kur nuk p\u00ebrdit\u00ebsoheshin t\u00eb gjith\u00eb).<\/li>\n<li>P\u00ebrmes mikros\u00ebrvicit Notify d\u00ebrgohet nj\u00eb njoftim p\u00ebr rezultatet e deploy-it n\u00eb Production.<\/li>\n<\/ul>\n<p>\n12. Zhvilluesit do t\u00eb ken\u00eb 30 minuta p\u00ebr t\u00eb nisur rregullimin e detyr\u00ebs nga Production n\u00eb rast se zbulohet sjellje incorrecte e mikros\u00ebrvicit. Pas p\u00ebrfundimit t\u00eb k\u00ebsaj kohe, detyra do t\u00eb p\u00ebrfshihet automatikisht n\u00eb master (mikros\u00ebrvici Git).<\/p>\n<p>13. Pas nj\u00eb bashkimi t\u00eb suksessh\u00ebm n\u00eb master, statusi i detyr\u00ebs do t\u00eb ndryshohet n\u00eb Closed (mikros\u00ebrvici Jira).<\/p>\n<p>Schemat nuk pretendon p\u00ebr detajizimin e plot\u00eb (n\u00eb realitet ka m\u00eb shum\u00eb hapa), por lejon t\u00eb vler\u00ebsohet shkalla e integrimit n\u00eb procese. Ne nuk e konsiderojm\u00eb k\u00ebt\u00eb schem\u00ebn ideale dhe p\u00ebrmir\u00ebsojm\u00eb proceset e mb\u00ebshtetjes automatike t\u00eb publikimeve dhe deploy-it.<\/p>\n<h2>\u00c7far\u00eb pason<\/h2>\n<p>\nKemi plane t\u00eb m\u00ebdha p\u00ebr zhvillimin e automatizimit, p\u00ebr shembull, heqjen e operacioneve manuale gjat\u00eb l\u00ebshimeve t\u00eb monolit, p\u00ebrmir\u00ebsimin e monitorimit gjat\u00eb shp\u00ebrndarjes automatike, dhe p\u00ebrmir\u00ebsimin e bashk\u00ebpunimit me zhvilluesit.<\/p>\n<p>Por k\u00ebtu do t\u00eb ndalemi p\u00ebr tani. Kemi prekur shum\u00eb tema n\u00eb p\u00ebrmbledhjen e automatizimit n\u00eb m\u00ebnyr\u00eb sip\u00ebrfaq\u00ebsore dhe disa grah\u00ebm fare, prandaj g\u00ebzohemi t\u00eb p\u00ebrgjigjemi p\u00ebr pyetje. Presim propozime se \u00e7far\u00eb t\u00eb flasim m\u00eb n\u00eb detaje, shkruani n\u00eb komentet.<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.2 - 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.2\" \/>\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 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}]}}