{"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\/et\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-2-svyazannye-sborki-chained-builds","title":{"rendered":"Kaasaegsed rakendused OpenShiftis, osa 2: seotud kogumid chained builds","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Tere k\u00f5igile! Siin on meie teise postituse seeria, kus n\u00e4itame, kuidas juurutada t\u00e4nap\u00e4evaseid veebirakendusi Red Hat OpenShiftis. <\/p>\n<p><img decoding=\"async\" alt=\"Kaasaegsed rakendused OpenShiftis, osa 2: seotud kogumid chained builds\" src=\"\/wp-content\/uploads\/2020\/08\/b1f6ae855a69597c6e86c5198e4a628c.jpeg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEelnevas postituses k\u00e4sitlesime veidi uue S2I (source-to-image) builder-pildi v\u00f5imalusi, mis on m\u00f5eldud t\u00e4nap\u00e4evaste veebirakenduste kogumiseks ja juurutamiseks OpenShifti platvormil. Toona huvitusime rakenduse kiirest juurutamisest, t\u00e4na vaatame aga, kuidas kasutada S2I pilti \u201epuhta\u201d builder-pildina ja kombineerida seda seotud OpenShift'i kogumistega.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Puhas builder-pilt<\/h3>\n<p>\nKuidas me esimeses osas mainisime, on enamikul t\u00e4nap\u00e4evastest veebirakendustest nii-\u00f6elda kogumise etapp, kus tavaliselt teostatakse selliseid toiminguid nagu koodi transpileerimine, mitme faili \u00fchendamine ja minimeerimine. Saadud failid \u2013 staatiline HTML, JavaScript ja CSS \u2013 paigutatakse v\u00e4ljundkausta. Selle kausta asukoht s\u00f5ltub tavaliselt sellest, milliseid kogumise t\u00f6\u00f6riistu kasutatakse, ja React'i puhul on see kaust .\/build (naaseme selle k\u00fcsimuse juurde l\u00e4hemal ajal).<\/p>\n<h4>Source-to-Image (S2I)<\/h4>\n<p>\nSelles postituses ei k\u00e4sitleme teemat \"mis on S2I ja kuidas seda kasutada\" (lisaks sellele saab lugeda <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.okd.io\/latest\/architecture\/core_concepts\/builds_and_image_streams.html#source-build\">siit<\/a><\/noindex>), kuid on oluline selgelt m\u00f5ista kahte etappi, et m\u00f5ista, mida Web App Builderi pilt teeb.<\/p>\n<h4>Kokkuv\u00f5tte etapp (assemble phase)<\/h4>\n<p>\nKokkuv\u00f5tte etapp on oma olemuselt v\u00e4ga sarnane sellele, mis juhtub, kui k\u00e4ivitate docker build ja saate uue Docker-pildi. Seega tekib see etapp OpenShift platvormil kokkupaneku k\u00e4ivitamisel.<\/p>\n<p>Web App Builderi pildi puhul vastutab teie rakenduse s\u00f5ltuvuste installimise ja kokkupaneku k\u00e4ivitamise eest <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bucharest-gold\/centos7-s2i-web-app\/blob\/master\/s2i\/assemble#L47\">assemble script<\/a><\/noindex>. Vaikimisi kasutab builder-pilt npm run build k\u00e4su, kuid seda saab \u00fcmber m\u00e4\u00e4rata keskkonnamuutuja NPM_BUILD kaudu.<\/p>\n<p>Nagu varem mainitud, s\u00f5ltub valmis, juba kokku pandud rakenduse asukoht kasutatavatest t\u00f6\u00f6riistadest. N\u00e4iteks Reacti puhul asub see kaustas .\/build, Angulari rakenduste puhul aga kaustas project_name\/dist. Ja nagu eelmisel postitusel n\u00e4idatud, saab vaikimisi m\u00e4\u00e4ratud output-katalooge, mis on build, \u00fcle kirjutada keskkonnamuutujaga OUTPUT_DIR. Kuna output-kausta asukoht s\u00f5ltub raamistikust, kopeerite lihtsalt genereeritud v\u00e4ljundi standardkausta, see on \/opt\/apt-root\/output. See on oluline arusaamiseks k\u00e4esoleva artikli j\u00e4rgnevast osast, aga n\u00fc\u00fcd vaatame kiirelt j\u00e4rgmise etapi \u2013 k\u00e4ivitamise (run phase) \u2013 \u00fcle.<\/p>\n<h4>K\u00e4ivitamise etapp (run phase)<\/h4>\n<p>\nSee etapp algab, kui uue pildi jaoks, mis loodi assamblee etapis, tehakse docker run k\u00e4sk. See toimub samuti OpenShift platvormil juurutamisel. Vaikimisi <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/bucharest-gold\/centos7-s2i-web-app\/blob\/master\/s2i\/run\">k\u00e4ivitusskript<\/a><\/noindex> kasutab <noindex><a rel=\"nofollow\" href=\"https:\/\/www.npmjs.com\/package\/serve\">teenindusmoodul<\/a><\/noindex> statilise sisu teenindamiseks, mis asub eespool nimetatud standardse output-katalooge.<\/p>\n<p>See meetod sobib rakenduste kiireks juurutamiseks, kuid tegelikult ei soovitata staatilise sisu sellisel viisil teenindada. Kuna me tegelikult teenindame ainult staatilist sisu, pole meie Node.js pildi sees installimine vajalik \u2013 piisab veebiserverist.<\/p>\n<p>Teisis\u00f5nu, ehitamisel vajame \u00fchte ja t\u00e4itmisel \u2013 teist. Sellises olukorras tulevad kasuks seotud ehitused (chained builds).<\/p>\n<h3>Seotud ehitused (chained builds)<\/h3>\n<p>\nSiin on, mida kirjutatakse <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> OpenShift'i dokumentatsioonis:<\/p>\n<blockquote><p>\u201eKaks ehitust saab omavahel siduda, kusjuures \u00fcks neist genereerib kompileeritud \u00fcksuse ja teine paigutab selle \u00fcksuse eraldi pildile, mida kasutatakse selle \u00fcksuse k\u00e4itamiseks.\u201d\n<\/p><\/blockquote>\n<p>\nTeiste s\u00f5nadega, me saame kasutada Web App Builder pildil meie ehituse k\u00e4itamiseks ja seej\u00e4rel kasutada veebiserveri pilti, n\u00e4iteks NGINX-i, et teenindada meie sisu.<\/p>\n<p>Nii saame rakendada Web App Builder pilti kui \"puhtat\" builder'it ja omada samal ajal v\u00e4ikese suurusega k\u00e4ituspilti.<\/p>\n<p>N\u00fc\u00fcd vaatame seda konkreetse n\u00e4ite p\u00f5hjal.<\/p>\n<p>Treeninguks kasutame <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lholmquist\/react-web-app\">lihtsat React rakendust<\/a><\/noindex>, loodud k\u00e4surea t\u00f6\u00f6riista create-react-app abil.<\/p>\n<p>Kogume k\u00f5ik kokku meie abiga <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lholmquist\/react-web-app\/blob\/master\/.openshiftio\/application.yaml\">OpenShift'i mallifail<\/a><\/noindex>.<\/p>\n<p>Vaatame seda faili l\u00e4hemalt ja alustame parameetrite osast.<\/p>\n<pre><code class=\"plaintext\">parameters:\n  - name: SOURCE_REPOSITORY_URL\n    description: Rakenduse allika URL\n    displayName: Allika URL\n    required: true\n  - name: SOURCE_REPOSITORY_REF\n    description: Rakenduse haru nimi\n    displayName: Allika haru\n    value: master\n    required: true\n  - name: SOURCE_REPOSITORY_DIR\n    description: Rakenduse asukoht allika repos\n    displayName: Allika kataloog\n    value: .\n    required: true\n  - name: OUTPUT_DIR\n    description: Koostatud staatiliste failide asukoht teie veebirakenduste koostajana\n    displayName: V\u00e4ljund kataloog\n    value: build\n    required: false\n<\/code><\/pre>\n<p>\nSiin on k\u00f5ik \u00fcsna selge, kuid tasub t\u00e4helepanu p\u00f6\u00f6rata parameetrile OUTPUT_DIR. Meie n\u00e4ite React-rakenduse puhul ei pea muretsema, kuna React kasutab v\u00e4ljundikaustana vaikev\u00e4\u00e4rtust, kuid Angulari v\u00f5i millegi muu puhul tuleb see parameeter vastavalt muuta.<\/p>\n<p>N\u00fc\u00fcd vaatame ImageStreamide sektsiooni.<\/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>\nVaata kolmandat ja neljandat pilti. Need on m\u00f5lemad m\u00e4\u00e4ratletud kui Docker-pildid ja on selgelt n\u00e4htav, kust need tulevad.<\/p>\n<p>Kolmas pilt on web-app-builder ja see p\u00e4rineb nodeshift\/ubi8-s2i-web-app versiooniga 10.x. <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/nodeshift\/ubi8-s2i-web-app\/\">Docker hub<\/a><\/noindex>.<\/p>\n<p>Neljas on NGINX pilt (versioon 1.12) versiooniga latest. <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/centos\/nginx-112-centos7\/\">Docker hub<\/a><\/noindex>.<\/p>\n<p>N\u00fc\u00fcd vaatame kahte esimest pilti. Need on m\u00f5lemad alguses t\u00fchjad ja luuakse ainult ehitusetapis (build phase). Esimene pilt \u2013 react-web-app-builder \u2013 saab olema assemblimise etapi tulemus, mis liidab web-app-builder-runtime pildi ja meie l\u00e4htekoodi. Just seet\u00f5ttu olime selle pildi nime kirjutanud \"-builder\".<\/p>\n<p>Teine pilt \u2013 react-web-app-runtime \u2013 on nginx-image-runtime'i ja m\u00f5nede failide kombinatsioon, mis p\u00e4rinevad react-web-app-builder pildist. See pilt kasutatakse samuti juurutamisel ning see sisaldab ainult meie rakenduse veebiserverit ja staatilist HTML-i, JavaScripti ja CSS-i.<\/p>\n<p>Kas see on keeruline? Vaatame n\u00fc\u00fcd ehituskonfiguratsioone, siis saab veidi arusaadavamaks.<\/p>\n<p>Meie mallis on kaks ehituskonfiguratsiooni. Siin on neist esimene, mis on \u00fcsna standartne:<\/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>\nNagu n\u00e4ha, \u00fctleb m\u00e4rgistuse 1 rida, et selle ehituse tulemus paigutatakse just sellesse react-web-app-builder pilti, mida me varem ImageStreamide jaotises n\u00e4gime.<\/p>\n<p>M\u00e4rgitud rida 2 \u00fctleb, kust koodi v\u00f5tta. Meie puhul on see git-repositoorium, samas kui asukoht, ref ja konteksti kaust on m\u00e4\u00e4ratud parameetritega, mida oleme juba varem n\u00e4inud.<\/p>\n<p>M\u00e4rgitud rida 3 \u2013 see on see, mida oleme juba n\u00e4inud jaotises parameetrid. See lisab keskkonnamuutuja OUTPUT_DIR, mis meie n\u00e4ites on igual to build.<br \/>\nM\u00e4rgitud rida 4 \u00fctleb kasutada pilti web-app-builder-runtime, mida me oleme juba n\u00e4inud jaotises ImageStream.<\/p>\n<p>M\u00e4rgitud rida 5 \u00fctleb, et soovime kasutada inkrementeerimist, kui S2I-pilt seda toetab, ja Web App Builder \u2013 toetab. Esmase k\u00e4ivitamise ajal, p\u00e4rast koostamisfaasi l\u00f5petamist, salvestab pilt kausta node_modules arhiivifaili. Siis j\u00e4rgmistel k\u00e4ivitustel lihtsalt dekompresseerib pilt selle kausta, et v\u00e4hendada koostamise kestust.<\/p>\n<p>Ja l\u00f5puks, m\u00e4rgitud rida 6 \u2013 see on lihtsalt m\u00f5ned k\u00e4ivitajad, et koostamine algaks automaatselt, ilma k\u00e4sitsemise sekkumiseta, kui midagi muutub.<\/p>\n<p>\u00dcldiselt on see \u00fcsna standardne koostamisconfig.<\/p>\n<p>N\u00fc\u00fcd vaatame teist koostamisseadet. See on v\u00e4ga sarnane esimesele, kuid seal on \u00fcks oluline erinevus.<\/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>\nNii, teine kogumiskonfiguratsioon on react-web-app-runtime, ja see algab \u00fcsna standardina.<\/p>\n<p>M\u00e4rgil 1 ei ole midagi uut \u2013 see \u00fctleb lihtsalt, et kogumise tulemus salvestatakse react-web-app-runtime pildile.<\/p>\n<p>M\u00e4rgisest 2 rida, nagu ka eelnevas konfiguratsioonis, n\u00e4itab, kust l\u00e4htekoodi v\u00f5tta. Kuid pidage meeles, et siin r\u00e4\u00e4gime, et see v\u00f5etakse pildist. Ja just sellest pildist, mille me just loome \u2013 react-web-app-builder (mille oleme m\u00e4\u00e4ranud m\u00e4rgis 3). Failid, mida soovime kasutada, asuvad pildi sees ja nende asukoht seal on m\u00e4\u00e4ratud m\u00e4rgis 4, meie puhul see on \/opt\/app-root\/output\/. Kui m\u00e4letate, siis just sinna laaditakse failid, mis genereeritakse meie rakenduse kogumise tulemuste p\u00f5hjal.<\/p>\n<p>Sihtkaust, mille m\u00e4\u00e4rasime m\u00e4rgis 5 \u2013 on lihtsalt praegune kataloog (k\u00f5ik see, meenutame, k\u00e4ib mingisuguse maagilise asja nimega OpenShift sees, mitte teie kohalikus arvutis).<\/p>\n<p>Jaotises strategy \u2013 rida, millel on m\u00e4rgis 6 \u2013 n\u00e4eb samuti v\u00e4lja nagu esimene kogumiskonfiguratsioon. Ainult seekord kavandame kasutada nginx-image-runtime'i, mida oleme juba n\u00e4inud jaos ImageStream.<\/p>\n<p>L\u00f5puks, rida, millel on m\u00e4rgis 7 \u2013 on k\u00e4ivitajate jaotis, mis aktiveerib selle kogumise igal korral, kui react-web-app-builder pilt muutub.<\/p>\n<p>Tegu on muidu \u00fcsna standardse juurutamissektori konfiguratsiooniga ning h\u00f5lmab ka teenuseid ja marsruute, kuid me ei s\u00fcvene sellesse. Pange t\u00e4hele, et juurutatav pilt on react-web-app-runtime.<\/p>\n<h3>Rakenduse juurutamine<\/h3>\n<p>\nNii et p\u00e4rast seda, kui oleme vaadanud \u0161ablooni, vaatame, kuidas seda rakenduse juurutamiseks kasutada.<\/p>\n<p>Me kasutame OpenShift'i kliendi t\u00f6\u00f6riista nimega oc, et juurutada meie \u0161abloon:<\/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>\nEsimene k\u00e4sk \u00fclaltoodud ekraanil on ekslikult inseneritehniline viis \u0161ablooni leidmiseks .\/openshiftio\/application.yaml.<\/p>\n<p>Teine k\u00e4sk loob lihtsalt uue rakenduse selle \u0161ablooni p\u00f5hjal.<\/p>\n<p>P\u00e4rast nende k\u00e4skude t\u00e4itmist n\u00e4eme, et meil on kaks koostamist:<\/p>\n<p><img decoding=\"async\" alt=\"Kaasaegsed rakendused OpenShiftis, osa 2: seotud kogumid chained builds\" src=\"\/wp-content\/uploads\/2020\/08\/c6b2b2fcadfcd3e5a8a2adb4eff69bf2.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ja tagasip\u00f6\u00f6rdudes Overview ekraanile, n\u00e4eme jooksva pod'i:<\/p>\n<p><img decoding=\"async\" alt=\"Kaasaegsed rakendused OpenShiftis, osa 2: seotud kogumid chained builds\" src=\"\/wp-content\/uploads\/2020\/08\/983fab3029d222555dc13790d4a3e70f.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Linki kl\u00f5psates j\u00f5uame meie rakendusele, mis on vaikes\u00e4ttega React App leht:<\/p>\n<p><img decoding=\"async\" alt=\"Kaasaegsed rakendused OpenShiftis, osa 2: seotud kogumid chained builds\" src=\"\/wp-content\/uploads\/2020\/08\/d5b658875e0e865bf456955aaac15464.jpeg\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<h3>T\u00e4iend 1<\/h3>\n<p>\nAngulari f\u00e4nnide jaoks on meil ka <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lholmquist\/angular-web-app\">rakenduse n\u00e4idis<\/a><\/noindex>.<\/p>\n<p>Mall on sama, v\u00e4lja arvatud muutuja OUTPUT_DIR.<\/p>\n<h3>Lisa 2<\/h3>\n<p>\nSelles artiklis kasutasime veebiserverina NGINX-i, kuid selle saab h\u00f5lpsasti asendada Apache'iga, lihtsalt muutes mallifailis. <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lholmquist\/react-web-app\/blob\/master\/.openshiftio\/application.yaml#L66\">NGINX-i pilt<\/a><\/noindex> j\u00e4rgnevaga <noindex><a rel=\"nofollow\" href=\"https:\/\/hub.docker.com\/r\/centos\/httpd-24-centos7\/\">Apache'i pilt<\/a><\/noindex>.<\/p>\n<h3>Kokkuv\u00f5te<\/h3>\n<p>\nSelle seeria esimeses osas n\u00e4itasime, kuidas kiiresti juurutada kaasaegseid veebirakendusi OpenShift platvormil. T\u00e4na vaatame, mida teeb Veebirakenduse pilt ja kuidas seda saab \u00fchendada puhta veebiserveriga nagu NGINX, kasutades seotud ehitusi (chained build), et korraldada rakenduste ehitus rohkem tootmistingimustele sobivalt. Seeria j\u00e4rgmises, viimases artiklis n\u00e4itame, kuidas OpenShiftis k\u00e4ivitada arendusserver oma rakenduse jaoks ja tagada kohapealsete ja eemalsete failide s\u00fcnkroonimine.<\/p>\n<h3>Selle seeria artiklite sisu<\/h3>\n<p><\/p>\n<ul>\n<li>Osa 1: <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/511954\/\">kuidas juurutada kaasaegseid veebirakendusi vaid m\u00f5ne sammuga<\/a><\/noindex>;<\/li>\n<li>Osa 2: kuidas rakendada uut S2I pilti koos juba olemasoleva HTTP-serveri pildiga, n\u00e4iteks NGINX, kasutades OpenShifti seotud ehitusi tootmisjuurutuse korraldamiseks;<\/li>\n<li>Osa 3: kuidas avada OpenShift platvormil arendusserver oma rakendusele ja s\u00fcnkroonida see kohaliku failis\u00fcsteemiga.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Lisavahendid<\/h3>\n<p><\/p>\n<ul>\n<li>Tasuta e-raamat <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/books\/deploying-openshift\">OpenShifti paigaldamine<\/a><\/noindex>.<\/li>\n<li>Teave <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/kubernetes\/\">OpenShift ja Kubernetes<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>Allikas: <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 4.9.10 - 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. \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\" \/>\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\/et\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-2-svyazannye-sborki-chained-builds\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 4.9.10\" \/>\n\t\t<meta property=\"og:locale\" content=\"et_EE\" \/>\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. \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\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/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\udd47Kaasaegsed rakendused OpenShiftis, osa 2: seotud ehitused chained builds | ProHoster","description":"Tere k\u00f5igile! Meie teises postituses tutvustame, kuidas avaldada kaasaegseid veebirakendusi Red Hat OpenShift platvormil. Eelmises postituses r\u00e4\u00e4kisime veidi uue S2I (source-to-image) builder-pildi v\u00f5imalustest, mis on m\u00f5eldud kaasaegsete veebirakenduste koostamiseks ja avaldamiseks OpenShift platvormil. Siis keskendusime rakenduse kiirele paigaldamisele, aga t\u00e4na vaatame, kuidas","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-2-svyazannye-sborki-chained-builds","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"et_EE","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. \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","og:url":"https:\/\/prohoster.info\/et\/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"},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/90874","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/comments?post=90874"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/90874\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/90875"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=90874"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=90874"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=90874"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}