{"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":"Aplikacione moderne n\u00eb OpenShift, pjesa 2: nd\u00ebrtimet e lidhura t\u00eb nd\u00ebrtimeve t\u00eb zinxhirit","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>P\u00ebrsh\u00ebndetje! Ky \u00ebsht\u00eb postimi i dyt\u00eb n\u00eb serin\u00eb ton\u00eb, ku tregojm\u00eb si t\u00eb zhvilloni aplikacione moderne web n\u00eb Red Hat OpenShift. <\/p>\n<p><img decoding=\"async\" alt=\"Aplikacione moderne n\u00eb OpenShift, pjesa 2: nd\u00ebrtimet e lidhura t\u00eb nd\u00ebrtimeve t\u00eb zinxhirit\" src=\"\/wp-content\/uploads\/2020\/08\/b1f6ae855a69597c6e86c5198e4a628c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nN\u00eb postimin e m\u00ebparsh\u00ebm, ne p\u00ebrm\u00ebnd\u00ebm n\u00eb m\u00ebnyr\u00eb t\u00eb leht\u00eb mund\u00ebsit\u00eb e reja t\u00eb builder-image S2I (source-to-image), i cili \u00ebsht\u00eb i destinuar p\u00ebr nd\u00ebrtimin dhe zhvillimin e aplikacioneve moderne web n\u00eb platform\u00ebn OpenShift. At\u00ebher\u00eb na interesonte tema e zhvillimit t\u00eb shpejt\u00eb t\u00eb aplikacioneve, nd\u00ebrsa sot do t\u00eb shqyrtojm\u00eb si ta p\u00ebrdorim S2I-image si nj\u00eb 'builder' t\u00eb past\u00ebr dhe ta kombinojm\u00eb me nd\u00ebrlidhjet OpenShift.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Builder-i i past\u00ebr<\/h3>\n<p>\nSi\u00e7 e p\u00ebrm\u00ebnd\u00ebm n\u00eb pjes\u00ebn e par\u00eb, shumica e aplikacioneve moderne web kan\u00eb nj\u00eb faz\u00eb nd\u00ebrtimi, ku zakonisht kryhen operacione t\u00eb tilla si transpiling i kodit, konkatencionimi i disa skedave dhe minimizimi. Skedar\u00ebt e marr\u00eb nga k\u00ebto operacione \u2013 q\u00eb p\u00ebrfshijn\u00eb HTML statik, JavaScript dhe CSS \u2013 vendosen n\u00eb folderin output. Lokacioni i k\u00ebtij folderi zakonisht varet nga mjetet e nd\u00ebrtimit q\u00eb p\u00ebrdoren, dhe p\u00ebr React do t\u00eb jet\u00eb folderi .\/build (do t\u00eb kthehemi n\u00eb k\u00ebt\u00eb \u00e7\u00ebshtje m\u00eb posht\u00eb).<\/p>\n<h4>Source-to-Image (S2I)<\/h4>\n<p>\nN\u00eb k\u00ebt\u00eb postim ne nuk do t\u00eb flasim fare p\u00ebr tem\u00ebn '\u00e7far\u00eb \u00ebsht\u00eb S2I dhe si ta p\u00ebrdorim' (p\u00ebr m\u00eb shum\u00eb mund t\u00eb lexoni <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 q\u00eb t\u00eb kuptoni qart\u00eb dy fazat e k\u00ebtij procesi, p\u00ebr t\u00eb kuptuar se \u00e7far\u00eb b\u00ebn imazhi Web App Builder.<\/p>\n<h4>Faza e asambles\u00eb (assemble phase)<\/h4>\n<p>\nFaza e asambles\u00eb, n\u00eb thelb, \u00ebsht\u00eb shum\u00eb e ngjashme me at\u00eb q\u00eb ndodh kur ju b\u00ebni docker build dhe si rezultat merrni nj\u00eb Docker-image t\u00eb ri. Prandaj, kjo faz\u00eb ndodh kur nisni nj\u00eb nd\u00ebrtim n\u00eb platform\u00ebn OpenShift.<\/p>\n<p>N\u00eb rastin e imazhit Web App Builder, p\u00ebrgjegj\u00ebsia p\u00ebr instalimin e var\u00ebsive t\u00eb aplikacionit tuaj dhe nisjen e nd\u00ebrtimit i takon <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bucharest-gold\/centos7-s2i-web-app\/blob\/master\/s2i\/assemble#L47\">assemble script<\/a><\/noindex>. Si parazgjedhje, builder-image p\u00ebrdor struktur\u00ebn npm run build, por kjo mund t\u00eb anulohet p\u00ebrmes variablit t\u00eb mjedisit NPM_BUILD.<\/p>\n<p>Si\u00e7 e tham\u00eb m\u00eb par\u00eb, vendndodhja e aplikacionit t\u00eb gatsh\u00ebm, tashm\u00eb t\u00eb nd\u00ebrtuar, varet nga cilat mjete p\u00ebrdoren. P\u00ebr shembull, n\u00eb rastin e React, 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 katalogut t\u00eb output-it, i cili n\u00eb m\u00ebnyr\u00eb default \u00ebsht\u00eb caktuar si build, mund t\u00eb ndryshohet p\u00ebrmes variablit t\u00eb mjedisit OUTPUT_DIR. Dhe p\u00ebr shkak se vendndodhja e dosjes s\u00eb output-it ndryshon nga nj\u00eb framework n\u00eb nj\u00eb tjet\u00ebr, thjesht e kopjoni output-in e gjeneruar n\u00eb dosjen standarde n\u00eb imazh, pra n\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\u00ebrkoh\u00eb, le t\u00eb shikojm\u00eb shpejt faz\u00ebn tjet\u00ebr \u2013 faz\u00ebn e ekzekutimit (run phase).<\/p>\n<h4>Faza e ekzekutimit (run phase)<\/h4>\n<p>\nKjo faz\u00eb ndodh kur b\u00ebhet thirrje docker run p\u00ebr nj\u00eb imazh t\u00eb ri, t\u00eb krijuar n\u00eb faz\u00ebn e nd\u00ebrtimit. Ajo ndodh gjithashtu gjat\u00eb implementimit n\u00eb platform\u00ebn OpenShift. N\u00eb m\u00ebnyr\u00eb default <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bucharest-gold\/centos7-s2i-web-app\/blob\/master\/s2i\/run\">skriptin e aktivizimit<\/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 q\u00eb ndodhet n\u00eb katalogun e output-it standard t\u00eb p\u00ebrmendur m\u00eb lart.<\/p>\n<p>Ky metod \u00ebsht\u00eb i mir\u00eb p\u00ebr implementimin e shpejt\u00eb t\u00eb aplikacioneve, por n\u00eb t\u00eb v\u00ebrtet\u00eb, nuk rekomandohet t\u00eb sh\u00ebrbehet p\u00ebrmbajtje statike n\u00eb k\u00ebt\u00eb m\u00ebnyr\u00eb. Duke qen\u00eb se ne n\u00eb t\u00eb v\u00ebrtet\u00eb po sh\u00ebrbejm\u00eb vet\u00ebm p\u00ebrmbajtje statike, Node.js i instaluar brenda imazhit ton\u00eb nuk \u00ebsht\u00eb i nevojsh\u00ebm \u2013 nj\u00eb server web do t\u00eb ishte mjaft.<\/p>\n<p>Me fjal\u00eb t\u00eb tjera, gjat\u00eb nd\u00ebrtimit na nevojitet nj\u00eb gj\u00eb, nd\u00ebrsa gjat\u00eb ekzekutimit \u2013 di\u00e7ka tjet\u00ebr. N\u00eb nj\u00eb situat\u00eb t\u00eb till\u00eb do t\u00eb dobishen nd\u00ebrtimet e lidhura (chained builds).<\/p>\n<h3>Nd\u00ebrtime t\u00eb lidhura (chained builds)<\/h3>\n<p>\nJa \u00e7far\u00eb thon\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 e OpenShift:<\/p>\n<blockquote><p>\u00abDy nd\u00ebrtimet mund t\u00eb lidhen me nj\u00ebra-tjetr\u00ebn, ku nj\u00ebra gjeneron nj\u00eb entitet t\u00eb p\u00ebrpiluar dhe tjetra vendos k\u00ebt\u00eb entitet n\u00eb nj\u00eb imazh t\u00eb ve\u00e7ant\u00eb, i cili p\u00ebrdoret p\u00ebr t\u00eb ekzekutuar k\u00ebt\u00eb entitet\u00bb.\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 ekzekutuar nd\u00ebrtimin ton\u00eb, dhe pastaj t\u00eb p\u00ebrdorim imazhin e serverit web, t\u00eb nj\u00ebjtin 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 \u2018t\u00eb past\u00ebr\u2019 builder dhe n\u00eb t\u00eb nj\u00ebjt\u00ebn koh\u00eb t\u00eb kemi nj\u00eb imazh runtime t\u00eb vog\u00ebl.<\/p>\n<p>Tani le t\u00eb analizojm\u00eb k\u00ebt\u00eb me nj\u00eb shembull konkret.<\/p>\n<p>P\u00ebr st\u00ebrvitje 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>, t\u00eb krijuar me ndihm\u00ebn e mjetit t\u00eb komand\u00ebs create-react-app.<\/p>\n<p>T\u00eb gjitha s\u00eb bashku do t\u00eb na ndihmoj\u00eb <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 analizojm\u00eb m\u00eb n\u00eb detaje k\u00ebt\u00eb skedar dhe t\u00eb fillojm\u00eb me seksionin e parametrave.<\/p>\n<pre><code class=\"plaintext\">parametrat:\n  - emri: SOURCE_REPOSITORY_URL\n    p\u00ebrshkrimi: URL-ja burimore p\u00ebr aplikacionin\n    emri i shfaqjes: URL Burimor\n    e k\u00ebrkuar: e v\u00ebrtet\u00eb\n  - emri: SOURCE_REPOSITORY_REF\n    p\u00ebrshkrimi: Emri i deg\u00ebs p\u00ebr aplikacionin\n    emri i shfaqjes: Dega Burimore\n    vlera: master\n    e k\u00ebrkuar: e v\u00ebrtet\u00eb\n  - emri: SOURCE_REPOSITORY_DIR\n    p\u00ebrshkrimi: Lokacioni brenda repo-s burimore t\u00eb aplikacionit\n    emri i shfaqjes: Dosja Burimore\n    vlera: .\n    e k\u00ebrkuar: e v\u00ebrtet\u00eb\n  - emri: OUTPUT_DIR\n    p\u00ebrshkrimi: Lokacioni i skedave statike t\u00eb kompiluar nga nd\u00ebrtuesi i aplikacioneve tuaja\n    emri i shfaqjes: Dosja e Daljes\n    vlera: nd\u00ebrtim\n    e k\u00ebrkuar: e gabuar\n<\/code><\/pre>\n<p>\nK\u00ebtu gjith\u00e7ka \u00ebsht\u00eb mjaft e qart\u00eb, por duhen kushtuar v\u00ebmendje parametrave OUTPUT_DIR. P\u00ebr aplikacionin React nga shembulli yn\u00eb nuk ka \u00e7far\u00eb t\u00eb shqet\u00ebsohemi, pasi React p\u00ebrdor si vler\u00eb t\u00eb daljes dosjen standarde, nd\u00ebrsa n\u00eb rastin e Angular ose ndonj\u00eb gj\u00ebje tjet\u00ebr, ky paramet\u00ebr do t\u00eb duhet t\u00eb ndryshohet n\u00eb m\u00ebnyr\u00eb t\u00eb duhur.<\/p>\n<p>Tani le t\u00eb shohim seksionin e ImageStream-\u00ebve.<\/p>\n<pre><code class=\"plaintext\">- apiVersion: v1\n  lloji: ImageStream\n  metadata:\n    emri: react-web-app-builder  \/\/ 1 \n  spec: {}\n- apiVersion: v1\n  lloji: ImageStream\n  metadata:\n    emri: react-web-app-runtime  \/\/ 2 \n  spec: {}\n- apiVersion: v1\n  lloji: ImageStream\n  metadata:\n    emri: web-app-builder-runtime \/\/ 3\n  spec:\n    etiketat:\n    - emri: latest\n      nga:\n        lloji: DockerImage\n        emri: nodeshift\/ubi8-s2i-web-app:10.x\n- apiVersion: v1\n  lloji: ImageStream\n  metadata:\n    emri: nginx-image-runtime \/\/ 4\n  spec:\n    etiketat:\n    - emri: latest\n      nga:\n        lloji: DockerImage\n        emri: 'centos\/nginx-112-centos7:latest'\n<\/code><\/pre>\n<p>\nShikoni imazhet e tret\u00eb dhe t\u00eb kat\u00ebrt. T\u00eb dy jan\u00eb t\u00eb p\u00ebrcaktuar si imazhe Docker dhe \u00ebsht\u00eb qart\u00eb se nga po vijn\u00eb.<\/p>\n<p>Imazhi i tret\u00eb \u2013 \u00ebsht\u00eb web-app-builder, dhe ai vjen nga nodeshift\/ubi8-s2i-web-app me etiket\u00eb 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>I kat\u00ebrti \u2013 \u00ebsht\u00eb imazhi NGINX (versioni 1.12) me etiket\u00eb 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 shohim dy imazhet e para. T\u00eb dy jan\u00eb bosh n\u00eb fillim dhe krijohen vet\u00ebm gjat\u00eb faz\u00ebs s\u00eb nd\u00ebrtimit. Imazhi i par\u00eb \u2013 react-web-app-builder \u2013 do t\u00eb jet\u00eb rezultati i faz\u00ebs s\u00eb assemblimit, e cila do t\u00eb bashkoj\u00eb imazhin web-app-builder-runtime dhe kodin ton\u00eb burimor. Kjo \u00ebsht\u00eb arsyeja pse e kemi p\u00ebrfshir\u00eb '-builder' n\u00eb emrin e k\u00ebtij imazhi.<\/p>\n<p>Imazhi i dyt\u00eb \u2013 react-web-app-runtime \u2013 do t\u00eb jet\u00eb rezultat i bashkimit t\u00eb nginx-image-runtime dhe disa skedave nga imazhi react-web-app-builder. Ky imazh gjithashtu do t\u00eb p\u00ebrdoret gjat\u00eb implementimit dhe do t\u00eb p\u00ebrmbaj\u00eb vet\u00ebm serverin web dhe HTML statik, JavaScript, CSS t\u00eb aplikacionit ton\u00eb.<\/p>\n<p>E ngat\u00ebrruar? Tani le t\u00eb shohim konfigurimet 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 konfigurime t\u00eb nd\u00ebrtimit. 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 \n    source:   \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 \n            value: ${OUTPUT_DIR}\n        from:\n          kind: ImageStreamTag\n          name: web-app-builder-runtime:latest \n        incremental: true \n      type: Source\n    triggers: \n    - github:\n        secret: ${GITHUB_WEBHOOK_SECRET}\n      type: GitHub\n    - type: ConfigChange\n    - imageChange: {}\n      type: ImageChange\n<\/code><\/pre>\n<p>\nSi e shohim, rreshti me etiketen 1 tregon se rezultati i k\u00ebsaj nd\u00ebrtese do t\u00eb vendoset n\u00eb at\u00eb imazh react-web-app-builder, t\u00eb cilin e pam\u00eb m\u00eb par\u00eb n\u00eb seksionin e ImageStream-eve.<\/p>\n<p>Rreshti me etiketen 2 tregon nga ku t\u00eb merrni kodin. N\u00eb rastin ton\u00eb, kjo \u00ebsht\u00eb nj\u00eb depo git, dhe vendndodhja, ref dhe dosja e kontekstit jan\u00eb t\u00eb p\u00ebrcaktuara nga parametrat q\u00eb i pam\u00eb m\u00eb lart.<\/p>\n<p>Rreshti me etiketen 3 \u2013 e kemi par\u00eb tashm\u00eb n\u00eb seksionin e parametrave. Ajo shton nj\u00eb variab\u00ebl ambienti OUTPUT_DIR, q\u00eb n\u00eb shembullin ton\u00eb \u00ebsht\u00eb e barabart\u00eb me build.<br \/>\nRreshti me etiketen 4 tregon t\u00eb p\u00ebrdoret imazhi web-app-builder-runtime, q\u00eb e kemi par\u00eb m\u00eb par\u00eb n\u00eb seksionin e ImageStream.<\/p>\n<p>Rreshti me etiketen 5 tregon se ne duam t\u00eb p\u00ebrdorim nd\u00ebrtimin 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 dosjen node_modules n\u00eb nj\u00eb skedar zip. Pastaj, n\u00eb startet pasuese, imazhi do t\u00eb thjesht deshifroj\u00eb k\u00ebt\u00eb dosje p\u00ebr t\u00eb shkurtuar koh\u00ebn e nd\u00ebrtimit.<\/p>\n<p>Dhe, p\u00ebrfundimisht, rreshti me etiketen 6 \u2013 jan\u00eb thjesht disa triggera, q\u00eb nd\u00ebrtimi t\u00eb filloj\u00eb automatikisht, pa nd\u00ebrhyrje manuale, kur ndonj\u00eb gj\u00eb ndryshon.<\/p>\n<p>N\u00eb p\u00ebrgjith\u00ebsi, kjo \u00ebsht\u00eb nj\u00eb konfigurim nd\u00ebrtimi mjaft standard.<\/p>\n<p>Tani le t\u00eb shohim konfigurimin e dyt\u00eb t\u00eb nd\u00ebrtimit. Ai \u00ebsht\u00eb shum\u00eb i ngjash\u00ebm me t\u00eb parin, por ka nj\u00eb ndryshim 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 \n    source: \n      type: Image\n      images:                              \n        - from:\n            kind: ImageStreamTag\n            name: react-web-app-builder:latest \n          paths:\n            - sourcePath: \/opt\/app-root\/output\/. \n              destinationDir: .  \n    strategy: \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\n<\/code><\/pre>\n<p>\nPra ndaj, konfigurimi i dyt\u00eb i nd\u00ebrtimit \u2013 react-web-app-runtime, fillon mjaft standardisht.<\/p>\n<p>N\u00eb vargun me etiket\u00ebn 1 nuk ka asgj\u00eb t\u00eb re \u2013 thjesht thot\u00eb q\u00eb rezultati i nd\u00ebrtimit vendoset n\u00eb imazhin react-web-app-runtime.<\/p>\n<p>Vargu me etiket\u00ebn 2, si n\u00eb konfigurimin e m\u00ebparsh\u00ebm, tregon nga ku do t\u00eb merret kodi burimor. Por vini re se k\u00ebtu po themi se merret nga imazhi. Pra, nga imazhi q\u00eb sapo krijuam \u2013 nga react-web-app-builder (i cituar n\u00eb vargun me etiket\u00ebn 3). Skedar\u00ebt q\u00eb duam t\u00eb p\u00ebrdorim ndodhen brenda imazhit dhe vendndodhja e tyre atje \u00ebsht\u00eb caktuar n\u00eb vargun me etiket\u00ebn 4, n\u00eb rastin ton\u00eb \u00ebsht\u00eb \/opt\/app-root\/output\/. Po t\u00eb kujtoni, pik\u00ebrisht aty vendosen skedar\u00ebt e gjeneruar nga rezultatet e nd\u00ebrtimit t\u00eb aplikacionit ton\u00eb.<\/p>\n<p>Folderi i destinacionit, i caktuar n\u00eb afatin me etiket\u00ebn 5 \u2013 \u00ebsht\u00eb thjesht katalogu aktual (kjo \u00ebsht\u00eb gjith\u00e7ka, kujtojm\u00eb, q\u00eb rrotullohet brenda nj\u00eb gj\u00ebje magjike t\u00eb quajtur OpenShift, dhe jo n\u00eb kompjuterin tuaj lokal).<\/p>\n<p>Sekcioni strategy \u2013 vargu me etiket\u00ebn 6 \u2013 \u00ebsht\u00eb gjithashtu i ngjash\u00ebm me konfigurimin e par\u00eb t\u00eb nd\u00ebrtimit. Vet\u00ebm k\u00ebt\u00eb her\u00eb do t\u00eb p\u00ebrdorim nginx-image-runtime, i cili \u00ebsht\u00eb par\u00eb tashm\u00eb n\u00eb seksionin ImageStream.<\/p>\n<p>N\u00eb fund, vargu me etiket\u00ebn 7 \u2013 \u00ebsht\u00eb seksioni i triggers, i cili aktivizon k\u00ebt\u00eb nd\u00ebrtim \u00e7do her\u00eb kur ndryshon imazhi react-web-app-builder.<\/p>\n<p>P\u00ebrndryshe, ky shabllon p\u00ebrmban nj\u00eb konfigurim mjaft standard 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. Vini re se imazhi q\u00eb do t\u00eb shp\u00ebrndahet \u2013 \u00ebsht\u00eb imazhi react-web-app-runtime.<\/p>\n<h3>Zbatimi i aplikacionit<\/h3>\n<p>\nPra, pasi kemi hedhur nj\u00eb v\u00ebshtrim n\u00eb shabllon, le t\u00eb shohim se si ta p\u00ebrdorim at\u00eb p\u00ebr t\u00eb shp\u00ebrndar\u00eb aplikacionin.<\/p>\n<p>Mund t\u00eb p\u00ebrdorim mjetin klient OpenShift t\u00eb quajtur oc, p\u00ebr t\u00eb shp\u00ebrndar\u00eb shabllonin 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 skrinin e m\u00ebsip\u00ebrm \u2013 \u00ebsht\u00eb nj\u00eb m\u00ebnyr\u00eb e q\u00ebllimshme inxhinierike p\u00ebr t\u00eb gjetur shabllonin .\/openshiftio\/application.yaml.<\/p>\n<p>Komanda e dyt\u00eb thjesht krijon nj\u00eb aplikacion t\u00eb ri mbi baz\u00ebn e k\u00ebtij shablloni.<\/p>\n<p>Pas p\u00ebrfundimit t\u00eb k\u00ebtyre komandave, do t\u00eb shohim se kemi dy nd\u00ebrtime:<\/p>\n<p><img decoding=\"async\" alt=\"Aplikacione moderne n\u00eb OpenShift, pjesa 2: nd\u00ebrtimet e lidhura t\u00eb nd\u00ebrtimeve t\u00eb zinxhirit\" 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 nisur:<\/p>\n<p><img decoding=\"async\" alt=\"Aplikacione moderne n\u00eb OpenShift, pjesa 2: nd\u00ebrtimet e lidhura t\u00eb nd\u00ebrtimeve t\u00eb zinxhirit\" src=\"\/wp-content\/uploads\/2020\/08\/983fab3029d222555dc13790d4a3e70f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Nj\u00eb klikim n\u00eb lidhje \u2013 dhe ne do t\u00eb kalojm\u00eb n\u00eb aplikacionin ton\u00eb, i cili p\u00ebrb\u00ebn nj\u00eb faqe aplikacioni React App sipas parazgjedhjes:<\/p>\n<p><img decoding=\"async\" alt=\"Aplikacione moderne n\u00eb OpenShift, pjesa 2: nd\u00ebrtimet e lidhura t\u00eb nd\u00ebrtimeve t\u00eb zinxhirit\" src=\"\/wp-content\/uploads\/2020\/08\/d5b658875e0e865bf456955aaac15464.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Shtesa 1<\/h3>\n<p>\nP\u00ebr adhuruesit e Angular kemi gjithashtu <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lholmquist\/angular-web-app\">shembulli i aplikacionit<\/a><\/noindex>.<\/p>\n<p>Shablloni k\u00ebtu \u00ebsht\u00eb i nj\u00ebjt\u00eb, p\u00ebrve\u00e7 variabl\u00ebs 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\u00ebsoni me Apache, thjesht ndryshoni n\u00eb skedarin e shabllonit <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\u00ebrfundim<\/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 ne shqyrtuam 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 me ndihm\u00ebn e nd\u00ebrtimeve t\u00eb lidhura (chained build) p\u00ebr t\u00eb krijuar nj\u00eb nd\u00ebrtim m\u00eb t\u00eb p\u00ebrshtatsh\u00ebm p\u00ebr kushte prodhimi. N\u00eb artikullin tjet\u00ebr, p\u00ebrfundimtar t\u00eb k\u00ebsaj serie, ne do t\u00eb tregojm\u00eb se si t\u00eb drejtoni nj\u00eb server zhvillimi p\u00ebr aplikacionin tuaj n\u00eb OpenShift 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 vet\u00ebm me 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 n\u00eb prodhim;<\/li>\n<li>Pjesa 3: si t\u00eb drejtoni nj\u00eb server zhvillimi n\u00eb platform\u00ebn OpenShift p\u00ebr aplikacionin tuaj dhe t\u00eb sinkronizoni me sistemin e skedar\u00ebve lokal.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Burime t\u00eb tjera<\/h3>\n<p><\/p>\n<ul>\n<li>Libri elektronik falas <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/books\/deploying-openshift\">Deploying to OpenShift<\/a><\/noindex>.<\/li>\n<li>Informacion n\u00eb lidhje me <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.2 - 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.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\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\udd47Aplikacionet moderne n\u00eb OpenShift, pjesa 2: nd\u00ebrtimet e lidhura chained builds | ProHoster","description":"P\u00ebrsh\u00ebndetje! Ky \u00ebsht\u00eb postimi i dyt\u00eb n\u00eb serin\u00eb ton\u00eb, ku tregojm\u00eb si t\u00eb zhvilloni 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}]}}