{"id":90874,"date":"2020-08-07T01:42:20","date_gmt":"2020-08-06T23:42:20","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-2-svyazannye-sborki-chained-builds"},"modified":"2020-08-07T01:42:20","modified_gmt":"2020-08-06T23:42:20","slug":"sovremennye-prilozheniya-na-openshift-chast-2-svyazannye-sborki-chained-builds","status":"publish","type":"post","link":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-2-svyazannye-sborki-chained-builds","title":{"rendered":"Aplikacionet moderne n\u00eb OpenShift, pjesa 2: nd\u00ebrlidhja e nd\u00ebrtimeve t\u00eb varura","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>P\u00ebrsh\u00ebndetje t\u00eb gjith\u00ebve! Ky \u00ebsht\u00eb postimi yn\u00eb i dyt\u00eb nga seria ku ne tregojm\u00eb si t\u00eb drejtojm\u00eb aplikacione moderne web n\u00eb Red Hat OpenShift. <\/p>\n<p><img decoding=\"async\" alt=\"Aplikacionet moderne n\u00eb OpenShift, pjesa 2: nd\u00ebrlidhja e nd\u00ebrtimeve t\u00eb varura\" src=\"\/wp-content\/uploads\/2020\/08\/b1f6ae855a69597c6e86c5198e4a628c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00eb postimin e kaluar, ne diskutuan leht\u00eb mbi mund\u00ebsit\u00eb e imazhit t\u00eb ri builder S2I (source-to-image), i cili \u00ebsht\u00eb i destinuar p\u00ebr nd\u00ebrtimin dhe drejtp\u00ebrdrejtimin e aplikacioneve moderne web n\u00eb platform\u00ebn OpenShift. At\u00ebher\u00eb u interesuam p\u00ebr tem\u00ebn e drejtimeve t\u00eb shpejta t\u00eb aplikacionit, nd\u00ebrsa sot do t\u00eb shqyrtojm\u00eb se si t\u00eb p\u00ebrdorim imazhin S2I si nj\u00eb 'builder' t\u00eb past\u00ebr dhe ta bashkojm\u00eb at\u00eb me nd\u00ebrtimet e lidhura t\u00eb OpenShift.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Builder i past\u00ebr<\/h3>\n<p>\nSi\u00e7 e p\u00ebrmend\u00ebm n\u00eb pjes\u00ebn e par\u00eb, shumica e aplikacioneve moderne web kan\u00eb nj\u00eb faz\u00eb nd\u00ebrtimi, n\u00eb t\u00eb cil\u00ebn zakonisht kryhen operacione si transpiling kod, bashkimi i disa skedar\u00ebve dhe minifikimi. Skedar\u00ebt e rezultuar nga k\u00ebto operacione \u2013 q\u00eb p\u00ebrfshijn\u00eb HTML statik, JavaScript dhe CSS \u2013 grumbullohen n\u00eb dosjen e output-it. Lokacioni i k\u00ebsaj dosjeje zakonisht varet nga mjetet e nd\u00ebrtimit q\u00eb p\u00ebrdoren, dhe p\u00ebr React, kjo do t\u00eb jet\u00eb dosja .\/build (do t\u00eb kthehemi p\u00ebr k\u00ebt\u00eb m\u00eb posht\u00eb).<\/p>\n<h4>Source-to-Image (S2I)<\/h4>\n<p>\nN\u00eb k\u00ebt\u00eb post, ne nuk do t\u00eb diskutojm\u00eb fare tem\u00ebn '\u00e7far\u00eb \u00ebsht\u00eb S2I dhe si ta p\u00ebrdorim' (mund t\u00eb lexoni m\u00eb shum\u00eb p\u00ebr k\u00ebt\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.okd.io\/latest\/architecture\/core_concepts\/builds_and_image_streams.html#source-build\">k\u00ebtu<\/a><\/noindex>), por \u00ebsht\u00eb e r\u00ebnd\u00ebsishme t\u00eb kuptojm\u00eb qart\u00eb dy fazat e k\u00ebtij procesi, n\u00eb m\u00ebnyr\u00eb q\u00eb t\u00eb kuptojm\u00eb \u00e7far\u00eb b\u00ebn\u00eb imazhi i Web App Builder.<\/p>\n<h4>Faza e asambletimit (assemble phase)<\/h4>\n<p>\nFaza e asambletimit \u00ebsht\u00eb n\u00eb thelb shum\u00eb e ngjashme me at\u00eb q\u00eb ndodh kur keni ekzekutuar docker build dhe si rezultat merrni nj\u00eb imazh t\u00eb ri Docker. Prandaj, kjo faz\u00eb ndodh kur filloni nd\u00ebrtimin n\u00eb platform\u00ebn OpenShift.<\/p>\n<p>N\u00eb rastin e imazhit t\u00eb Web App Builder, p\u00ebr instalimin e var\u00ebsive t\u00eb aplikacionit tuaj dhe p\u00ebr t\u00eb filluar nd\u00ebrtimin \u00ebsht\u00eb p\u00ebrgjegj\u00ebs <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bucharest-gold\/centos7-s2i-web-app\/blob\/master\/s2i\/assemble#L47\">skripti i asambletimit<\/a><\/noindex>. Me default, imazhi builder p\u00ebrdor nd\u00ebrtimin npm run build, por mund t\u00eb tejkaloni k\u00ebt\u00eb p\u00ebrmes variablit t\u00eb mjedisit NPM_BUILD.<\/p>\n<p>Si\u00e7 e kemi th\u00ebn\u00eb m\u00eb par\u00eb, vendndodhja e aplikacionit t\u00eb gatsh\u00ebm, t\u00eb nd\u00ebrtuar, varet nga cilat mjete p\u00ebrdoren. P\u00ebr shembull, n\u00eb rastin e React, kjo do t\u00eb jet\u00eb dosja .\/build, nd\u00ebrsa p\u00ebr aplikacionet Angular \u2013 dosja project_name\/dist. Dhe, si\u00e7 u tregua n\u00eb postimin e kaluar, vendndodhja e dosjes s\u00eb output-it, e cila \u00ebsht\u00eb caktuar si build nga default, mund t\u00eb tejkalohet p\u00ebrmes variablit t\u00eb mjedisit OUTPUT_DIR. Dhe p\u00ebr sa koh\u00eb q\u00eb vendndodhja e dosjes s\u00eb output-it ndryshon nga nj\u00eb framework n\u00eb tjetrin, thjesht kopjoni output-in e generuar n\u00eb dosjen standarde t\u00eb imazhit, q\u00eb \u00ebsht\u00eb \/opt\/apt-root\/output. Kjo \u00ebsht\u00eb e r\u00ebnd\u00ebsishme p\u00ebr t\u00eb kuptuar pjes\u00ebn tjet\u00ebr t\u00eb k\u00ebtij artikulli, nd\u00ebrsa le t\u00eb shqyrtojm\u00eb shpejt faz\u00ebn tjet\u00ebr \u2013 faza e ekzekutimit.<\/p>\n<h4>Faza e ekzekutimit (run phase)<\/h4>\n<p>\nKjo faz\u00eb ndodh kur b\u00ebhet thirrje docker run p\u00ebr imazhin e ri, t\u00eb krijuar n\u00eb faz\u00ebn e asambletimit. Kjo ndodh gjithashtu gjat\u00eb ekzekutimit t\u00eb drejtimit n\u00eb platform\u00ebn OpenShift. Me default, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bucharest-gold\/centos7-s2i-web-app\/blob\/master\/s2i\/run\">run script<\/a><\/noindex> p\u00ebrdor <noindex><a rel=\"nofollow\" href=\"https:\/\/www.npmjs.com\/package\/serve\">moduli serve<\/a><\/noindex> p\u00ebr sh\u00ebrbimin e p\u00ebrmbajtjes statike, e cila ndodhet n\u00eb dosjen standarde t\u00eb output-it t\u00eb p\u00ebrmendur m\u00eb lart.<\/p>\n<p>Ky metod\u00eb \u00ebsht\u00eb e mir\u00eb p\u00ebr drejtime t\u00eb shpejta t\u00eb aplikacioneve, por n\u00eb t\u00eb v\u00ebrtet\u00eb nuk rekomandohet t\u00eb sh\u00ebrbehet p\u00ebrmbajtja statike n\u00eb k\u00ebt\u00eb m\u00ebnyr\u00eb. E th\u00ebn\u00eb ndryshe, ndonj\u00ebher\u00eb ne sh\u00ebrbejm\u00eb vet\u00ebm p\u00ebrmbajtje statike, ndonj\u00ebher\u00eb Node.js i instaluar brenda imazhit ton\u00eb nuk \u00ebsht\u00eb i nevojsh\u00ebm \u2013 nj\u00eb server web mjafton.<\/p>\n<p>K\u00ebt\u00eb n\u00eb kuptimin se gjat\u00eb nd\u00ebrtimit na duhet nj\u00eb gj\u00eb, gjat\u00eb ekzekutimit nj\u00eb tjet\u00ebr. N\u00eb k\u00ebt\u00eb situat\u00eb do t\u00eb jen\u00eb t\u00eb dobishme nd\u00ebrtimet e lidhura.<\/p>\n<h3>Nd\u00ebrtimet e lidhura (chained builds)<\/h3>\n<p>\nK\u00ebshtu q\u00eb k\u00ebtu \u00ebsht\u00eb \u00e7far\u00eb thot\u00eb p\u00ebr <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.okd.io\/latest\/dev_guide\/builds\/advanced_build_operations.html#dev-guide-chaining-builds\">nd\u00ebrtimet e lidhura<\/a><\/noindex> n\u00eb dokumentacionin OpenShift:<\/p>\n<blockquote><p>\u2018Dy nd\u00ebrtime mund t\u00eb lidhen me nj\u00ebra-tjetr\u00ebn, ku nj\u00ebra gjeneron nj\u00eb ent t\u00eb p\u00ebrpunuar, nd\u00ebrsa tjetra vendos k\u00ebt\u00eb ent n\u00eb nj\u00eb imazh t\u00eb ve\u00e7ant\u00eb, i cili p\u00ebrdoret p\u00ebr t\u00eb drejtuar k\u00ebt\u00eb ent.\u2019\n<\/p><\/blockquote>\n<p>\nMe fjal\u00eb t\u00eb tjera, ne mund t\u00eb p\u00ebrdorim imazhin Web App Builder p\u00ebr t\u00eb drejtuar nd\u00ebrtimin ton\u00eb, dhe m\u00eb pas t\u00eb p\u00ebrdorim imazhin e serverit web, si NGINX, p\u00ebr t\u00eb sh\u00ebrbyer p\u00ebrmbajtjen ton\u00eb.<\/p>\n<p>K\u00ebshtu, ne mund t\u00eb aplikojm\u00eb imazhin Web App Builder si nj\u00eb 'builder' t\u00eb past\u00ebr dhe t\u00eb kemi nj\u00eb imazh runtime t\u00eb vog\u00ebl.<\/p>\n<p>Tani le t\u00eb shqyrtojm\u00eb k\u00ebt\u00eb n\u00eb nj\u00eb shembull konkret.<\/p>\n<p>P\u00ebr k\u00ebt\u00eb trajnim do t\u00eb p\u00ebrdorim <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lholmquist\/react-web-app\">nj\u00eb aplikacion t\u00eb thjesht\u00eb React<\/a><\/noindex>, i krijuar me ndihm\u00ebn e mjetit t\u00eb linj\u00ebs s\u00eb komandave create-react-app.<\/p>\n<p>P\u00ebr t\u00eb p\u00ebrmbledhur gjith\u00e7ka s\u00eb bashku, na ndihmon <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lholmquist\/react-web-app\/blob\/master\/.openshiftio\/application.yaml\">skedari i shabllonit OpenShift<\/a><\/noindex>.<\/p>\n<p>Le t\u00eb shqyrtojm\u00eb m\u00eb n\u00eb detaje k\u00ebt\u00eb skedar, duke filluar me seksionin e parametrave.<\/p>\n<pre><code class=\"plaintext\">parameters:\n  - name: SOURCE_REPOSITORY_URL\n    description: URL-ja burimore p\u00ebr aplikacionin\n    displayName: URL Burimore\n    required: true\n  - name: SOURCE_REPOSITORY_REF\n    description: Emri i deg\u00ebs p\u00ebr aplikacionin\n    displayName: Deg\u00eb Burimore\n    value: master\n    required: true\n  - name: SOURCE_REPOSITORY_DIR\n    description: Vendndodhja brenda repos burimor t\u00eb aplikacionit\n    displayName: Dosja Burimore\n    value: .\n    required: true\n  - name: OUTPUT_DIR\n    description: Vendndodhja e skedar\u00ebve statik\u00eb t\u00eb p\u00ebrpunuar nga nd\u00ebrtuesi i aplikacioneve web\n    displayName: Dosja e Output-it\n    value: build\n    required: false\n<\/code><\/pre>\n<p>\nK\u00ebtu \u00e7do gj\u00eb \u00ebsht\u00eb mjaft e qart\u00eb, por duhet t'i kushtojm\u00eb v\u00ebmendje parametrin OUTPUT_DIR. P\u00ebr aplikacionin React nga shembulli yn\u00eb, nuk ka asgj\u00eb p\u00ebr t'u shqet\u00ebsuar, pasi React p\u00ebrdor si vler\u00eb t\u00eb default p\u00ebr folderin e output, nd\u00ebrsa n\u00eb rastin e Angular ose ndonj\u00eb gj\u00ebje tjet\u00ebr, ky paramet\u00ebr do t\u00eb duhet t\u00eb ndryshohet si\u00e7 \u00ebsht\u00eb e nevojshme.<\/p>\n<p>Tani, le t\u00eb shikojm\u00eb seksionin e ImageStream-eve.<\/p>\n<pre><code class=\"plaintext\">- apiVersion: v1\n  kind: ImageStream\n  metadata:\n    name: react-web-app-builder  \/\/ 1 \n  spec: {}\n- apiVersion: v1\n  kind: ImageStream\n  metadata:\n    name: react-web-app-runtime  \/\/ 2 \n  spec: {}\n- apiVersion: v1\n  kind: ImageStream\n  metadata:\n    name: web-app-builder-runtime \/\/ 3\n  spec:\n    tags:\n    - name: latest\n      from:\n        kind: DockerImage\n        name: nodeshift\/ubi8-s2i-web-app:10.x\n- apiVersion: v1\n  kind: ImageStream\n  metadata:\n    name: nginx-image-runtime \/\/ 4\n  spec:\n    tags:\n    - name: latest\n      from:\n        kind: DockerImage\n        name: 'centos\/nginx-112-centos7:latest'\n<\/code><\/pre>\n<p>\nShikoni imazhet e tret\u00eb dhe t\u00eb kat\u00ebrt. T\u00eb dyja jan\u00eb t\u00eb p\u00ebrcaktuara si imazhe Docker dhe \u00ebsht\u00eb e qart\u00eb nga e ku e marrin at\u00eb.<\/p>\n<p>Imazhi i tret\u00eb \u00ebsht\u00eb web-app-builder dhe merret nga nodeshift\/ubi8-s2i-web-app me tag 10.x n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/nodeshift\/ubi8-s2i-web-app\/\">Docker hub<\/a><\/noindex>.<\/p>\n<p>Imazhi i kat\u00ebrt \u00ebsht\u00eb imazhi NGINX (versioni 1.12) me tag latest n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/centos\/nginx-112-centos7\/\">Docker hub<\/a><\/noindex>.<\/p>\n<p>Tani le t\u00eb shikojm\u00eb dy imazhet e para. T\u00eb dyja jan\u00eb t\u00eb zbraz\u00ebta n\u00eb fillim dhe krijohen vet\u00ebm n\u00eb faz\u00ebn e nd\u00ebrtimit. Imazhi i par\u00eb, react-web-app-builder, do t\u00eb jet\u00eb rezultati i faz\u00ebs s\u00eb asambles\u00eb, e cila do t\u00eb bashkoj\u00eb imazhin web-app-builder-runtime dhe kodin ton\u00eb burimor. Pik\u00ebrisht p\u00ebr k\u00ebt\u00eb arsye, e kemi p\u00ebrfshir\u00eb \u2018-builder\u2019 n\u00eb emrin e k\u00ebtij imazhi.<\/p>\n<p>Imazhi i dyt\u00eb, react-web-app-runtime, do t\u00eb jet\u00eb rezultati i bashkimit t\u00eb nginx-image-runtime dhe disa skedar\u00ebve nga imazhi react-web-app-builder. Ky imazh gjithashtu do t\u00eb p\u00ebrdoret n\u00eb shp\u00ebrndarje dhe do t\u00eb p\u00ebrmbaj\u00eb vet\u00ebm serverin e webit dhe HTML, JavaScript, CSS statik t\u00eb aplikacionit ton\u00eb.<\/p>\n<p>E komplikuar? Tani le t\u00eb shikojm\u00eb konfiguracionet e nd\u00ebrtimit dhe do t\u00eb b\u00ebhet pak m\u00eb e qart\u00eb.<\/p>\n<p>N\u00eb shabllonin ton\u00eb ka dy konfiguracione nd\u00ebrtimi. Ja e para, dhe \u00ebsht\u00eb mjaft standarde:<\/p>\n<pre><code class=\"plaintext\">  apiVersion: v1\n  kind: BuildConfig\n  metadata:\n    name: react-web-app-builder\n  spec:\n    output:\n      to:\n        kind: ImageStreamTag\n        name: react-web-app-builder:latest \/\/ 1\n    source:   \/\/ 2 \n      git:\n        uri: ${SOURCE_REPOSITORY_URL}\n        ref: ${SOURCE_REPOSITORY_REF}\n      contextDir: ${SOURCE_REPOSITORY_DIR}\n      type: Git\n    strategy:\n      sourceStrategy:\n        env:\n          - name: OUTPUT_DIR \/\/ 3 \n            value: ${OUTPUT_DIR}\n        from:\n          kind: ImageStreamTag\n          name: web-app-builder-runtime:latest \/\/ 4\n        incremental: true \/\/ 5\n      type: Source\n    triggers: \/\/ 6\n    - github:\n        secret: ${GITHUB_WEBHOOK_SECRET}\n      type: GitHub\n    - type: ConfigChange\n    - imageChange: {}\n      type: ImageChange\n<\/code><\/pre>\n<p>\nSi\u00e7 e shohim, linja me etiket\u00eb 1 tregon se rezultati i k\u00ebtij nd\u00ebrtimi do t\u00eb vendoset n\u00eb at\u00eb imazhin e react-web-app-builder, t\u00eb cilin e pam\u00eb pak m\u00eb her\u00ebt n\u00eb seksionin e ImageStream-eve.<\/p>\n<p>Linja me etiket\u00eb 2 tregon se nga ku do t\u00eb merret kodi. N\u00eb rastin ton\u00eb, ky \u00ebsht\u00eb nj\u00eb repository git, dhe lokacioni, ref dhe folderi i kontekstit p\u00ebrcaktohen nga parametrat q\u00eb i kemi par\u00eb m\u00eb sip\u00ebr.<\/p>\n<p>Linja me etiket\u00eb 3 \u2013 k\u00ebt\u00eb e kemi par\u00eb m\u00eb her\u00ebt n\u00eb seksionin e parametrave. Ajo shton nj\u00eb variab\u00ebl ambienti OUTPUT_DIR, e cila n\u00eb shembullin ton\u00eb \u00ebsht\u00eb e barabart\u00eb me build.<br \/>\nLinja me etiket\u00eb 4 thot\u00eb t\u00eb p\u00ebrdorim imazhin web-app-builder-runtime, t\u00eb cilin e kemi par\u00eb m\u00eb her\u00ebt n\u00eb seksionin e ImageStream.<\/p>\n<p>Linja me etiket\u00eb 5 thot\u00eb q\u00eb duam t\u00eb p\u00ebrdorim nj\u00eb nd\u00ebrtim inkremental, n\u00ebse imazhi S2I e mb\u00ebshtet at\u00eb, dhe imazhi Web App Builder e mb\u00ebshtet. N\u00eb fillim, pas p\u00ebrfundimit t\u00eb faz\u00ebs s\u00eb asambles\u00eb, imazhi do t\u00eb ruaj\u00eb folderin node_modules n\u00eb nj\u00eb skedar arkiv. M\u00eb pas, gjat\u00eb startimeve t\u00eb ardhshme, imazhi do thjesht ta zb\u00ebrthej\u00eb k\u00ebt\u00eb folder p\u00ebr t\u00eb shkurtuar koh\u00ebn e nd\u00ebrtimit.<\/p>\n<p>Dhe, n\u00eb fund, linja me etiket\u00eb 6 \u2013 jan\u00eb disa trigera q\u00eb lejojn\u00eb nd\u00ebrtimin t\u00eb filloj\u00eb automatikisht, pa nd\u00ebrhyrje manuale, kur ndodhin ndryshime.<\/p>\n<p>N\u00eb t\u00ebr\u00ebsi, kjo \u00ebsht\u00eb nj\u00eb konfiguracion nd\u00ebrtimi mjaft standard.<\/p>\n<p>Tani le t\u00eb shikojm\u00eb konfigurimin e dyt\u00eb t\u00eb nd\u00ebrtimit. Ai \u00ebsht\u00eb shum\u00eb t\u00eb ngjash\u00ebm me t\u00eb parin, por ka nj\u00eb dallim t\u00eb r\u00ebnd\u00ebsish\u00ebm.<\/p>\n<pre><code class=\"plaintext\">apiVersion: v1\n  kind: BuildConfig\n  metadata:\n    name: react-web-app-runtime\n  spec:\n    output:\n      to:\n        kind: ImageStreamTag\n        name: react-web-app-runtime:latest \/\/ 1\n    source: \/\/ 2\n      type: Image\n      images:                              \n        - from:\n            kind: ImageStreamTag\n            name: react-web-app-builder:latest \/\/ 3\n          paths:\n            - sourcePath: \/opt\/app-root\/output\/.  \/\/ 4\n              destinationDir: .  \/\/ 5\n             \n    strategy: \/\/ 6\n      sourceStrategy:\n        from:\n          kind: ImageStreamTag\n          name: nginx-image-runtime:latest\n        incremental: true\n      type: Source\n    triggers:\n    - github:\n        secret: ${GITHUB_WEBHOOK_SECRET}\n      type: GitHub\n    - type: ConfigChange\n    - type: ImageChange\n      imageChange: {}\n    - type: ImageChange\n      imageChange:\n        from:\n          kind: ImageStreamTag\n          name: react-web-app-builder:latest \/\/ 7\n<\/code><\/pre>\n<p>\nPra, konfigurimi i dyt\u00eb i nd\u00ebrtimit \u2013 react-web-app-runtime, dhe ai fillon mjaft standard.<\/p>\n<p>N\u00eb linj\u00ebn me etiket\u00eb 1 nuk ka asgj\u00eb t\u00eb re \u2013 thjesht thot\u00eb se rezultati i nd\u00ebrtimit vendoset n\u00eb imazhin react-web-app-runtime.<\/p>\n<p>Rreshtia me etiket\u00eb 2, ashtu si n\u00eb konfigurimin e m\u00ebparsh\u00ebm, tregon nga e ku duhet t\u00eb marr\u00ebsh kodin burimor. Por kushtojini v\u00ebmendje, k\u00ebtu flasim se ai merret nga imazhi. P\u00ebr m\u00eb tep\u00ebr, nga ai imazh q\u00eb sapo krijuam \u2013 nga react-web-app-builder (i p\u00ebrmendur n\u00eb rreshtin me etiket\u00eb 3). Skedar\u00ebt q\u00eb d\u00ebshirojm\u00eb t\u00eb p\u00ebrdorim jan\u00eb brenda imazhit dhe vendndodhja e tyre aty caktohet n\u00eb rreshtin me etiket\u00eb 4, n\u00eb rastin ton\u00eb \u00ebsht\u00eb \/opt\/app-root\/output\/. N\u00ebse e mbani mend, pik\u00ebrisht aty vendosen skedar\u00ebt e gjeneruar nga rezultatet e nd\u00ebrtimit t\u00eb aplikacionit ton\u00eb.<\/p>\n<p>Dosja e destinacionit, e cila caktohet n\u00eb rreshtin me etiket\u00eb 5 \u2013 \u00ebsht\u00eb thjesht katalogu aktual (kjo gjith\u00e7ka, kujtojm\u00eb, funksionon brenda nj\u00eb gj\u00ebje magjike t\u00eb quajtur OpenShift, e jo n\u00eb kompjuterin tuaj lokal).<\/p>\n<p>Sekcioni strategji \u2013 rreshti me etiket\u00eb 6 \u2013 ashtu si n\u00eb konfigurimin e par\u00eb t\u00eb nd\u00ebrtimit. Vet\u00ebm k\u00ebsaj here ne do t\u00eb p\u00ebrdorim nginx-image-runtime, t\u00eb cilin e kemi par\u00eb tashm\u00eb n\u00eb seksionin ImageStream.<\/p>\n<p>Finalmente, rreshti me etiket\u00eb 7 \u2013 \u00ebsht\u00eb seksioni i aktivizuesve, i cili aktivizon k\u00ebt\u00eb nd\u00ebrtim sa her\u00eb q\u00eb ndryshohet imazhi react-web-app-builder.<\/p>\n<p>Nga ana tjet\u00ebr, ky model p\u00ebrmban nj\u00eb konfigurim t\u00eb standardizuar t\u00eb shp\u00ebrndarjes, si dhe gj\u00ebra q\u00eb lidhen me sh\u00ebrbimet dhe rrug\u00ebt, por ne nuk do t\u00eb thellohemi n\u00eb k\u00ebt\u00eb. Kushtoni v\u00ebmendje se imazhi q\u00eb do t\u00eb shp\u00ebrndahet\u2013 \u00ebsht\u00eb imazhi react-web-app-runtime.<\/p>\n<h3>Zhvillimi i aplikacionit<\/h3>\n<p>\nPrandaj, pasi t\u00eb kemi par\u00eb modelin, le t\u00eb shohim se si ta p\u00ebrdorim at\u00eb p\u00ebr t\u00eb shp\u00ebrndar\u00eb aplikacionin.<\/p>\n<p>Ne mund t\u00eb p\u00ebrdorim mjetin klient t\u00eb OpenShift t\u00eb quajtur oc, p\u00ebr t\u00eb shp\u00ebrndar\u00eb modelin ton\u00eb:<\/p>\n<pre><code class=\"plaintext\">$ find . | grep openshiftio | grep application | xargs -n 1 oc apply -f\n\n$ oc new-app --template react-web-app -p SOURCE_REPOSITORY_URL=https:\/\/github.com\/lholmquist\/react-web-app\n<\/code><\/pre>\n<p>\nKomanda e par\u00eb n\u00eb ekranin m\u00eb sip\u00ebr \u2013 \u00ebsht\u00eb nj\u00eb m\u00ebnyr\u00eb inxhinierike p\u00ebr t\u00eb gjetur modelin .\/openshiftio\/application.yaml.<\/p>\n<p>Komanda e dyt\u00eb thjesht krijon nj\u00eb aplikacion t\u00eb ri mbi k\u00ebt\u00eb model.<\/p>\n<p>Pasi t\u00eb funksionojn\u00eb k\u00ebto urdhra, do t\u00eb shohim se kemi dy nd\u00ebrtime:<\/p>\n<p><img decoding=\"async\" alt=\"Aplikacionet moderne n\u00eb OpenShift, pjesa 2: nd\u00ebrlidhja e nd\u00ebrtimeve t\u00eb varura\" src=\"\/wp-content\/uploads\/2020\/08\/c6b2b2fcadfcd3e5a8a2adb4eff69bf2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Dhe duke u kthyer n\u00eb ekranin Overview, do t\u00eb shohim pod-in q\u00eb \u00ebsht\u00eb aktivizuar:<\/p>\n<p><img decoding=\"async\" alt=\"Aplikacionet moderne n\u00eb OpenShift, pjesa 2: nd\u00ebrlidhja e nd\u00ebrtimeve t\u00eb varura\" src=\"\/wp-content\/uploads\/2020\/08\/983fab3029d222555dc13790d4a3e70f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Nj\u00eb klikim n\u00eb link \u2013 dhe ne do t\u00eb kalojm\u00eb n\u00eb aplikacionin ton\u00eb, i cili p\u00ebrb\u00ebhet nga faqja e aplikacionit React App nga defaulti:<\/p>\n<p><img decoding=\"async\" alt=\"Aplikacionet moderne n\u00eb OpenShift, pjesa 2: nd\u00ebrlidhja e nd\u00ebrtimeve t\u00eb varura\" src=\"\/wp-content\/uploads\/2020\/08\/d5b658875e0e865bf456955aaac15464.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Shtes\u00eb 1<\/h3>\n<p>\nP\u00ebr adhuruesit e Angular, kemi gjithashtu <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lholmquist\/angular-web-app\">nj\u00eb shembuj t\u00eb aplikacionit<\/a><\/noindex>.<\/p>\n<p>Modeli k\u00ebtu \u00ebsht\u00eb i nj\u00ebjt\u00eb, me p\u00ebrjashtim t\u00eb ndryshore OUTPUT_DIR.<\/p>\n<h3>Shtesa 2<\/h3>\n<p>\nN\u00eb k\u00ebt\u00eb artikull ne p\u00ebrdor\u00ebm si server web NGINX, por \u00ebsht\u00eb mjaft e leht\u00eb ta z\u00ebvend\u00ebsojm\u00eb me Apache, thjesht duke ndryshuar n\u00eb skedarin e modelit <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lholmquist\/react-web-app\/blob\/master\/.openshiftio\/application.yaml#L66\">imazhi NGINX<\/a><\/noindex> n\u00eb <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/centos\/httpd-24-centos7\/\">imazhi Apache<\/a><\/noindex>.<\/p>\n<h3>P\u00ebrfundimi<\/h3>\n<p>\nN\u00eb pjes\u00ebn e par\u00eb t\u00eb k\u00ebsaj serie ne treguam se si t\u00eb shp\u00ebrndajm\u00eb shpejt aplikacione moderne web n\u00eb platform\u00ebn OpenShift. Sot, kemi shqyrtuar se \u00e7far\u00eb b\u00ebn imazhi Web App dhe si mund t\u00eb kombinohet me nj\u00eb server web t\u00eb past\u00ebr si NGINX p\u00ebrmes nd\u00ebrtimeve t\u00eb lidhura (chained build) p\u00ebr t\u00eb organizuar nj\u00eb nd\u00ebrtim m\u00eb t\u00eb p\u00ebrshtatsh\u00ebm p\u00ebr kushtet e prodhimit. N\u00eb artikullin e ardhsh\u00ebm, p\u00ebrfundimtar t\u00eb k\u00ebsaj serie, ne do t\u00eb tregojm\u00eb se si t\u00eb aktivizoni n\u00eb OpenShift serverin e zhvillimit p\u00ebr aplikacionin tuaj dhe t\u00eb sigurojm\u00eb sinkronizimin e skedar\u00ebve lokal\u00eb dhe atyre t\u00eb larg\u00ebt.<\/p>\n<h3>P\u00ebrmbajtja e k\u00ebsaj serie artikujsh<\/h3>\n<p><\/p>\n<ul>\n<li>Pjesa 1: <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/511954\/\">si t\u00eb shp\u00ebrndajm\u00eb aplikacione moderne web n\u00eb vet\u00ebm disa hapa<\/a><\/noindex>;<\/li>\n<li>Pjesa 2: si t\u00eb aplikoni imazhin e ri S2I s\u00eb bashku me imazhin ekzistues t\u00eb serverit HTTP, si NGINX, duke p\u00ebrdorur nd\u00ebrtimet e lidhura OpenShift, p\u00ebr t\u00eb organizuar shp\u00ebrndarjen e prodhimit;<\/li>\n<li>Pjesa 3: si t\u00eb aktivizoni n\u00eb platform\u00ebn OpenShift serverin e zhvillimit p\u00ebr aplikacionin tuaj dhe ta sinkronizoni at\u00eb me sistemin e skedar\u00ebve lokal.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Burime shtes\u00eb<\/h3>\n<p><\/p>\n<ul>\n<li>E-lib\u00ebr falas <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/books\/deploying-openshift\">Duke shp\u00ebrndar\u00eb n\u00eb OpenShift<\/a><\/noindex>.<\/li>\n<li>Informacione p\u00ebr <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/kubernetes\/\">OpenShift dhe Kubernetes<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>Burimi: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/513948\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u0421 \u0432\u0430\u043c\u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0441\u0442 \u0438\u0437 \u043d\u0430\u0448\u0435\u0439 \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 \u043d\u0430 Red Hat OpenShift \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f. \u0412 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0435\u043c \u043f\u043e\u0441\u0442\u0435 \u043c\u044b \u0441\u043b\u0435\u0433\u043a\u0430 \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u043b\u0438 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u043d\u043e\u0432\u043e\u0433\u043e builder-\u043e\u0431\u0440\u0430\u0437\u0430 S2I (source-to-image), \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d \u0434\u043b\u044f \u0441\u0431\u043e\u0440\u043a\u0438 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0439 \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 OpenShift. \u0422\u043e\u0433\u0434\u0430 \u043d\u0430\u0441 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043e\u0432\u0430\u043b\u0430 \u0442\u0435\u043c\u0430 \u0431\u044b\u0441\u0442\u0440\u043e\u0433\u043e \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f, \u0430 \u0441\u0435\u0433\u043e\u0434\u043d\u044f \u043c\u044b \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c, \u043a\u0430\u043a [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":90875,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-90874","post","type-post","status-publish","format-standard","has-post-thumbnail","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=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u0421 \u0432\u0430\u043c\u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0441\u0442 \u0438\u0437 \u043d\u0430\u0448\u0435\u0439 \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 \u043d\u0430 Red Hat OpenShift \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\" \/>\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-2-svyazannye-sborki-chained-builds\" \/>\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\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 2: \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 chained builds | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u0421 \u0432\u0430\u043c\u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0441\u0442 \u0438\u0437 \u043d\u0430\u0448\u0435\u0439 \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 \u043d\u0430 Red Hat OpenShift \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-2-svyazannye-sborki-chained-builds\" \/>\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-06T23:42:20+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-06T23:42:20+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\udd47Aplikacione moderne n\u00eb OpenShift, pjesa 2: nd\u00ebrtimet e lidhura chained builds | ProHoster","description":"P\u00ebrsh\u00ebndetje t\u00eb gjith\u00ebve! Ky \u00ebsht\u00eb postimi yn\u00eb i dyt\u00eb nga seria ku ne tregojm\u00eb si t\u00eb drejtojm\u00eb aplikacione moderne web n\u00eb Red Hat OpenShift.","canonical_url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-2-svyazannye-sborki-chained-builds","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 2: \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 chained builds | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442! \u0421 \u0432\u0430\u043c\u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u043f\u043e\u0441\u0442 \u0438\u0437 \u043d\u0430\u0448\u0435\u0439 \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 \u043d\u0430 Red Hat OpenShift \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.","og:url":"https:\/\/prohoster.info\/sq\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-2-svyazannye-sborki-chained-builds","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-06T23:42:20+00:00","article:modified_time":"2020-08-06T23:42:20+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"90874","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:40:03","updated":"2022-10-04 00:42:31","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\/90874","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=90874"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/posts\/90874\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media\/90875"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/media?parent=90874"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/categories?post=90874"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sq\/wp-json\/wp\/v2\/tags?post=90874"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}