{"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\/sk\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-2-svyazannye-sborki-chained-builds","title":{"rendered":"Modern\u00e9 aplik\u00e1cie na OpenShift, \u010das\u0165 2: s\u00favisiace zostavy chained builds","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ahojte v\u0161etci! Toto je druh\u00fd pr\u00edspevok v na\u0161ej s\u00e9rii, v ktorej ukazujeme, ako nasadi\u0165 modern\u00e9 webov\u00e9 aplik\u00e1cie na Red Hat OpenShift. <\/p>\n<p><img decoding=\"async\" alt=\"Modern\u00e9 aplik\u00e1cie na OpenShift, \u010das\u0165 2: s\u00favisiace zostavy chained builds\" src=\"\/wp-content\/uploads\/2020\/08\/b1f6ae855a69597c6e86c5198e4a628c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV predch\u00e1dzaj\u00facom pr\u00edspevku sme sa mierne dotkli mo\u017enost\u00ed nov\u00e9ho builder obrazu S2I (source-to-image), ktor\u00fd je ur\u010den\u00fd na zostavovanie a nasadzovanie modern\u00fdch webov\u00fdch aplik\u00e1ci\u00ed na platforme OpenShift. Vtedy n\u00e1s zauj\u00edmala t\u00e9ma r\u00fdchleho nasadenia aplik\u00e1cie, a dnes sa pozrieme, ako pou\u017ei\u0165 S2I obraz ako \u201a\u010dist\u00fd\u2018 builder obraz a skombinova\u0165 ho so s\u00favisiacimi zostavami OpenShift.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>\u010cist\u00fd builder obraz<\/h3>\n<p>\nAko sme spomenuli v prvej \u010dasti, v\u00e4\u010d\u0161ina modern\u00fdch webov\u00fdch aplik\u00e1ci\u00ed m\u00e1 takzvan\u00fa f\u00e1zu zostavovania, po\u010das ktorej sa zvy\u010dajne vykon\u00e1vaj\u00fa oper\u00e1cie ako transpila\u010dn\u00fd k\u00f3d, sp\u00e1janie viacer\u00fdch s\u00faborov a minimaliz\u00e1cia. V\u00fdsledn\u00e9 s\u00fabory t\u00fdchto oper\u00e1ci\u00ed \u2013 \u010do s\u00fa statick\u00e9 HTML, JavaScript a CSS \u2013 sa ukladaj\u00fa do v\u00fdstupn\u00e9ho prie\u010dinka. Miesto tohto prie\u010dinka zvy\u010dajne z\u00e1vis\u00ed od toho, ak\u00e9 n\u00e1stroje na zostavovanie s\u00fa pou\u017eit\u00e9, a pre React to bude prie\u010dinok .\\\/build (k tejto t\u00e9me sa podrobnej\u0161ie vr\u00e1time ni\u017e\u0161ie).<\/p>\n<h4>Source-to-Image (S2I)<\/h4>\n<p>\nV tomto pr\u00edspevku sa nijako nebav\u00edme o t\u00e9me \u201a\u010do je S2I a ako ho pou\u017e\u00edva\u0165\u2018 (o tom si m\u00f4\u017eete pre\u010d\u00edta\u0165 podrobnej\u0161ie <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.okd.io\/latest\/architecture\/core_concepts\/builds_and_image_streams.html#source-build\">tu<\/a><\/noindex>), ale je d\u00f4le\u017eit\u00e9 ma\u0165 jasn\u00fa predstavu o dvoch f\u00e1zach tohto procesu, aby ste porozumeli tomu, \u010do vlastne rob\u00ed obraz Web App Builder.<\/p>\n<h4>F\u00e1za zostavovania (assemble phase)<\/h4>\n<p>\nF\u00e1za zostavovania je v podstate ve\u013emi podobn\u00e1 tomu, \u010do sa deje, ke\u010f spust\u00edte docker build a v\u00fdsledkom je nov\u00fd Docker obraz. Zodpovedaj\u00facim sp\u00f4sobom t\u00e1to f\u00e1za nast\u00e1va pri spusten\u00ed zostavy na platforme OpenShift.<\/p>\n<p>V pr\u00edpade obrazu Web App Builder za in\u0161tal\u00e1ciu z\u00e1vislost\u00ed va\u0161ej aplik\u00e1cie a spustenie zostavy zodpoved\u00e1 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bucharest-gold\/centos7-s2i-web-app\/blob\/master\/s2i\/assemble#L47\">assemble script<\/a><\/noindex>. Predvolene builder obraz pou\u017e\u00edva kon\u0161trukciu npm run build, ale t\u00fato mo\u017eno prep\u00edsa\u0165 prostredn\u00edctvom premennej prostredia NPM_BUILD.<\/p>\n<p>Ako sme u\u017e spomenuli, umiestnenie hotovej, u\u017e zlo\u017eenej aplik\u00e1cie z\u00e1vis\u00ed od toho, ak\u00e9 n\u00e1stroje sa pou\u017e\u00edvaj\u00fa. Napr\u00edklad, v pr\u00edpade React to bude prie\u010dinok \/build, a pre aplik\u00e1cie Angular \u2013 prie\u010dinok project_name\/dist. A ako u\u017e bolo uk\u00e1zan\u00e9 v minulom pr\u00edspevku, umiestnenie v\u00fdstupn\u00e9ho adres\u00e1ra, ktor\u00fd je predvolen\u00fd ako build, je mo\u017en\u00e9 prekona\u0165 cez premenn\u00fa prostredia OUTPUT_DIR. A preto\u017ee umiestnenie v\u00fdstupn\u00e9ho prie\u010dinka sa l\u00ed\u0161i od r\u00e1mca k r\u00e1mcu, jednoducho skop\u00edrujete vygenerovan\u00fd v\u00fdstup do \u0161tandardn\u00e9ho prie\u010dinka v obraze, a to konkr\u00e9tne do \/opt\/apt-root\/output. Je to d\u00f4le\u017eit\u00e9 pre pochopenie \u010fal\u0161ej \u010dasti tohto \u010dl\u00e1nku, a zatia\u013e r\u00fdchlo prejdime na \u010fal\u0161iu f\u00e1zu \u2013 sp\u00fa\u0161\u0165anie (run phase).<\/p>\n<h4>F\u00e1za sp\u00fa\u0161\u0165ania (run phase)<\/h4>\n<p>\nT\u00e1to f\u00e1za nast\u00e1va, ke\u010f sa na nov\u00fd obraz, vytvoren\u00fd po\u010das f\u00e1zy zostavovania, vykon\u00e1 pr\u00edkaz docker run. Takisto sa vyskytuje pri nasaden\u00ed na platforme OpenShift. Predvolene <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bucharest-gold\/centos7-s2i-web-app\/blob\/master\/s2i\/run\">run script<\/a><\/noindex> pou\u017e\u00edva <noindex><a rel=\"nofollow\" href=\"https:\/\/www.npmjs.com\/package\/serve\">serve module<\/a><\/noindex> na obsluhu statick\u00e9ho obsahu nach\u00e1dzaj\u00faceho sa v uvedenom \u0161tandardnom v\u00fdstupnom adres\u00e1ri.<\/p>\n<p>Tento pr\u00edstup je dobr\u00fd pre r\u00fdchle nasadenie aplik\u00e1ci\u00ed, ale vo v\u0161eobecnosti nie je odpor\u00fa\u010dan\u00e9 obsluhova\u0165 statick\u00fd obsah t\u00fdmto sp\u00f4sobom. Preto\u017ee v skuto\u010dnosti obsluhujeme len statick\u00fd obsah, Node.js nain\u0161talovan\u00fd vo vn\u00fatri n\u00e1\u0161ho obrazu nie je potrebn\u00fd \u2013 sta\u010d\u00ed aj webov\u00fd server.<\/p>\n<p>In\u00fdmi slovami, pri zostavovan\u00ed potrebujeme nie\u010do in\u00e9, ne\u017e pri vykon\u00e1van\u00ed. V takejto situ\u00e1cii sa hodia prepojen\u00e9 zostavy (chained builds).<\/p>\n<h3>Prepojen\u00e9 zostavy (chained builds)<\/h3>\n<p>\nTu je, \u010do hovoria o <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.okd.io\/latest\/dev_guide\/builds\/advanced_build_operations.html#dev-guide-chaining-builds\">chained builds<\/a><\/noindex> v dokument\u00e1cii OpenShift:<\/p>\n<blockquote><p>\u201eDve zostavy je mo\u017en\u00e9 prepoji\u0165, pri\u010dom jedna z nich generuje skompilovan\u00fa entitu a druh\u00e1 t\u00fato entitu umiest\u0148uje do samostatn\u00e9ho obrazu, ktor\u00fd sa pou\u017e\u00edva na spustenie tejto entity.\u201c\n<\/p><\/blockquote>\n<p>\nIn\u00fdmi slovami, m\u00f4\u017eeme pou\u017ei\u0165 obraz Web App Builder na spustenie na\u0161ej zostavy a potom pou\u017ei\u0165 obraz webov\u00e9ho servera, toho ist\u00e9ho NGINX, aby sme obsluhovali n\u00e1\u0161 obsah.<\/p>\n<p>T\u00fdmto sp\u00f4sobom m\u00f4\u017eeme pou\u017ei\u0165 obraz Web App Builder ako \u201e\u010dist\u00e9ho\u201c builder-a a ma\u0165 pritom mal\u00fd runtime obraz.<\/p>\n<p>Teraz si to rozoberieme na konkr\u00e9tnom pr\u00edklade.<\/p>\n<p>Pre tr\u00e9ning budeme pou\u017e\u00edva\u0165 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lholmquist\/react-web-app\">jednoduch\u00fa aplik\u00e1ciu React<\/a><\/noindex>, vytvoren\u00fa s pomocou n\u00e1stroja pr\u00edkazov\u00e9ho riadku create-react-app.<\/p>\n<p>Zos\u00fala\u010fova\u0165 v\u0161etko dohromady n\u00e1m pom\u00f4\u017ee <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lholmquist\/react-web-app\/blob\/master\/.openshiftio\/application.yaml\">\u0161abl\u00f3nov\u00fd s\u00fabor OpenShift<\/a><\/noindex>.<\/p>\n<p>Podrobnej\u0161ie presk\u00famame tento s\u00fabor a za\u010dneme s \u010das\u0165ou parametrov.<\/p>\n<pre><code class=\"plaintext\">parametre:\n  - n\u00e1zov: SOURCE_REPOSITORY_URL\n    popis: Zdrojov\u00e1 URL aplik\u00e1cie\n    zobrazen\u00e9 meno: Zdrojov\u00e1 URL\n    povinn\u00e9: pravda\n  - n\u00e1zov: SOURCE_REPOSITORY_REF\n    popis: N\u00e1zov vetvy aplik\u00e1cie\n    zobrazen\u00e9 meno: Zdrojov\u00e1 vetva\n    hodnota: master\n    povinn\u00e9: pravda\n  - n\u00e1zov: SOURCE_REPOSITORY_DIR\n    popis: Miesto v zdrojovom repozit\u00e1ri aplik\u00e1cie\n    zobrazen\u00e9 meno: Zdrojov\u00fd adres\u00e1r\n    hodnota: .\n    povinn\u00e9: pravda\n  - n\u00e1zov: OUTPUT_DIR\n    popis: Miesto skompilovan\u00fdch statick\u00fdch s\u00faborov z v\u00e1\u0161ho n\u00e1stroja na vytv\u00e1ranie webov\u00fdch aplik\u00e1ci\u00ed\n    zobrazen\u00e9 meno: V\u00fdstupn\u00fd adres\u00e1r\n    hodnota: build\n    povinn\u00e9: nepravda\n<\/code><\/pre>\n<p>\nTu je v\u0161etko dos\u0165 jasn\u00e9, ale treba si d\u00e1va\u0165 pozor na parameter OUTPUT_DIR. Pre React aplik\u00e1ciu z n\u00e1\u0161ho pr\u00edkladu nie je potrebn\u00e9 sa ob\u00e1va\u0165, preto\u017ee React pou\u017e\u00edva ako v\u00fdstupn\u00fd prie\u010dinok predvolen\u00e9 nastavenie, ale v pr\u00edpade Angular alebo nie\u010doho in\u00e9ho, tento parameter bude potrebn\u00e9 upravi\u0165 spr\u00e1vnym sp\u00f4sobom.<\/p>\n<p>Teraz sa pozrime na \u010das\u0165 ImageStream-ov.<\/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>\nPozrite sa na tret\u00ed a \u0161tvrt\u00fd obraz. Oba s\u00fa definovan\u00e9 ako Docker obrazy a je jasn\u00e9, odkia\u013e poch\u00e1dzaj\u00fa.<\/p>\n<p>Tret\u00ed obraz je web-app-builder a poch\u00e1dza z nodeshift\/ubi8-s2i-web-app s tagom 10.x na <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/nodeshift\/ubi8-s2i-web-app\/\">Docker hub<\/a><\/noindex>.<\/p>\n<p>\u0160tvrt\u00fd obraz je obraz NGINX (verzia 1.12) s tagom latest na <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/centos\/nginx-112-centos7\/\">Docker hub<\/a><\/noindex>.<\/p>\n<p>Teraz sa pozrime na dva prv\u00e9 obrazy. Oba s\u00fa na za\u010diatku pr\u00e1zdne a vytv\u00e1raj\u00fa sa len po\u010das f\u00e1zy zostavenia (build phase). Prv\u00fd obraz \u2013 react-web-app-builder \u2013 bude v\u00fdsledkom f\u00e1zy skladania, ktor\u00e1 spoj\u00ed obraz web-app-builder-runtime a n\u00e1\u0161 zdrojov\u00fd k\u00f3d. Preto sme do n\u00e1zvu tohto obrazu pridali \u201e-builder\u201c.<\/p>\n<p>Druh\u00fd obraz \u2013 react-web-app-runtime \u2013 bude v\u00fdsledkom spojenia nginx-image-runtime a ur\u010dit\u00fdch s\u00faborov z obrazu react-web-app-builder. Tento obraz sa tie\u017e pou\u017eije pri nasaden\u00ed a bude obsahova\u0165 len webov\u00fd server a statick\u00fd HTML, JavaScript a CSS na\u0161ej aplik\u00e1cie.<\/p>\n<p>Zlo\u017eit\u00fd syst\u00e9m? Pozrime sa teraz na konfigura\u010dn\u00e9 s\u00fabory a bude to trochu jasnej\u0161ie.<\/p>\n<p>V na\u0161ej \u0161abl\u00f3ne s\u00fa dve konfigura\u010dn\u00e9 s\u00fabory. Toto je prv\u00e9 z nich a je dos\u0165 \u0161tandardn\u00e9:<\/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>\nAko vid\u00edme, riadok s ozna\u010den\u00edm 1 hovor\u00ed, \u017ee v\u00fdsledok tejto zostavy bude umiestnen\u00fd do obrazu react-web-app-builder, ktor\u00fd sme predt\u00fdm videli v \u010dasti ImageStream.<\/p>\n<p>Riadok s ozna\u010den\u00edm 2 hovor\u00ed, odkia\u013e bra\u0165 k\u00f3d. V na\u0161om pr\u00edpade ide o git repozit\u00e1r a umiestnenie, ref a adres\u00e1r kontextu s\u00fa definovan\u00e9 parametrami, ktor\u00e9 sme u\u017e videli vy\u0161\u0161ie.<\/p>\n<p>Riadok s ozna\u010den\u00edm 3 \u2013 toto sme u\u017e videli v \u010dasti parametre. Prid\u00e1va premenn\u00fa prostredia OUTPUT_DIR, ktor\u00e1 je v na\u0161om pr\u00edklade rovn\u00e1 build.<br \/>\nRiadok s ozna\u010den\u00edm 4 hovor\u00ed, aby sa pou\u017eil obraz web-app-builder-runtime, ktor\u00fd sme u\u017e videli v \u010dasti ImageStream.<\/p>\n<p>Riadok s ozna\u010den\u00edm 5 hovor\u00ed, \u017ee chceme pou\u017ei\u0165 inkrement\u00e1lnu zostavu, ak S2I-obraz ju podporuje, a obraz Web App Builder ju podporuje. Pri prvom spusten\u00ed, po ukon\u010den\u00ed f\u00e1zy zostavovania, obraz ulo\u017e\u00ed adres\u00e1r node_modules do arch\u00edvneho s\u00faboru. Potom pri \u010fal\u0161\u00edch spusteniach obraz jednoducho rozbal\u00ed tento adres\u00e1r, aby skr\u00e1til dobu zostavy.<\/p>\n<p>A nakoniec, riadok s ozna\u010den\u00edm 6 \u2013 to s\u00fa len niektor\u00e9 sp\u00fa\u0161\u0165a\u010de, aby sa zostava sp\u00fa\u0161\u0165ala automaticky, bez ru\u010dn\u00e9ho z\u00e1sahu, ke\u010f sa nie\u010do zmen\u00ed.<\/p>\n<p>V skratke, je to pomerne \u0161tandardn\u00e1 konfigur\u00e1cia zostavy.<\/p>\n<p>Teraz sa pozrime na druh\u00fa konfigur\u00e1ciu zostavy. Je ve\u013emi podobn\u00e1 prvej, ale m\u00e1 jedno d\u00f4le\u017eit\u00e9 odli\u0161nos\u0165.<\/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             \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>\nTak\u017ee druh\u00e1 konfigur\u00e1cia zostavenia je react-web-app-runtime a za\u010d\u00edna celkom \u0161tandardne.<\/p>\n<p>Na riadku s ozna\u010den\u00edm 1 nie je ni\u010d nov\u00e9 \u2013 jednoducho hovor\u00ed, \u017ee v\u00fdsledok zostavenia sa ukl\u00e1d\u00e1 do obrazu react-web-app-runtime.<\/p>\n<p>Riadok s ozna\u010den\u00edm 2, rovnako ako v predch\u00e1dzaj\u00facej konfigur\u00e1cii, uv\u00e1dza, odkia\u013e berieme zdrojov\u00fd k\u00f3d. V\u0161imnite si, \u017ee tu hovor\u00edme, \u017ee sa berie z obrazu. A to z obrazu, ktor\u00fd sme pr\u00e1ve vytvorili \u2013 z react-web-app-builder (uveden\u00e9ho na riadku s ozna\u010den\u00edm 3). Soubory, ktor\u00e9 chceme pou\u017ei\u0165, sa nach\u00e1dzaj\u00fa vo vn\u00fatri obrazu a ich umiestnenie tam je nastaven\u00e9 na riadku s ozna\u010den\u00edm 4, v na\u0161om pr\u00edpade je to \/opt\/app-root\/output\/. Ak si pam\u00e4t\u00e1te, pr\u00e1ve tam sa ukladaj\u00fa s\u00fabory, generovan\u00e9 na z\u00e1klade v\u00fdsledkov zostavenia na\u0161ej aplik\u00e1cie.<\/p>\n<p>Cie\u013eov\u00fd adres\u00e1r ur\u010den\u00fd na riadku s ozna\u010den\u00edm 5 je jednoducho aktu\u00e1lny katal\u00f3g (toto v\u0161etko, pripom\u00edname, be\u017e\u00ed v r\u00e1mci nie\u010doho magick\u00e9ho zvan\u00e9ho OpenShift, a nie na va\u0161om lok\u00e1lnom po\u010d\u00edta\u010di).<\/p>\n<p>Sekcia strategy \u2013 riadok s ozna\u010den\u00edm 6 \u2013 tie\u017e vyzer\u00e1 ako prv\u00e1 konfigur\u00e1cia zostavenia. Tentoraz sa chyst\u00e1me pou\u017ei\u0165 nginx-image-runtime, ktor\u00fd sme u\u017e videli v sekcii ImageStream.<\/p>\n<p>Nakoniec, riadok s ozna\u010den\u00edm 7 \u2013 to je sekcia sp\u00fa\u0161\u0165a\u010dov, ktor\u00e1 aktivuje toto zostavenie zaka\u017ed\u00fdm, ke\u010f sa zmen\u00ed obraz react-web-app-builder.<\/p>\n<p>Inak tento \u0161abl\u00f3n obsahuje celkom \u0161tandardn\u00fa konfigur\u00e1ciu nasadenia, ako aj veci, ktor\u00e9 sa t\u00fdkaj\u00fa slu\u017eieb a tr\u00e1s, ale nebudeme to hlb\u0161ie sk\u00fama\u0165. V\u0161imnite si, \u017ee obraz, ktor\u00fd sa bude nasadzova\u0165 \u2013 je obraz react-web-app-runtime.<\/p>\n<h3>Nasadenie aplik\u00e1cie<\/h3>\n<p>\nTak\u017ee po tom, \u010do sme sa pozreli na \u0161abl\u00f3nu, pozrime sa, ako ju pou\u017ei\u0165 na nasadenie aplik\u00e1cie.<\/p>\n<p>M\u00f4\u017eeme pou\u017ei\u0165 klientsk\u00fd n\u00e1stroj OpenShift zvan\u00fd oc na nasadenie na\u0161ej \u0161abl\u00f3ny:<\/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>\nPrk\u00fd prv\u00e1 pr\u00edkaz na obrazovke vy\u0161\u0161ie \u2013 to je z\u00e1merne in\u017einiersky sp\u00f4sob, ako n\u00e1js\u0165 \u0161abl\u00f3nu \/openshiftio\/application.yaml.<\/p>\n<p>Druh\u00fd pr\u00edkaz jednoducho vytvor\u00ed nov\u00fa aplik\u00e1ciu na z\u00e1klade tejto \u0161abl\u00f3ny.<\/p>\n<p>Po tom, ako tieto pr\u00edkazy prebehn\u00fa, uvid\u00edme, \u017ee m\u00e1me dve zostavenia:<\/p>\n<p><img decoding=\"async\" alt=\"Modern\u00e9 aplik\u00e1cie na OpenShift, \u010das\u0165 2: s\u00favisiace zostavy chained builds\" src=\"\/wp-content\/uploads\/2020\/08\/c6b2b2fcadfcd3e5a8a2adb4eff69bf2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>A ke\u010f sa vr\u00e1t\u00edme na obrazovku Preh\u013ead, uvid\u00edme spusten\u00fd pod:<\/p>\n<p><img decoding=\"async\" alt=\"Modern\u00e9 aplik\u00e1cie na OpenShift, \u010das\u0165 2: s\u00favisiace zostavy chained builds\" src=\"\/wp-content\/uploads\/2020\/08\/983fab3029d222555dc13790d4a3e70f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Kliknut\u00edm na odkaz prejdeme k na\u0161ej aplik\u00e1cii, ktor\u00e1 predstavuje str\u00e1nku predvolenej aplik\u00e1cie React App:<\/p>\n<p><img decoding=\"async\" alt=\"Modern\u00e9 aplik\u00e1cie na OpenShift, \u010das\u0165 2: s\u00favisiace zostavy chained builds\" src=\"\/wp-content\/uploads\/2020\/08\/d5b658875e0e865bf456955aaac15464.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>Dodatok 1<\/h3>\n<p>\nPre milovn\u00edkov Angular m\u00e1me tie\u017e <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lholmquist\/angular-web-app\">pr\u00edklad aplik\u00e1cie<\/a><\/noindex>.<\/p>\n<p>\u0160abl\u00f3na je rovnak\u00e1, okrem premennej OUTPUT_DIR.<\/p>\n<h3>Doplnenie 2<\/h3>\n<p>\nV tomto \u010dl\u00e1nku sme pou\u017eili ako webov\u00fd server NGINX, ale d\u00e1 sa \u013eahko nahradi\u0165 Apache, sta\u010d\u00ed zmeni\u0165 v \u0161abl\u00f3novom s\u00fabore <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lholmquist\/react-web-app\/blob\/master\/.openshiftio\/application.yaml#L66\">obr\u00e1zok NGINX<\/a><\/noindex> na <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/centos\/httpd-24-centos7\/\">obr\u00e1zok Apache<\/a><\/noindex>.<\/p>\n<h3>Z\u00e1ver<\/h3>\n<p>\nV prvej \u010dasti tejto s\u00e9rie sme uk\u00e1zali, ako r\u00fdchlo roz\u0161i\u0159ova\u0165 modern\u00e9 webov\u00e9 aplik\u00e1cie na platforme OpenShift. Dnes presk\u00famame, \u010do rob\u00ed obraz Web App a ako je mo\u017en\u00e9 ho kombinova\u0165 s \u010dist\u00fdm webov\u00fdm serverom ako NGINX pomocou s\u00favisiacich zostaven\u00ed (chained build) pri organizovan\u00ed vhodnej\u0161ej pre produk\u010dn\u00e9 podmienky zostavy aplik\u00e1ci\u00ed. V nasleduj\u00facom, z\u00e1vere\u010dnom \u010dl\u00e1nku tejto s\u00e9rie uk\u00e1\u017eeme, ako spusti\u0165 na OpenShift v\u00fdvojov\u00fd server pre svoju aplik\u00e1ciu a zabezpe\u010di\u0165 synchroniz\u00e1ciu lok\u00e1lnych a vzdialen\u00fdch s\u00faborov.<\/p>\n<h3>Obsah tejto s\u00e9rie \u010dl\u00e1nkov<\/h3>\n<p><\/p>\n<ul>\n<li>\u010cas\u0165 1: <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/511954\/\">ako nasadi\u0165 modern\u00e9 webov\u00e9 aplik\u00e1cie len za nieko\u013eko krokov<\/a><\/noindex>;<\/li>\n<li>\u010cas\u0165 2: ako aplikova\u0165 nov\u00fd obraz S2I spolu s u\u017e existuj\u00facim obrazom HTTP servera, napr\u00edklad NGINX, pou\u017eit\u00edm s\u00favisiacich zostaven\u00ed OpenShift na organiz\u00e1ciu produk\u010dn\u00e9ho nasadenia;<\/li>\n<li>\u010cas\u0165 3: ako spusti\u0165 na platforme OpenShift v\u00fdvojov\u00fd server pre svoju aplik\u00e1ciu a synchronizova\u0165 ho s lok\u00e1lnym s\u00faborov\u00fdm syst\u00e9mom.<\/li>\n<\/ul>\n<p><\/p>\n<h3>\u010eal\u0161ie zdroje<\/h3>\n<p><\/p>\n<ul>\n<li>Bezplatn\u00e1 elektronick\u00e1 kniha <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/books\/deploying-openshift\">Nasadzovanie na OpenShift<\/a><\/noindex>.<\/li>\n<li>Inform\u00e1cie o <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/kubernetes\/\">OpenShift a Kubernetes<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>Zdroj: <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.4 - 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\/sk\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-2-svyazannye-sborki-chained-builds\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sk_SK\" \/>\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\/sk\/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\udd47Modern\u00e9 aplik\u00e1cie na OpenShift, \u010das\u0165 2: s\u00favisiace zostavy chained builds | ProHoster","description":"Ahojte v\u0161etci! Toto je druh\u00fd pr\u00edspevok v na\u0161ej s\u00e9rii, v ktorej ukazujeme, ako nasadi\u0165 modern\u00e9 webov\u00e9 aplik\u00e1cie na Red Hat OpenShift.","canonical_url":"https:\/\/prohoster.info\/sk\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-2-svyazannye-sborki-chained-builds","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"sk_SK","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\/sk\/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\/sk\/wp-json\/wp\/v2\/posts\/90874","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/comments?post=90874"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/posts\/90874\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media\/90875"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/media?parent=90874"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/categories?post=90874"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sk\/wp-json\/wp\/v2\/tags?post=90874"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}