{"id":92048,"date":"2020-08-22T07:42:57","date_gmt":"2020-08-22T05:42:57","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines"},"modified":"2020-08-22T07:42:57","modified_gmt":"2020-08-22T05:42:57","slug":"sovremennye-prilozheniya-na-openshift-chast-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines","title":{"rendered":"Aplikacione moderne n\u00eb OpenShift, pjesa 3: OpenShift si nj\u00eb ambient zhvillimi dhe konvergjencat OpenShift Pipelines","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>P\u00ebrsh\u00ebndetje t\u00eb gjith\u00ebve n\u00eb k\u00ebt\u00eb blog! Ky \u00ebsht\u00eb postimi i tret\u00eb n\u00eb seri, ku tregojm\u00eb se si t\u00eb implementoni aplikacione web moderne n\u00eb Red Hat OpenShift.<\/p>\n<p><img decoding=\"async\" alt=\"Aplikacione moderne n\u00eb OpenShift, pjesa 3: OpenShift si nj\u00eb ambient zhvillimi dhe konvergjencat OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/9c3337b13a3f045d36343308ce6154cc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00eb dy postimet e m\u00ebparshme, ne treguam se si t\u00eb implementoni aplikacione web moderne n\u00eb vet\u00ebm disa hapa dhe si t\u00eb p\u00ebrdorni imazhin e ri S2I me nj\u00eb imazh t\u00eb gatsh\u00ebm t\u00eb serverit HTTP, si NGINX me ndihm\u00ebn e nd\u00ebrlidhjeve t\u00eb nd\u00ebrlidhura p\u00ebr t\u00eb organizuar implementimin n\u00eb prodhim.<\/p>\n<p>Sot do t\u00eb tregojm\u00eb se si t\u00eb lanconi nj\u00eb server zhvillimi p\u00ebr aplikacionin tuaj n\u00eb platform\u00ebn OpenShift dhe si ta sinkronizoni at\u00eb me sistemin tuaj lokal t\u00eb skedar\u00ebve, si dhe do t\u00eb flasim p\u00ebr \u00e7far\u00eb \u00ebsht\u00eb OpenShift Pipelines dhe si mund t\u00eb p\u00ebrdoret si nj\u00eb alternativ\u00eb ndaj nd\u00ebrlidhjeve t\u00eb nd\u00ebrlidhura.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>OpenShift si nj\u00eb ambient zhvillimi<\/h3>\n<p><\/p>\n<h4>Procesi i pun\u00ebs n\u00eb zhvillim<\/h4>\n<p>\nSi\u00e7 u tha n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/511954\/\">postimin e par\u00eb<\/a><\/noindex>, procesi standard i zhvillimit p\u00ebr aplikacionet moderne web \u00ebsht\u00eb thjesht nj\u00eb \"server zhvillimi\" q\u00eb ndjek ndryshimet n\u00eb skedar\u00ebt lokal\u00eb. Kur ndodhin k\u00ebto ndryshime, ndodh nd\u00ebrtimi i aplikacionit dhe pastaj ato p\u00ebrdit\u00ebsohen n\u00eb shfletues.<\/p>\n<p>N\u00eb shumic\u00ebn e frameworkeve moderne, nj\u00eb \"server zhvillimi\" \u00ebsht\u00eb i p\u00ebrfshir\u00eb n\u00eb veglat p\u00ebrkat\u00ebse t\u00eb komand\u00ebs.<\/p>\n<h4>Shembulli lokal<\/h4>\n<p>\nFillimisht, le t\u00eb shohim se si funksionon n\u00eb rastin e ekzekutimit lokal t\u00eb aplikacioneve. Si shembull, t\u00eb marrim aplikacionin <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lholmquist\/react-web-app\">React<\/a><\/noindex> nga artikujt paraardh\u00ebs, edhe pse pothuajse t\u00eb nj\u00ebjtat koncepte t\u00eb procesit t\u00eb pun\u00ebs zbatohen n\u00eb t\u00eb gjitha frameworket moderne.<br \/>\nPra, p\u00ebr t\u00eb nisur \"serverin e zhvillimit\" n\u00eb shembullin ton\u00eb me React, do t\u00eb shkruajm\u00eb komand\u00ebn e m\u00ebposhtme:<\/p>\n<pre><code class=\"plaintext\">$ npm run start\n<\/code><\/pre>\n<p>\nN\u00eb at\u00eb moment, n\u00eb dritaren e terminalit do t\u00eb kemi di\u00e7ka t\u00eb ngjashme:<\/p>\n<p><img decoding=\"async\" alt=\"Aplikacione moderne n\u00eb OpenShift, pjesa 3: OpenShift si nj\u00eb ambient zhvillimi dhe konvergjencat OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/06f84ffb4c9a6a5868b8b47b8ad1d9ec.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Dhe aplikacioni yn\u00eb do t\u00eb hapet n\u00eb shfletuesin p\u00ebrkat\u00ebs:<\/p>\n<p><img decoding=\"async\" alt=\"Aplikacione moderne n\u00eb OpenShift, pjesa 3: OpenShift si nj\u00eb ambient zhvillimi dhe konvergjencat OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/72341bb0796352e7343bf31ceb8233cd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Tani, n\u00ebse b\u00ebjm\u00eb nj\u00eb ndryshim n\u00eb skedarin, aplikacioni duhet t\u00eb p\u00ebrdit\u00ebsohet n\u00eb shfletues.<\/p>\n<p>Mir\u00eb, p\u00ebr zhvillimin n\u00eb modalitetin lokal \u00ebsht\u00eb e qart\u00eb, por si ta arrijm\u00eb t\u00eb nj\u00ebjt\u00ebn gj\u00eb n\u00eb OpenShift?<\/p>\n<h4>Serveri i zhvillimit n\u00eb OpenShift<\/h4>\n<p>\nN\u00ebse e mbani mend, n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/513948\/\">postimin e m\u00ebparsh\u00ebm<\/a><\/noindex>, ne kemi diskutuar faz\u00ebn e njohur si faza e nisjes (run phase) t\u00eb imazhit S2I dhe kemi par\u00eb se n\u00eb m\u00ebnyr\u00eb t\u00eb paracaktuar, mbajtja e aplikacionit ton\u00eb web kryhet nga moduli serve.<\/p>\n<p>Megjithat\u00eb, n\u00ebse e shikoni m\u00eb me kujdes <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/ubi8-s2i-web-app\/blob\/master\/s2i\/run#L10\">run script<\/a><\/noindex> nga ai shembull, ka nj\u00eb variab\u00ebl ambienti $NPM_RUN, e cila lejon t\u00eb ekzekutohet edhe komanda juaj.<\/p>\n<p>P\u00ebr shembull, mund t\u00eb p\u00ebrdorim modulin nodeshift p\u00ebr t\u00eb vendosur aplikacionin ton\u00eb:<\/p>\n<pre><code class=\"plaintext\">$ npx nodeshift --deploy.env NPM_RUN=\"yarn start\" --dockerImage=nodeshift\/ubi8-s2i-web-app\n<\/code><\/pre>\n<p>\n<i>V\u00ebrejtje: shembulli m\u00eb sip\u00ebr jepet n\u00eb nj\u00eb form\u00eb t\u00eb shkurtuar p\u00ebr t\u00eb ilustruar iden\u00eb e p\u00ebrgjithshme.<\/i><\/p>\n<p>K\u00ebtu ne kemi shtuar n\u00eb vendosjen ton\u00eb nj\u00eb variab\u00ebl ambienti NPM_RUN, e cila i thot\u00eb faz\u00ebs s\u00eb ekzekutimit se duhet t\u00eb nis\u00eb komand\u00ebn yarn start, e cila nis serverin e zhvillimit React brenda pod-it ton\u00eb OpenShift.<\/p>\n<p>N\u00ebse shikoni log-un e pod-it q\u00eb po punon, do t\u00eb jet\u00eb di\u00e7ka e till\u00eb:<\/p>\n<p><img decoding=\"async\" alt=\"Aplikacione moderne n\u00eb OpenShift, pjesa 3: OpenShift si nj\u00eb ambient zhvillimi dhe konvergjencat OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/5b090223e08e32a3356608881068ce1a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Sigurisht, gjith\u00e7ka do t\u00eb jet\u00eb e pavler\u00eb deri sa t\u00eb mund t\u00eb sinkronizojm\u00eb kodin lokal me kodin, i cili gjithashtu kontrollohet p\u00ebr ndryshime, por jeton n\u00eb nj\u00eb server t\u00eb larg\u00ebt.<\/p>\n<h4>Sinkronizimi i kodit t\u00eb larg\u00ebt dhe lokal<\/h4>\n<p>\nFatkeq\u00ebsisht, nodeshift ofron ndihm\u00eb t\u00eb leht\u00eb me sinkronizimin, dhe p\u00ebr t\u00eb p\u00ebrcjell\u00eb ndryshimet, mund t\u00eb p\u00ebrdorni komand\u00ebn watch.<\/p>\n<p>Prandaj, pas ekzekutimit t\u00eb komand\u00ebs p\u00ebr t\u00eb dislokuar serverin e zhvillimit p\u00ebr aplikacionin ton\u00eb, mund ta p\u00ebrdorim me besim k\u00ebt\u00eb komand\u00eb:<\/p>\n<pre><code class=\"plaintext\">$ npx nodeshift watch\n<\/code><\/pre>\n<p>\nSi rezultat, do t\u00eb lidhet me pod-in q\u00eb krijuam pak m\u00eb her\u00ebt, aktivizohet sinkronizimi i skedar\u00ebve tan\u00eb lokal\u00eb me klasterin e larg\u00ebt, dhe skedar\u00ebt n\u00eb sistemin ton\u00eb lokal do t\u00eb fillojn\u00eb t\u00eb monitorohen p\u00ebr ndryshime.<\/p>\n<p>Prandaj, n\u00ebse tani p\u00ebrdit\u00ebsojm\u00eb skedarin src\/App.js, sistemi do t\u00eb reagoj\u00eb ndaj k\u00ebtyre ndryshimeve, do t'i kopjoj\u00eb ato n\u00eb klasterin e larg\u00ebt dhe do t\u00eb niste serverin e zhvillimit, i cili do t\u00eb p\u00ebrdit\u00ebsoj\u00eb aplikacionin ton\u00eb n\u00eb shfletues.<\/p>\n<p>P\u00ebr t\u00eb pasur nj\u00eb pamje t\u00eb plot\u00eb, do t\u00eb tregojm\u00eb si duken k\u00ebto komanda n\u00eb t\u00ebr\u00ebsi:<\/p>\n<pre><code class=\"plaintext\">$ npx nodeshift --strictSSL=false --dockerImage=nodeshift\/ubi8-s2i-web-app --build.env YARN_ENABLED=true --expose --deploy.env NPM_RUN=\"yarn start\" --deploy.port 3000\n\n$ npx nodeshift watch --strictSSL=false\n<\/code><\/pre>\n<p>\nKomanda watch \u00ebsht\u00eb nj\u00eb abstraksion mbi komand\u00ebn oc rsync, p\u00ebr t'u informuar m\u00eb shum\u00eb se si funksionon, mund t\u00eb m\u00ebsoni. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.okd.io\/latest\/dev_guide\/copy_files_to_container.html\">k\u00ebtu<\/a><\/noindex>.<\/p>\n<p>Ky ishte nj\u00eb shembull p\u00ebr React, por nj\u00eb metod\u00eb e till\u00eb mund t\u00eb p\u00ebrdoret po ashtu me frameworke t\u00eb tjera, thjesht shkrini variabl\u00ebn e mjedisit NPM_RUN sipas nevoj\u00ebs.<br \/>\n\u2003<\/p>\n<h3>Pipelinat Openshift Pipelines<\/h3>\n<p><img decoding=\"async\" alt=\"Aplikacione moderne n\u00eb OpenShift, pjesa 3: OpenShift si nj\u00eb ambient zhvillimi dhe konvergjencat OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/33b932d3591b22dd00d82509b352d489.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>M\u00eb pas do t\u00eb flasim p\u00ebr nj\u00eb mjet t\u00eb till\u00eb si OpenShift Pipelines, dhe se si mund t\u00eb p\u00ebrdoret si nj\u00eb alternativ\u00eb p\u00ebr nd\u00ebrlidhjet e nd\u00ebrtimit chain build.<\/p>\n<h4>\u00c7far\u00eb \u00ebsht\u00eb OpenShift Pipelines<\/h4>\n<p>\nOpenShift Pipelines \u00ebsht\u00eb nj\u00eb sistem CI\/CD i orientuar drejt cloud-it p\u00ebr integrim dhe shp\u00ebrndarje t\u00eb vazhdueshme, i dedikuar p\u00ebr organizimin e pipelinave duke p\u00ebrdorur Tekton. Tekton \u00ebsht\u00eb nj\u00eb framework CI\/CD me kod t\u00eb hapur, i natyrsh\u00ebm p\u00ebr Kubernetes, q\u00eb lejon automatizimin e publikimeve n\u00eb platforma t\u00eb ndryshme (Kubernetes, serverless, makina virtuale, etj.) duke e abstraktuar at\u00eb nga niveli i posht\u00ebm.<\/p>\n<p>P\u00ebr t\u00eb kuptuar k\u00ebt\u00eb artikull jan\u00eb t\u00eb nevojshme disa njohuri mbi Pipelines, prandaj ju inkurajojm\u00eb q\u00eb fillimisht t\u00eb njiheni me <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openshift\/pipelines-tutorial\">manualin zyrtar<\/a><\/noindex>.<\/p>\n<h4>Konfigurimi i ambientit t\u00eb pun\u00ebs<\/h4>\n<p>\nP\u00ebr t'u luajtur me shembujt nga ky artikull, s\u00eb pari duhet t\u00eb p\u00ebrgatitni ambientin e pun\u00ebs:<\/p>\n<ol>\n<li>Instaloni dhe konfiguroni nj\u00eb kluster OpenShift 4. N\u00eb shembujt tan\u00eb do t\u00eb p\u00ebrdorim CodeReady Containers (CRD), p\u00ebr informacionin n\u00eb lidhje me instalimin e t\u00eb cilit mund t\u00eb gjeni <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.redhat.com\/openshift\/install\/crc\/installer-provisioned\">k\u00ebtu<\/a><\/noindex>.<\/li>\n<li>Pasi klustri t\u00eb jet\u00eb gati, duhet t\u00eb instaloni Operatorin e Pipeline. Mos e keni frik\u00eb, \u00ebsht\u00eb e leht\u00eb, p\u00ebr udh\u00ebzimet e instalimit <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openshift\/pipelines-tutorial\/blob\/master\/install-operator.md\">k\u00ebtu<\/a><\/noindex>.<\/li>\n<li>Shkarko <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tektoncd\/cli#installing-tkn\">Tekton CLI<\/a><\/noindex> (tkn) <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tektoncd\/cli#installing-tkn\">k\u00ebtu<\/a><\/noindex>.<\/li>\n<li>Startoni mjetin e komand\u00ebs create-react-app p\u00ebr t\u00eb krijuar nj\u00eb aplikacion, i cili m\u00eb von\u00eb do t\u00eb implementohet (ky \u00ebsht\u00eb nj\u00eb aplikacion i thjesht\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift-starters\/react-pipeline-example\">React<\/a><\/noindex>).<\/li>\n<li>(Opcionale) Kloni repozitorin p\u00ebr t\u00eb ekzekutuar lokalisht shembullin e aplikacionit me komand\u00ebn npm install dhe pastaj npm start.<\/li>\n<\/ol>\n<p>\nN\u00eb repozitorin e aplikacionit gjithashtu do t\u00eb ket\u00eb nj\u00eb folder k8s, ku do t\u00eb gjenden YAML-t\u00eb p\u00ebr Kubernetes\/OpenShift, t\u00eb p\u00ebrdorura p\u00ebr implementimin e aplikacionit. Aty do t\u00eb jen\u00eb Tasks, ClusterTasks, Resources dhe Pipelines, t\u00eb cilat do t\u2019i krijojm\u00eb n\u00eb k\u00ebt\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/webapp-pipeline-tutorial\">repozitorit<\/a><\/noindex>.<\/p>\n<h4>Le t\u00eb fillojm\u00eb<\/h4>\n<p>\nM\u00eb par\u00eb, p\u00ebr shembullin ton\u00eb, duhet t\u00eb krijojm\u00eb nj\u00eb projekt t\u00eb ri n\u00eb klusterin OpenShift. Ta quajm\u00eb k\u00ebt\u00eb projekt webapp-pipeline dhe ta krijojm\u00eb me komand\u00ebn e m\u00ebposhtme:<\/p>\n<pre><code class=\"plaintext\">$ oc new-project webapp-pipeline\n<\/code><\/pre>\n<p>\nM\u00eb von\u00eb, ky em\u00ebr projekti do t\u00eb shfaqet n\u00eb kod, prandaj n\u00ebse vendosni ta em\u00ebrtoni ndryshe, mos harroni t\u00eb ndryshoni p\u00ebrkat\u00ebsisht kodin n\u00eb shembuj. Duke filluar nga kjo pik\u00eb, do t\u00eb shkojm\u00eb jo nga lart-posht\u00eb, por nga posht\u00eb-lart: dometh\u00ebn\u00eb, m\u00eb par\u00eb do t\u00eb krijojm\u00eb t\u00eb gjitha p\u00ebrb\u00ebr\u00ebsit e tubacionit, dhe pastaj vet\u00eb tubacionin.<\/p>\n<p>Pra, hapi i par\u00eb\u2026<\/p>\n<h4>Detyrat Tasks<\/h4>\n<p>\nDo t\u00eb krijojm\u00eb disa detyra (tasks), t\u00eb cilat m\u00eb von\u00eb do t\u00eb ndihmojn\u00eb p\u00ebr t\u00eb shp\u00ebrndar\u00eb aplikacionin n\u00eb kuad\u00ebr t\u00eb tubacionit ton\u00eb pipeline. Detyra e par\u00eb \u2013 apply_manifests_task \u2013 \u00ebsht\u00eb p\u00ebrgjegj\u00ebse p\u00ebr aplikimin e YAML t\u00eb burimeve Kubernetes (sh\u00ebrbimi, shp\u00ebrndarja dhe rruga), t\u00eb cilat ndodhen n\u00eb dosjen k8s t\u00eb aplikacionit ton\u00eb. Detyra e dyt\u00eb \u2013 update_deployment_task \u2013 \u00ebsht\u00eb p\u00ebrgjegj\u00ebse p\u00ebr p\u00ebrdit\u00ebsimin e imazhit t\u00eb shp\u00ebrndar\u00eb tashm\u00eb n\u00eb at\u00eb q\u00eb krijohet nga tubacioni yn\u00eb.<\/p>\n<p>Mos u shqet\u00ebsoni n\u00ebse ende nuk \u00ebsht\u00eb shum\u00eb e qart\u00eb. N\u00eb t\u00eb v\u00ebrtet\u00eb, k\u00ebto detyra jan\u00eb si nj\u00eb lloj utiliteti, dhe ne do t\u2019i shqyrtojm\u00eb ato m\u00eb n\u00eb detaje pak m\u00eb von\u00eb. Tani, le t\u00eb krijojm\u00eb ato:<\/p>\n<pre><code class=\"plaintext\">$ oc create -f https:\/\/raw.githubusercontent.com\/nodeshift\/webapp-pipeline-tutorial\/master\/tasks\/update_deployment_task.yaml\n$ oc create -f https:\/\/raw.githubusercontent.com\/nodeshift\/webapp-pipeline-tutorial\/master\/tasks\/apply_manifests_task.yaml\n<\/code><\/pre>\n<p>\nPastaj, me ndihm\u00ebn e komand\u00ebs tkn CLI, do t\u00eb kontrollojm\u00eb q\u00eb detyrat u krijuan:<\/p>\n<pre><code class=\"plaintext\">$ tkn task ls\n\nEMRI                MOSHA\napply-manifests     1 minut\u00eb m\u00eb par\u00eb\nupdate-deployment   1 minut\u00eb m\u00eb par\u00eb\n<\/code><\/pre>\n<p>\n<i>Sh\u00ebnim: k\u00ebto jan\u00eb detyrat lokale t\u00eb projektit tuaj aktual.<\/i><\/p>\n<h4>Detyrat e klasterit<\/h4>\n<p>\nDetyrat e klasterit jan\u00eb n\u00eb thelb t\u00eb nj\u00ebjtat si detyrat e zakonshme. Kjo do t\u00eb thot\u00eb se ato jan\u00eb nj\u00eb koleksion i rip\u00ebrdorsh\u00ebm i hapave, t\u00eb cilat kombinohen n\u00eb nj\u00eb m\u00ebnyr\u00eb ose n\u00eb nj\u00eb tjet\u00ebr kur ekzekutohet nj\u00eb detyr\u00eb specifike. Dallimi \u00ebsht\u00eb se detyra e klasterit \u00ebsht\u00eb e disponueshme kudo brenda klasterit. P\u00ebr t\u00eb par\u00eb list\u00ebn e detyrave t\u00eb klasterit, t\u00eb cilat krijohen automatikisht duke shtuar Operatorin e Pipeline, do t\u00eb p\u00ebrdorim p\u00ebrs\u00ebri komand\u00ebn tkn CLI:<\/p>\n<pre><code class=\"plaintext\">$ tkn clustertask ls\n\nEMRI                       MOSHA\nbuildah                    1 dit\u00eb m\u00eb par\u00eb\nbuildah-v0-10-0            1 dit\u00eb m\u00eb par\u00eb\njib-maven                  1 dit\u00eb m\u00eb par\u00eb\nkn                         1 dit\u00eb m\u00eb par\u00eb\nmaven                      1 dit\u00eb m\u00eb par\u00eb\nopenshift-client           1 dit\u00eb m\u00eb par\u00eb\nopenshift-client-v0-10-0   1 dit\u00eb m\u00eb par\u00eb\ns2i                        1 dit\u00eb m\u00eb par\u00eb\ns2i-go                     1 dit\u00eb m\u00eb par\u00eb\ns2i-go-v0-10-0             1 dit\u00eb m\u00eb par\u00eb\ns2i-java-11                1 dit\u00eb m\u00eb par\u00eb\ns2i-java-11-v0-10-0        1 dit\u00eb m\u00eb par\u00eb\ns2i-java-8                 1 dit\u00eb m\u00eb par\u00eb\ns2i-java-8-v0-10-0         1 dit\u00eb m\u00eb par\u00eb\ns2i-nodejs                 1 dit\u00eb m\u00eb par\u00eb\ns2i-nodejs-v0-10-0         1 dit\u00eb m\u00eb par\u00eb\ns2i-perl                   1 dit\u00eb m\u00eb par\u00eb\ns2i-perl-v0-10-0           1 dit\u00eb m\u00eb par\u00eb\ns2i-php                    1 dit\u00eb m\u00eb par\u00eb\ns2i-php-v0-10-0            1 dit\u00eb m\u00eb par\u00eb\ns2i-python-3               1 dit\u00eb m\u00eb par\u00eb\ns2i-python-3-v0-10-0       1 dit\u00eb m\u00eb par\u00eb\ns2i-ruby                   1 dit\u00eb m\u00eb par\u00eb\ns2i-ruby-v0-10-0           1 dit\u00eb m\u00eb par\u00eb\ns2i-v0-10-0                1 dit\u00eb m\u00eb par\u00eb\n<\/code><\/pre>\n<p>\nTani le t\u00eb krijojm\u00eb dy detyra klasterike. E para do t\u00eb krijoj\u00eb nj\u00eb imazh S2I dhe do ta d\u00ebrgoj\u00eb n\u00eb regjistrin e brendsh\u00ebm OpenShift; e dyta do t\u00eb ekzekutoj\u00eb nd\u00ebrtimin e imazhit ton\u00eb mbi baz\u00ebn e NGINX, duke p\u00ebrdorur si p\u00ebrmbajtje aplikacionin q\u00eb e kemi nd\u00ebrtuar m\u00eb par\u00eb.<\/p>\n<h4>Krijojm\u00eb dhe d\u00ebrgojm\u00eb imazh<\/h4>\n<p>\nKur krijojm\u00eb detyr\u00ebn e par\u00eb, do t\u00eb p\u00ebrs\u00ebrisim at\u00eb q\u00eb b\u00ebm\u00eb n\u00eb artikullin e m\u00ebparsh\u00ebm mbi nd\u00ebrlidhjet e nd\u00ebrtimit. T\u00eb kujtojm\u00eb se ne p\u00ebrdor\u00ebm imazhin S2I (ubi8-s2i-web-app) p\u00ebr t\u00eb \"nd\u00ebrtuar\" aplikacionin ton\u00eb, dhe n\u00eb fund mor\u00ebm nj\u00eb imazh, i cili ruhej n\u00eb regjistrin e brendsh\u00ebm OpenShift. Tani do t\u00eb p\u00ebrdorim k\u00ebt\u00eb imazh S2I t\u00eb aplikacionit web p\u00ebr t\u00eb krijuar nj\u00eb DockerFile p\u00ebr aplikacionin ton\u00eb, dhe m\u00eb pas do t\u00eb angazhojm\u00eb Buildah p\u00ebr t\u00eb kryer nd\u00ebrtimin real dhe p\u00ebr t\u00eb d\u00ebrguar imazhin e marr\u00eb n\u00eb regjistrin e brendsh\u00ebm OpenShift, pasi kjo \u00ebsht\u00eb sakt\u00ebsisht ajo q\u00eb b\u00ebn OpenShift kur ju vendosni aplikacionet tuaja duke p\u00ebrdorur NodeShift.<\/p>\n<p>Po pyesni, nga e dim\u00eb t\u00eb gjitha k\u00ebto? Nga <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openshift\/pipelines-catalog\/blob\/master\/s2i-nodejs\/s2i-nodejs-task.yaml\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 official Node.js<\/a><\/noindex>, ne thjesht e kopjuam at\u00eb dhe e p\u00ebrshtat\u00ebm p\u00ebr vete.<\/p>\n<p>K\u00ebshtu, tani krijojm\u00eb detyr\u00ebn klasterike s2i-web-app:<\/p>\n<pre><code class=\"plaintext\">$ oc create -f https:\/\/raw.githubusercontent.com\/nodeshift\/webapp-pipeline-tutorial\/master\/clustertasks\/s2i-web-app-task.yaml\n<\/code><\/pre>\n<p>\nNuk do t\u00eb merremi me detaje t\u00eb shumta rreth k\u00ebsaj, por do t\u00eb ndalemi vet\u00ebm te parametri OUTPUT_DIR:<\/p>\n<pre><code class=\"plaintext\">params:\n      - name: OUTPUT_DIR\n        description: Vendi i drejtoris\u00eb s\u00eb daljes s\u00eb nd\u00ebrtimit\n        default: build\n<\/code><\/pre>\n<p>\nNga e drejta, ky parametr \u00ebsht\u00eb i barabart\u00eb me build, dhe aty React ruan p\u00ebrmbajtjen e nd\u00ebrtuar. N\u00eb kuad\u00ebr t\u00eb framework-\u00ebve t\u00eb tjer\u00eb p\u00ebrdoren rrug\u00eb t\u00eb tjera, p\u00ebr shembull, n\u00eb Ember kjo \u00ebsht\u00eb dist. T\u00eb dh\u00ebnat e detyr\u00ebs son\u00eb t\u00eb par\u00eb klaster do t\u00eb p\u00ebrb\u00ebhen nga nj\u00eb imazh, q\u00eb p\u00ebrmban HTML-n\u00eb, JavaScript dhe CSS-n\u00eb q\u00eb kemi mbledhur.<\/p>\n<h4>Krijojm\u00eb nj\u00eb imazh n\u00eb baz\u00eb t\u00eb NGINX<\/h4>\n<p>\nSa i p\u00ebrket detyr\u00ebs son\u00eb t\u00eb dyt\u00eb klaster, ajo duhet t\u00eb krijoj\u00eb nj\u00eb imazh mbi baz\u00ebn e NGINX, duke p\u00ebrdorur p\u00ebrmbajtjen e aplikacionit q\u00eb kemi nd\u00ebrtuar m\u00eb par\u00eb. N\u00eb thelb, kjo \u00ebsht\u00eb pjesa e atij kapitulli t\u00eb m\u00ebparsh\u00ebm, ku shqyrtuam nd\u00ebrlidhjet e nd\u00ebrtimit.<\/p>\n<p>P\u00ebr k\u00ebt\u00eb, ne - pik\u00ebrisht si m\u00eb lart - do t\u00eb krijojm\u00eb detyr\u00ebn klaster webapp-build-runtime:<\/p>\n<pre><code class=\"plaintext\">$ oc create -f https:\/\/raw.githubusercontent.com\/nodeshift\/webapp-pipeline-tutorial\/master\/clustertasks\/webapp-build-runtime-task.yaml\n<\/code><\/pre>\n<p>\nN\u00ebse shikoni kodin e k\u00ebtyre detyrave t\u00eb grumbullit, do t\u00eb vini re se nuk specifikohet depoja Git me t\u00eb cil\u00ebn punojm\u00eb, apo emrat e imazheve q\u00eb krijojm\u00eb. Ne vet\u00ebm p\u00ebrcaktojm\u00eb se \u00e7far\u00eb sakt\u00ebsisht po transferojm\u00eb n\u00eb Git, ose ndonj\u00eb imazh, ku duhet t\u00eb ruhet imazhi p\u00ebrfundimtar. Prandaj, k\u00ebto detyra t\u00eb grumbullit mund t\u00eb rip\u00ebrdoren edhe gjat\u00eb pun\u00ebs me aplikacione t\u00eb tjera.<\/p>\n<p>Dhe k\u00ebtu kalojm\u00eb me eleganc\u00eb n\u00eb pik\u00ebn tjet\u00ebr...<\/p>\n<h4>Burimet<\/h4>\n<p>\nPra, duke qen\u00eb se, si\u00e7 sapo tham\u00eb, detyrat e grumbullit duhet t\u00eb jen\u00eb sa m\u00eb t\u00eb p\u00ebrgjithshme, na nevojitet t\u00eb krijojm\u00eb burime q\u00eb do t\u00eb p\u00ebrdoren n\u00eb hyrje (depoja Git) dhe n\u00eb dalje (imazhet p\u00ebrfundimtare). Burimi i par\u00eb q\u00eb na nevojitet \u00ebsht\u00eb Git, ku ndodhet aplikacioni yn\u00eb, di\u00e7ka si kjo:<\/p>\n<pre><code class=\"plaintext\"># This resource is the location of the git repo with the web application source\napiVersion: tekton.dev\/v1alpha1\nkind: PipelineResource\nmetadata:\n  name: web-application-repo\nspec:\n  type: git\n  params:\n    - name: url\n      value: https:\/\/github.com\/nodeshift-starters\/react-pipeline-example\n    - name: revision\n      value: master\n<\/code><\/pre>\n<p>\nK\u00ebtu, PipelineResource ka llojin git. \u00c7el\u00ebsi url n\u00eb seksionin params tregon depozitat specifike dhe caktimin e deg\u00ebs master (kjo \u00ebsht\u00eb opsionale, por e shkruajm\u00eb p\u00ebr kompletim).<\/p>\n<p>Tani na nevojitet t\u00eb krijojm\u00eb nj\u00eb burim p\u00ebr imazhin, ku do t\u00eb ruhen rezultatet e ekzekutimit t\u00eb detyr\u00ebs s2i-web-app; kjo b\u00ebhet k\u00ebshtu:<\/p>\n<pre><code class=\"plaintext\"># This resource is the result of running &quot;npm run build&quot;,  the resulting built files will be located in \/opt\/app-root\/output\napiVersion: tekton.dev\/v1alpha1\nkind: PipelineResource\nmetadata:\n  name: built-web-application-image\nspec:\n  type: image\n  params:\n    - name: url\n      value: image-registry.openshift-image-registry.svc:5000\/webapp-pipeline\/built-web-application:latest\n<\/code><\/pre>\n<p>\nK\u00ebtu, PipelineResource ka tipin image, dhe vlera e parametrave url tregon regjistrin e brendsh\u00ebm t\u00eb imazheve OpenShift, konkretisht at\u00eb q\u00eb ndodhet n\u00eb hap\u00ebsir\u00ebn e emrave webapp-pipeline. Mos harroni ta ndryshoni k\u00ebt\u00eb parametrin n\u00ebse po p\u00ebrdorni nj\u00eb hap\u00ebsir\u00eb tjet\u00ebr emri.<\/p>\n<p>Dhe, p\u00ebrfundimisht, burimi i fundit q\u00eb do na nevojitet, gjithashtu do t\u00eb ket\u00eb tipin image dhe ky do t\u00eb jet\u00eb imazhi p\u00ebrfundimtar NGINX, i cili m\u00eb pas do t\u00eb p\u00ebrdoret gjat\u00eb implementimit:<\/p>\n<pre><code class=\"plaintext\"># This resource is the image that will be just the static html, css, js files being run with nginx\napiVersion: tekton.dev\/v1alpha1\nkind: PipelineResource\nmetadata:\n  name: runtime-web-application-image\nspec:\n  type: image\n  params:\n    - name: url\n      value: image-registry.openshift-image-registry.svc:5000\/webapp-pipeline\/runtime-web-application:latest\n<\/code><\/pre>\n<p>\nDhe p\u00ebrs\u00ebri, vini re se ky burim ruan imazhin n\u00eb regjistrin e brendsh\u00ebm OpenShift n\u00eb hap\u00ebsir\u00ebn e emrave webapp-pipeline.<\/p>\n<p>P\u00ebr t\u00eb krijuar t\u00eb gjitha k\u00ebto burime nj\u00ebkoh\u00ebsisht, do t\u00eb p\u00ebrdorim komand\u00ebn create:<\/p>\n<pre><code class=\"plaintext\">$ oc create -f https:\/\/raw.githubusercontent.com\/nodeshift\/webapp-pipeline-tutorial\/master\/resources\/resource.yaml\n<\/code><\/pre>\n<p>\nMund t\u00eb verifikoni q\u00eb burimet jan\u00eb krijuar k\u00ebshtu:<\/p>\n<pre><code class=\"plaintext\">$ tkn resource ls\n<\/code><\/pre>\n<p><\/p>\n<h4>Pipeline i konvejerit<\/h4>\n<p>\nTani q\u00eb kemi t\u00eb gjitha p\u00ebrb\u00ebr\u00ebsit e nevojsh\u00ebm, do ta nd\u00ebrtrojm\u00eb konvejerin, duke e krijuar at\u00eb me komand\u00ebn e m\u00ebposhtme:<\/p>\n<pre><code class=\"plaintext\">$ oc create -f https:\/\/raw.githubusercontent.com\/nodeshift\/webapp-pipeline-tutorial\/master\/pipelines\/build-and-deploy-react.yaml\n<\/code><\/pre>\n<p>\nPor, para se ta ekzekutojm\u00eb k\u00ebt\u00eb komand\u00eb, le t\u00eb analizojm\u00eb k\u00ebta p\u00ebrb\u00ebr\u00ebs. I pari \u2013 \u00ebsht\u00eb emri:<\/p>\n<pre><code class=\"plaintext\">apiVersion: tekton.dev\/v1alpha1\nkind: Pipeline\nmetadata:\n  name: build-and-deploy-react\n<\/code><\/pre>\n<p>\nM\u00eb pas, n\u00eb seksionin spec shohim p\u00ebrcaktimin e burimeve q\u00eb krijuam m\u00eb par\u00eb:<\/p>\n<pre><code class=\"plaintext\">spec:\n  burimet:\n    - emri: web-application-repo\n      lloji: git\n    - emri: built-web-application-image\n      lloji: image\n    - emri: runtime-web-application-image\n      lloji: image\n<\/code><\/pre>\n<p>\nM\u00eb pas krijojm\u00eb detyrat q\u00eb do t\u00eb ekzekutoj\u00eb konvjeri yn\u00eb. E para q\u00eb duhet t\u00eb kryej\u00eb \u00ebsht\u00eb detyra q\u00eb e krijuam m\u00eb par\u00eb, s2i-web-app:<\/p>\n<pre><code class=\"plaintext\">detyrat:\n    - emri: build-web-application\n      taskRef:\n        emri: s2i-web-app\n        lloji: ClusterTask\n<\/code><\/pre>\n<p>\nKjo detyr\u00eb merr parametrat hyr\u00ebs (gir-burimi) dhe dal\u00ebs (burimi built-web-application-image). Ne gjithashtu ia japim nj\u00eb paramet\u00ebr t\u00eb ve\u00e7ant\u00eb q\u00eb t\u00eb mos verifikoj\u00eb TLS, pasi po p\u00ebrdorim certifikata t\u00eb vet\u00eb-nderuar:<\/p>\n<pre><code class=\"plaintext\">resources:\n        inputs:\n          - name: source\n            resource: web-application-repo\n        outputs:\n          - name: image\n            resource: built-web-application-image\n      params:\n        - name: TLSVERIFY\n          value: \"false\"\n<\/code><\/pre>\n<p>\nDetyra tjet\u00ebr \u00ebsht\u00eb pothuajse e nj\u00ebjt\u00eb, vet\u00ebm se k\u00ebtu thirret detyra tona klaster me em\u00ebr webapp-build-runtime:<\/p>\n<pre><code class=\"plaintext\">emri: build-runtime-image\n    taskRef:\n      emri: webapp-build-runtime\n      lloji: ClusterTask\n<\/code><\/pre>\n<p>\nAshtu si me detyr\u00ebn e m\u00ebparshme, ne transferojm\u00eb burimin, por tani kjo \u00ebsht\u00eb built-web-application-image (dalja nga detyra jon\u00eb e m\u00ebparshme). Dhe si dalje, p\u00ebrs\u00ebri specifikojm\u00eb imazhin. Duke qen\u00eb se kjo detyr\u00eb duhet t\u00eb ekzekutohet pas asaj paraprake, shtojm\u00eb fush\u00ebn runAfter:<\/p>\n<pre><code class=\"plaintext\">resources:\n        inputs:\n          - name: image\n            resource: built-web-application-image\n        outputs:\n          - name: image\n            resource: runtime-web-application-image\n        params:\n        - name: TLSVERIFY\n          value: \"false\"\n      runAfter:\n        - build-web-application\n<\/code><\/pre>\n<p>\nDy detyrat e ardhshme jan\u00eb p\u00ebrgjegj\u00ebse p\u00ebr aplikimin e skedar\u00ebve YAML p\u00ebr sh\u00ebrbimin, rrug\u00ebn dhe implementimin, t\u00eb cil\u00ebt jetojn\u00eb n\u00eb dosjen k8s t\u00eb aplikacionit ton\u00eb web, si dhe p\u00ebr t\u00eb p\u00ebrdit\u00ebsuar k\u00ebt\u00eb implementim kur krijohen imazhe t\u00eb reja. K\u00ebto dy detyra klasteri i kemi p\u00ebrcaktuar q\u00eb n\u00eb fillim t\u00eb artikullit.<\/p>\n<h4>Ekzekutimi i konvejerit<\/h4>\n<p>\nPra, t\u00eb gjitha pjes\u00ebt e konveyor\u00ebve tan\u00eb jan\u00eb krijuar, dhe ne do ta ekzekutojm\u00eb at\u00eb me komand\u00ebn e m\u00ebposhtme:<\/p>\n<pre><code class=\"plaintext\">$ tkn pipeline start build-and-deploy-react\n<\/code><\/pre>\n<p>\nN\u00eb k\u00ebt\u00eb faz\u00eb, linja e komandave p\u00ebrdoret n\u00eb mod t\u00eb nd\u00ebrveprimit dhe duhet t\u00eb zgjidhni burimet p\u00ebrkat\u00ebse n\u00eb p\u00ebrgjigje t\u00eb \u00e7do k\u00ebrkese t\u00eb saj: p\u00ebr burimin git zgjidhni web-application-repo, pastaj p\u00ebr burimin e par\u00eb t\u00eb imazhit - built-web-application-image, dhe, n\u00eb fund, p\u00ebr burimin e dyt\u00eb t\u00eb imazhit - runtime-web-application-image:<\/p>\n<pre><code class=\"plaintext\">? Choose the git resource to use for web-application-repo: web-application-repo (https:\/\/github.com\/nodeshift-starters\/react-pipeline-example)\n? Choose the image resource to use for built-web-application-image: built-web-application-image (image-registry.openshift-image-registry.svc:5000\/webapp-pipeline\/built-web-\napplication:latest)\n? Choose the image resource to use for runtime-web-application-image: runtime-web-application-image (image-registry.openshift-image-registry.svc:5000\/webapp-pipeline\/runtim\ne-web-application:latest)\nPipelinerun started: build-and-deploy-react-run-4xwsr\n<\/code><\/pre>\n<p>\nTani do t\u00eb kontrollojm\u00eb statusin e pipeline-it duke p\u00ebrdorur komand\u00ebn e m\u00ebposhtme:<\/p>\n<pre><code class=\"plaintext\">$ tkn pipeline logs -f\n<\/code><\/pre>\n<p>\nPasi t\u00eb nis\u00eb pipeline-i dhe aplikacioni t\u00eb jet\u00eb i instaluar, do ta k\u00ebrkojm\u00eb rrug\u00ebn e publikuar me komand\u00ebn e m\u00ebposhtme:<\/p>\n<pre><code class=\"plaintext\">$ oc get route react-pipeline-example --template='http:\/\/{{.spec.host}}'\n<\/code><\/pre>\n<p>\nP\u00ebr m\u00eb shum\u00eb vizibilitet, mund ta shikoni pipeline-n ton\u00eb n\u00eb modalitetin Developer t\u00eb konsol\u00ebs s\u00eb webit n\u00eb seksionin <b>Pipelines<\/b>, ashtu si\u00e7 tregohet n\u00eb Fig. 1.<\/p>\n<p><img decoding=\"async\" alt=\"Aplikacione moderne n\u00eb OpenShift, pjesa 3: OpenShift si nj\u00eb ambient zhvillimi dhe konvergjencat OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/ede9b076414e389c2cd212adeda08956.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Fig. 1. Pasqyra e pipeline-ve t\u00eb nisura.<\/i><\/p>\n<p>Klikimi mbi pipeline-in e nisur tregon informacion shtes\u00eb, si\u00e7 tregohet n\u00eb Fig. 2.<\/p>\n<p><img decoding=\"async\" alt=\"Aplikacione moderne n\u00eb OpenShift, pjesa 3: OpenShift si nj\u00eb ambient zhvillimi dhe konvergjencat OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/64581b1f6d8ff91aedd963019ef29be5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Fig. 2. Informacion shtes\u00eb rreth pipeline-it.<\/i><\/p>\n<p>Pas informacionit shtes\u00eb, mund t\u00eb shikoni aplikacionet e nisura n\u00eb pamjen <b>Topology<\/b>, si\u00e7 tregohet n\u00eb Fig. 3.<\/p>\n<p><img decoding=\"async\" alt=\"Aplikacione moderne n\u00eb OpenShift, pjesa 3: OpenShift si nj\u00eb ambient zhvillimi dhe konvergjencat OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/d23f723e14514ff60ecfddd8eb9bf752.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Fig. 3. Pod-i i nisur.<\/i><\/p>\n<p>Klikimi mbi rrethin n\u00eb k\u00ebndin e sip\u00ebrm t\u00eb djatht\u00eb t\u00eb ikon\u00ebs hap aplikacionin ton\u00eb, si\u00e7 tregohet n\u00eb Fig. 4.<\/p>\n<p><img decoding=\"async\" alt=\"Aplikacione moderne n\u00eb OpenShift, pjesa 3: OpenShift si nj\u00eb ambient zhvillimi dhe konvergjencat OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/aa8e09d9fd9f33d5faffc7f661d84ca4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Fig. 4. Aplikacioni React i nisur.<\/i><\/p>\n<h3>P\u00ebrfundimi<\/h3>\n<p>\nPra, ne treguam se si t\u00eb nisni n\u00eb OpenShift nj\u00eb server zhvillimi p\u00ebr aplikacionin tuaj dhe ta sinkronizoni at\u00eb me sistemin lokal t\u00eb skedave. Po ashtu, shqyrtuam se si t\u00eb imitojm\u00eb template-n e chained-build me ndihm\u00ebn e OpenShift Pipelines. T\u00eb gjitha kodet e shembujve nga ky artikull mund t\u00eb gjenden n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/webapp-pipeline-tutorial\">k\u00ebtu<\/a><\/noindex>.<\/p>\n<h3>Burime t\u00eb tjera (EN)<\/h3>\n<p><\/p>\n<ul>\n<li>E-lib\u00ebr falas <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/books\/deploying-openshift\/\">\u00abZhvillimi n\u00eb OpenShift: udh\u00ebzues p\u00ebr t\u00eb padurueshmit\u00bb<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/06\/11\/container-native-nodejs-istio-rhoar\/\">Nd\u00ebrtimi i aplikacioneve t\u00eb orientuara n\u00eb kontejner\u00eb Node.js duke p\u00ebrdorur Red Hat OpenShift Application Runtimes dhe Istio<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/05\/15\/debug-your-node-js-application-on-openshift-with-chrome-devtools\/\">Depurimi i aplikacioneve Node.js n\u00eb OpenShift me ndihm\u00ebn e Chrome DevTools<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/04\/16\/zero-express-openshift-3-commands\/\">Tre komanda p\u00ebr t\u00eb m\u00ebsuar nga fillimi Express n\u00eb OpenShift<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/03\/12\/rhoar-nodejs-annoucement\/\">Njoftimi p\u00ebr l\u00ebshimin publik t\u00eb Node.js si pjes\u00eb e Red Hat OpenShift Application Runtimes<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/12\/21\/monitoring-node-js-applications-on-openshift-with-prometheus\/\">Monitorimi i aplikacioneve Node.js n\u00eb OpenShift me Prometheus<\/a><\/noindex><\/li>\n<li>Artikuj t\u00eb tjer\u00eb mbi <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/kubernetes\/\">OpenShift dhe Kubernetes<\/a><\/noindex> n\u00eb faqen e Red Hat<\/li>\n<\/ul>\n<h3>Njoftimet p\u00ebr webinar\u00ebt n\u00eb vazhdim<\/h3>\n<p>\nFillojm\u00eb nj\u00eb seri webinar\u00ebsh t\u00eb premtes mbi p\u00ebrvoj\u00ebn natyrore t\u00eb p\u00ebrdorimit t\u00eb Red Hat OpenShift Container Platform dhe Kubernetes:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/events.redhat.com\/profile\/form\/index.cfm?PKformID=0x232599abcd&amp;sc_cid=7013a000002gwqQAAQ\"><b>28 gusht, webinar i Perandorit \u201cOperator\u201d: Operatori n\u00eb OpenShift dhe Kubernetes<\/b><\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/events.redhat.com\/profile\/form\/index.cfm?PKformID=0x232694abcd&amp;sc_cid=7013a000002gwrdAAA\"><b>11 Shtator, DeploymentConfig vs Deployment \u2013 gj\u00ebrat magjike specifike t\u00eb OpenShift p\u00ebr nd\u00ebrtimin dhe vendosjen e aplikacioneve<\/b><\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/events.redhat.com\/profile\/form\/index.cfm?PKformID=0x232789abcd&amp;sc_cid=7013a000002gws7AAA\"><b>25 Shtator, Red Hat OpenShift dhe Machine API<\/b><\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/events.redhat.com\/profile\/form\/index.cfm?PKformID=0x232884abcd&amp;sc_cid=7013a000002gwsqAAA\"><b>9 Tetor, Si t\u00eb p\u00ebrballoni nj\u00eb rritje t\u00eb papritur t\u00eb ngarkes\u00ebs<\/b><\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/events.redhat.com\/profile\/form\/index.cfm?PKformID=0x232979abcd&amp;sc_cid=7013a000002gwumAAA\"><b>23 Tetor, Jenkins i integruar, Pipeline-builds, Tekton n\u00eb Red Hat OpenShift Container Platform<\/b><\/a><\/noindex><\/li>\n<\/ul>\n<p>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/515988\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442 \u0432\u0441\u0435\u043c \u0432 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u0433\u0435! \u0421 \u0432\u0430\u043c\u0438 \u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u043e\u0441\u0442 \u0438\u0437 \u0441\u0435\u0440\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043a\u0430\u043a \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Red Hat OpenShift. \u0412 \u0434\u0432\u0443\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0441\u0442\u0430\u0445 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b\u0438, \u043a\u0430\u043a \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u0437\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0448\u0430\u0433\u043e\u0432 \u0438 \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 S2I \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, NGINX \u0441 \u043f\u043e\u043c\u043e\u0449\u044c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u0431\u043e\u0440\u043e\u043a chained [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":92049,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-92048","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 4.9.10 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442 \u0432\u0441\u0435\u043c \u0432 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u0433\u0435! \u0421 \u0432\u0430\u043c\u0438 \u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u043e\u0441\u0442 \u0438\u0437 \u0441\u0435\u0440\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043a\u0430\u043a \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Red Hat OpenShift. \u0412 \u0434\u0432\u0443\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0441\u0442\u0430\u0445 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b\u0438, \u043a\u0430\u043a \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u0437\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0448\u0430\u0433\u043e\u0432 \u0438 \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 S2I \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, NGINX \u0441 \u043f\u043e\u043c\u043e\u0449\u044c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u0431\u043e\u0440\u043e\u043a chained\" \/>\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\/sovremennye-prilozheniya-na-openshift-chast-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\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\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 OpenShift, \u0447\u0430\u0441\u0442\u044c 3: OpenShift \u043a\u0430\u043a \u0441\u0440\u0435\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u044b OpenShift Pipelines | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442 \u0432\u0441\u0435\u043c \u0432 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u0433\u0435! \u0421 \u0432\u0430\u043c\u0438 \u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u043e\u0441\u0442 \u0438\u0437 \u0441\u0435\u0440\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043a\u0430\u043a \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Red Hat OpenShift. \u0412 \u0434\u0432\u0443\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0441\u0442\u0430\u0445 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b\u0438, \u043a\u0430\u043a \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u0437\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0448\u0430\u0433\u043e\u0432 \u0438 \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 S2I \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, NGINX \u0441 \u043f\u043e\u043c\u043e\u0449\u044c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u0431\u043e\u0440\u043e\u043a chained\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines\" \/>\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-08-22T05:42:57+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-22T05:42:57+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\udd47Aplikacionet moderne n\u00eb OpenShift, pjesa 3: OpenShift si mjedis zhvillimi dhe kanalet OpenShift Pipelines | ProHoster","description":"P\u00ebrsh\u00ebndetje t\u00eb gjith\u00ebve n\u00eb k\u00ebt\u00eb blog! K\u00ebtu \u00ebsht\u00eb postimi i tret\u00eb n\u00eb serin\u00eb ku tregojm\u00eb se si t\u00eb implementoni aplikacione moderne t\u00eb internetit n\u00eb Red Hat OpenShift. N\u00eb dy postimet e m\u00ebparshme, fol\u00ebm p\u00ebr m\u00ebnyrat e implementimit t\u00eb aplikacioneve moderne n\u00eb vet\u00ebm disa hapa dhe si t\u00eb p\u00ebrdorim imazhin e ri S2I s\u00eb bashku me nj\u00eb imazh t\u00eb gatsh\u00ebm t\u00eb serverit HTTP, si\u00e7 \u00ebsht\u00eb NGINX me ndihm\u00ebn e nd\u00ebrlidhjeve t\u00eb grupeve t\u00eb nd\u00ebrlidhura.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines","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\u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 OpenShift, \u0447\u0430\u0441\u0442\u044c 3: OpenShift \u043a\u0430\u043a \u0441\u0440\u0435\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u044b OpenShift Pipelines | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442 \u0432\u0441\u0435\u043c \u0432 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u0433\u0435! \u0421 \u0432\u0430\u043c\u0438 \u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u043e\u0441\u0442 \u0438\u0437 \u0441\u0435\u0440\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043a\u0430\u043a \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Red Hat OpenShift. \u0412 \u0434\u0432\u0443\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0441\u0442\u0430\u0445 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b\u0438, \u043a\u0430\u043a \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u0437\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0448\u0430\u0433\u043e\u0432 \u0438 \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 S2I \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, NGINX \u0441 \u043f\u043e\u043c\u043e\u0449\u044c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u0431\u043e\u0440\u043e\u043a chained","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines","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-08-22T05:42:57+00:00","article:modified_time":"2020-08-22T05:42:57+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"92048","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 12:16:43","updated":"2022-10-02 02:53:55"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/92048","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=92048"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/92048\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/92049"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=92048"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=92048"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=92048"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}