{"id":92048,"date":"2020-08-22T07:42:57","date_gmt":"2020-08-22T05:42:57","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines"},"modified":"2020-08-22T07:42:57","modified_gmt":"2020-08-22T05:42:57","slug":"sovremennye-prilozheniya-na-openshift-chast-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines","status":"publish","type":"post","link":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines","title":{"rendered":"Kaasaegsed rakendused OpenShiftis, osa 3: OpenShift arenduskeskkonnana ja OpenShift Pipelines","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Tere k\u00f5igile sellele blogisse! Teiega on kolmas postitus seeriast, kus me n\u00e4itame, kuidas juurutada kaasaegseid veebirakendusi Red Hat OpenShiftis.<\/p>\n<p><img decoding=\"async\" alt=\"Kaasaegsed rakendused OpenShiftis, osa 3: OpenShift arenduskeskkonnana ja OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/9c3337b13a3f045d36343308ce6154cc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nKahes eelnevas postituses r\u00e4\u00e4kisime, kuidas juurutada kaasaegseid veebirakendusi vaid m\u00f5ne sammuga ja kuidas kasutada uut S2I pilti koos valmidus HTTP-serveriga, nagu NGINX, seotud kogumiste (chained builds) abil produktsiooni juurutamiseks.<\/p>\n<p>T\u00e4na n\u00e4itame, kuidas k\u00e4ivitada OpenShiftis arendusserver oma rakenduse jaoks ja s\u00fcnkroonida see kohaliku failis\u00fcsteemiga, samuti arutame, mis on OpenShift Pipelines ja kuidas seda saab kasutada alternatiivina seotud kogumistele.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>OpenShift arenduskeskkonnana<\/h3>\n<p><\/p>\n<h4>Arendust\u00f6\u00f6voog (development workflow)<\/h4>\n<p>\nNagu juba mainitud <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/511954\/\">esimeses postituses<\/a><\/noindex>, t\u00fc\u00fcpiline arendusprotsess kaasaegsete veebirakenduste jaoks on lihtsalt mingi \u201earendusserver\u201c, mis j\u00e4lgib muudatusi kohalikes failides. Kui need toimuvad, k\u00e4ivitatakse rakenduse kogumine ja seej\u00e4rel uuendatakse seda brauseris.<\/p>\n<p>Enamikus kaasaegsetes raamistikudes on selline \u201earendusserver\u201c integreeritud vastavatesse k\u00e4surea t\u00f6\u00f6riistadesse.<\/p>\n<h4>Kohalik n\u00e4ide<\/h4>\n<p>\nAlustame vaatamist, kuidas see t\u00f6\u00f6tab kohaliku rakenduste k\u00e4ivitamise korral. N\u00e4iteks v\u00f5tame rakenduse <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lholmquist\/react-web-app\">React<\/a><\/noindex> eelmistest artiklitest, kuigi praktiliselt samad t\u00f6\u00f6voo kontseptsioonid kehtivad ka k\u00f5igi teiste kaasaegsete raamistikude puhul.<br \/>\nNii et, et k\u00e4ivitada \u201earendusserver\u201c meie Reacti n\u00e4ites, sisestame j\u00e4rgmise k\u00e4su:<\/p>\n<pre><code class=\"plaintext\">$ npm run start\n<\/code><\/pre>\n<p>\nSiis n\u00e4eme terminali aknas umbes j\u00e4rgmist:<\/p>\n<p><img decoding=\"async\" alt=\"Kaasaegsed rakendused OpenShiftis, osa 3: OpenShift arenduskeskkonnana ja OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/06f84ffb4c9a6a5868b8b47b8ad1d9ec.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ja meie rakendus avaneb brauseris vaikimisi:<\/p>\n<p><img decoding=\"async\" alt=\"Kaasaegsed rakendused OpenShiftis, osa 3: OpenShift arenduskeskkonnana ja OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/72341bb0796352e7343bf31ceb8233cd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>N\u00fc\u00fcd, kui me teeme muudatusi failis, peaks rakendus brauseris uuendama.<\/p>\n<p>Olgu, arendamine kohaliku re\u017eiimis on selge, aga kuidas saavutada sama OpenShiftis?<\/p>\n<h4>Arendusserver OpenShiftis<\/h4>\n<p>\nKui m\u00e4letate, siis <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/513948\/\">t\u00f5in v\u00e4lja, et satelliidid ja praht, mis asuvad alla 600 km, kukuvad orbitaalilt paariaastaga \u2014 atmosf\u00e4\u00e4ri takistuse t\u00f5ttu, v\u00e4hendades oluliselt Kessleri s\u00fcndroomi v\u00f5imalusi. SpaceX'i tegevus prahi osas tundub, nagu nad ei m\u00f5tleks \u00fcldse kosmosereostusele. Vaadates Starlinki elluviimise detaile, on mul raske ette kujutada paremat moodust prahi hulga v\u00e4hendamiseks orbiidil.<\/a><\/noindex>, k\u00e4sitlesime nii nimetatud k\u00e4ivitamisfaasi (run phase) S2I pildis ja n\u00e4gime, et meie veebirakendust teenindab vaikeselt moodul serve.<\/p>\n<p>Kuid kui l\u00e4hemalt vaadata <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/ubi8-s2i-web-app\/blob\/master\/s2i\/run#L10\">k\u00e4ivitusskripti<\/a><\/noindex> selles n\u00e4ites, siis on seal keskkonnamuutuja $NPM_RUN, mis v\u00f5imaldab k\u00e4ivitada ka oma k\u00e4su.<\/p>\n<p>N\u00e4iteks v\u00f5ime kasutada moodulit nodeshift, et k\u00e4ivitada meie rakendus:<\/p>\n<pre><code class=\"plaintext\">$ npx nodeshift --deploy.env NPM_RUN=&quot;yarn start&quot; --dockerImage=nodeshift\/ubi8-s2i-web-app\n<\/code><\/pre>\n<p>\n<i>M\u00e4rkus: eespool toodud n\u00e4ide on l\u00fchendatud, et illustreerida \u00fcldist ideed.<\/i><\/p>\n<p>Siin lisasime meie juurutamisele keskkonnamuutuja NPM_RUN, mis \u00fctleb t\u00e4itmisetapile, et ta peab k\u00e4ivitama k\u00e4su yarn start, mis k\u00e4ivitab Reacti arendusserveri meie OpenShifti pod'is.<\/p>\n<p>Kui vaadata t\u00f6\u00f6tava pod'i logi, siis seal on umbkaudu j\u00e4rgmine:<\/p>\n<p><img decoding=\"async\" alt=\"Kaasaegsed rakendused OpenShiftis, osa 3: OpenShift arenduskeskkonnana ja OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/5b090223e08e32a3356608881068ce1a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Muidugi, see k\u00f5ik ei t\u00e4henda midagi, kuni me suudame s\u00fcnkroonida kohalikku koodi koodiga, mis samuti muutuste osas kontrollitakse, kuid elab kaugserveris.<\/p>\n<h4>Kauakoodide ja kohalike koodide s\u00fcnkroniseerimine<\/h4>\n<p>\n\u00d5nneks aitab nodeshift s\u00fcnkroniseerimist h\u00f5lpsalt ning muutuste j\u00e4lgimiseks v\u00f5ib kasutada k\u00e4sku watch.<\/p>\n<p>Nii et p\u00e4rast seda, kui oleme k\u00e4ivitanud k\u00e4su arendusserveri k\u00e4ivitamiseks meie rakenduse jaoks, saame julgesti kasutada sellist k\u00e4sku:<\/p>\n<pre><code class=\"plaintext\">$ npx nodeshift watch\n<\/code><\/pre>\n<p>\nTulemuseks on \u00fchendamine k\u00e4ivitatud pod'iga, mille me varem l\u00f5ime, aktiveeritakse meie kohalike failide s\u00fcnkroniseerimine kaugklastriga ja failid meie kohalikus s\u00fcsteemis hakkavad muutuste osas j\u00e4lgima.<\/p>\n<p>Seega, kui n\u00fc\u00fcd uuendada faili src\/App.js, reageerib s\u00fcsteem nendele muutustele, kopeerib need kaugklastrisse ja k\u00e4ivitab arendusserveri, mis seej\u00e4rel v\u00e4rskendab meie rakendust brauseris.<\/p>\n<p>T\u00e4ielikkuse huvides n\u00e4itame, millised need k\u00e4sud kokku n\u00e4evad:<\/p>\n<pre><code class=\"plaintext\">$ npx nodeshift --strictSSL=false --dockerImage=nodeshift\/ubi8-s2i-web-app --build.env YARN_ENABLED=true --expose --deploy.env NPM_RUN=&quot;yarn start&quot; --deploy.port 3000\n\n$ npx nodeshift watch --strictSSL=false\n<\/code><\/pre>\n<p>\nK\u00e4sk watch on abstraktsioon k\u00e4sust oc rsync, lisainfot selle toimimise kohta saab leida. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.okd.io\/latest\/dev_guide\/copy_files_to_container.html\">siin<\/a><\/noindex>.<\/p>\n<p>See oli n\u00e4ide Reactist, kuid t\u00e4pselt sama meetodit saab kasutada ka teiste raamistikudega, lihtsalt seadke keskkonnamuutuja NPM_RUN \u00f5igesti.<br \/>\n\u2003<\/p>\n<h3>OpenShift Pipelines'i torud<\/h3>\n<p><img decoding=\"async\" alt=\"Kaasaegsed rakendused OpenShiftis, osa 3: OpenShift arenduskeskkonnana ja OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/33b932d3591b22dd00d82509b352d489.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Edasi r\u00e4\u00e4gime sellisest t\u00f6\u00f6riistast kui OpenShift Pipelines ja sellest, kuidas seda saab kasutada alternatiividena seotud kogumitele chained build.<\/p>\n<h4>Mis on OpenShift Pipelines<\/h4>\n<p>\nOpenShift Pipelines on pilvep\u00f5hine CI\/CD-s\u00fcsteem, mis on m\u00f5eldud konveierite korraldamiseks Tektoni abil. Tekton on paindlik Kubernetes'i kohaletoimetamise ja integreerimise raamistik, millel on avatud l\u00e4htekood, mis v\u00f5imaldab automatiseerida juurutamist erinevates platvormides (Kubernetes, serverless, virtuaalmasinad jne) madalama taseme abstrakteerimise kaudu.<\/p>\n<p>Selle artikli m\u00f5istmiseks on vajalikud teatud teadmised Pipelines'ist, seega soovitame tungivalt alustada <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openshift\/pipelines-tutorial\">ametlikust \u00f5pikust<\/a><\/noindex>.<\/p>\n<h4>T\u00f6\u00f6ruumi seadistamine<\/h4>\n<p>\nEt m\u00e4ngida selle artikli n\u00e4idistega, tuleb esmalt ette valmistada t\u00f6\u00f6ruum:<\/p>\n<ol>\n<li>Installida ja seadistada OpenShift 4 klastri. Meie n\u00e4idetes kasutatakse selleks CodeReady Containers (CRD), mille installimise juhised leiate <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.redhat.com\/openshift\/install\/crc\/installer-provisioned\">siin<\/a><\/noindex>.<\/li>\n<li>Kui klaster on valmis, tuleb sellele installida Pipeline Operator. \u00c4rge muretsege, see on lihtne, installimise juhised <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openshift\/pipelines-tutorial\/blob\/master\/install-operator.md\">siin<\/a><\/noindex>.<\/li>\n<li>Laadi alla <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tektoncd\/cli#installing-tkn\">Tekton CLI<\/a><\/noindex> (tkn) <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/tektoncd\/cli#installing-tkn\">siin<\/a><\/noindex>.<\/li>\n<li>K\u00e4ivitada k\u00e4surea t\u00f6\u00f6riist create-react-app, et luua rakendus, mida hiljem juurutatakse (see on lihtne rakendus <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift-starters\/react-pipeline-example\">React<\/a><\/noindex>).<\/li>\n<li>(Valikuline) Kloonige hoidla, et kohapeal k\u00e4itada rakenduse n\u00e4idet k\u00e4suga npm install ja seej\u00e4rel npm start.<\/li>\n<\/ol>\n<p>\nRakenduse hoidlas on samuti kaust k8s, kus asuvad Kubernetes'\/OpenShift'i YAML-failid, mida kasutatakse rakenduse juurutamiseks. Seal on \u00fclesanded, ClusterTasks, ressursid ja Pipelines, mille me selles <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/webapp-pipeline-tutorial\">hoidlad<\/a><\/noindex>.<\/p>\n<h4>Alustame<\/h4>\n<p>\nEsmalt tuleb meie n\u00e4ite jaoks luua uus projekt OpenShift klastris. Nimetame selle projekti webapp-pipeline ja loome selle j\u00e4rgmise k\u00e4suga:<\/p>\n<pre><code class=\"plaintext\">$ oc new-project webapp-pipeline\n<\/code><\/pre>\n<p>\nEdasi toob see projekti nimi koodis esile, seega kui otsustate nimetada selle kuidagi teisiti, \u00e4rge unustage vastavalt muuta n\u00e4idiskoodi. Alates sellest kohast liikume mitte \u00fclevalt alla, vaid alt \u00fcles: see t\u00e4hendab, et esmalt loome k\u00f5ik konveieri komponendid ja alles siis selle enda.<\/p>\n<p>Nii et, k\u00f5igepealt\u2026<\/p>\n<h4>\u00dclesanded<\/h4>\n<p>\nLoome kaks \u00fclesannet (tasks), mis aitavad hiljem meie rakenduse juurutamist meie torustiku (pipeline) raames. Esimene \u00fclesanne \u2013 apply_manifests_task \u2013 vastutab nende Kubernetes-resursside (service, deployment ja route) rakendamise eest, mis asuvad meie rakenduse k8s kaustas. Teine \u00fclesanne \u2013 update_deployment_task \u2013 vastutab juba juurutatud pildi uuendamise eest, kasutades meie torustiku genereeritud pilti.<\/p>\n<p>\u00c4rge muretsege, kui see praegu veel selge pole. Tegelikult on need \u00fclesanded midagi nagu utiliidid ja me k\u00e4sitleme neid l\u00e4hemalt natuke hiljem. Seniks loome need lihtsalt:<\/p>\n<pre><code class=\"plaintext\">$ oc create -f https:\/\/raw.githubusercontent.com\/nodeshift\/webapp-pipeline-tutorial\/master\/tasks\/update_deployment_task.yaml\n$ oc create -f https:\/\/raw.githubusercontent.com\/nodeshift\/webapp-pipeline-tutorial\/master\/tasks\/apply_manifests_task.yaml\n<\/code><\/pre>\n<p>\nSeej\u00e4rel kontrollime tkn CLI k\u00e4suga, et \u00fclesanded on loodud:<\/p>\n<pre><code class=\"plaintext\">$ tkn task ls\n\nNAME                AGE\napply-manifests     1 minute ago\nupdate-deployment   1 minute ago\n<\/code><\/pre>\n<p>\n<i>M\u00e4rkus: need on teie kohaliku projekti \u00fclesanded.<\/i><\/p>\n<h4>Klastrilised \u00fclesanded (Cluster tasks)<\/h4>\n<p>\nKlastrilised \u00fclesanded on p\u00f5him\u00f5tteliselt sama, mis tavalised \u00fclesanded. See t\u00e4hendab, et need on taaskasutatavad sammude kogumid, mida kombineeritakse erinevatel viisidel konkreetse \u00fclesande k\u00e4ivitamisel. Erinevus on see, et klastriline \u00fclesanne on kergesti k\u00e4ttesaadav kogu klastris. Klastriliste \u00fclesannete nime n\u00e4gemiseks, mis luuakse automaatselt, kui lisatakse Pipeline Operator, kasutame taas tkn CLI k\u00e4sku:<\/p>\n<pre><code class=\"plaintext\">$ tkn clustertask ls\n\nNAME                       AGE\nbuildah                    1 day ago\nbuildah-v0-10-0            1 day ago\njib-maven                  1 day ago\nkn                         1 day ago\nmaven                      1 day ago\nopenshift-client           1 day ago\nopenshift-client-v0-10-0   1 day ago\ns2i                        1 day ago\ns2i-go                     1 day ago\ns2i-go-v0-10-0             1 day ago\ns2i-java-11                1 day ago\ns2i-java-11-v0-10-0        1 day ago\ns2i-java-8                 1 day ago\ns2i-java-8-v0-10-0         1 day ago\ns2i-nodejs                 1 day ago\ns2i-nodejs-v0-10-0         1 day ago\ns2i-perl                   1 day ago\ns2i-perl-v0-10-0           1 day ago\ns2i-php                    1 day ago\ns2i-php-v0-10-0            1 day ago\ns2i-python-3               1 day ago\ns2i-python-3-v0-10-0       1 day ago\ns2i-ruby                   1 day ago\ns2i-ruby-v0-10-0           1 day ago\ns2i-v0-10-0                1 day ago\n<\/code><\/pre>\n<p>\nN\u00fc\u00fcd loome kaks klastrilist \u00fclesannet. Esimene loob S2I pildi ja saadab selle OpenShift'i siseregisterisse; teine \u2013 ehitab meie pilti NGINX-i p\u00f5hjal, kasutades juba koostatud rakendust sisu kujul.<\/p>\n<h4>Loome ja saadame pildi<\/h4>\n<p>\nLoomis esimest \u00fclesannet, kordame seda, mida oleme juba teinud eelnevas artiklis seotud kogumite kohta. Kordame, et kasutasime S2I (ubi8-s2i-web-app) pilti, et 'koostada' oma rakendus, ja l\u00f5puks saime pildi, mis salvestati OpenShift'i siseregistrisse. N\u00fc\u00fcd kasutame seda S2I-pilti veebirakendusest, et luua oma rakenduse DockerFile ning siis rakendame Buildah'it, et teostada tegelik koostamine ja edastada saadud pilt OpenShift'i siseregistrisse, kuna see on t\u00e4pselt see, mida OpenShift teeb, kui deployd oma rakendusi NodeShift'i abil.<\/p>\n<p>K\u00fcsite, kust me k\u00f5ik selle teadsime? <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openshift\/pipelines-catalog\/blob\/master\/s2i-nodejs\/s2i-nodejs-task.yaml\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 official Node.js<\/a><\/noindex>, me kopeerisime selle ja kohandasime enda vajadustele.<\/p>\n<p>N\u00fc\u00fcd loome klastrite \u00fclesande s2i-web-app:<\/p>\n<pre><code class=\"plaintext\">$ oc create -f https:\/\/raw.githubusercontent.com\/nodeshift\/webapp-pipeline-tutorial\/master\/clustertasks\/s2i-web-app-task.yaml\n<\/code><\/pre>\n<p>\nMe ei hakka seda detailselt arutama, vaid peatume ainult OUTPUT_DIR parameetril:<\/p>\n<pre><code class=\"plaintext\">params:\n      - name: OUTPUT_DIR\n        description: Koostamise v\u00e4ljundi katalooge asukoht\n        default: build\n<\/code><\/pre>\n<p>\nMugluse p\u00f5hiselt on see parameeter equals build, just sinna paneb React koos toestatud sisu. Teistes raamistikes kasutatakse teisi teid, n\u00e4iteks Ember'is on see dist. Meie esimeselt klastrite \u00fclesande v\u00e4ljund representatsioon kajastab pilti, mis sisaldab koostatud HTML, JavaScript ja CSS.<\/p>\n<h4>Koostame pildi NGINX'i p\u00f5hjal<\/h4>\n<p>\nSee, mis meie teise klastrite \u00fclesande osas, peab see koguma meile pildi NGINX'i p\u00f5hjal, kasutades juba koostatud rakenduse sisu. Sisuliselt on see see osa eelmisest jaos, kus me k\u00e4sitlesime seotud kogumite (chained builds) teemat.<\/p>\n<p>Selleks loome - t\u00e4pselt nagu \u00fclalpool - klastrite \u00fclesande webapp-build-runtime:<\/p>\n<pre><code class=\"plaintext\">$ oc create -f https:\/\/raw.githubusercontent.com\/nodeshift\/webapp-pipeline-tutorial\/master\/clustertasks\/webapp-build-runtime-task.yaml\n<\/code><\/pre>\n<p>\nKui vaadata nende klastrite \u00fclesannete koodi, on n\u00e4ha, et seal ei ole t\u00e4psustatud Git'i repositooriumit, millega me t\u00f6\u00f6tame, ega ka pilti, mida me loome. Me lihtsalt m\u00e4\u00e4rame, mida me Git'i edastame v\u00f5i mingisugust pilti, kuhu l\u00f5pptoode pilt tuleb edastada. Just selle t\u00f5ttu saab neid klastrite \u00fclesandeid taaskasutada ka teiste rakenduste korral.<\/p>\n<p>Ja siin liigume elegantset j\u00e4rgmise punkti juurde...<\/p>\n<h4>Resursid<\/h4>\n<p>\nNii et, kuna nagu me just r\u00e4\u00e4kisime, peavad klastrite \u00fclesanded olema maksimaalselt \u00fcldistavad, peame looma ressursid, mis kasutavad sisendit (Git repository) ja v\u00e4ljundit (l\u00f5plikud pildid). Esimene ressurs, mida vajame, on Git, kus meie rakendus asub, n\u00e4iteks midagi sellist:<\/p>\n<pre><code class=\"plaintext\"># This resource is the location of the git repo with the web application source\napiVersion: tekton.dev\/v1alpha1\nkind: PipelineResource\nmetadata:\n  name: web-application-repo\nspec:\n  type: git\n  params:\n    - name: url\n      value: https:\/\/github.com\/nodeshift-starters\/react-pipeline-example\n    - name: revision\n      value: master\n<\/code><\/pre>\n<p>\nSiin on PipelineResource t\u00fc\u00fcpi git. Klahv url section params m\u00e4\u00e4rab konkreetse repostaari ja seab master haru (see on valikuline, kuid kirjutame selle t\u00e4iuslikkuse nimel).<\/p>\n<p>N\u00fc\u00fcd peame looma ressursi pildi jaoks, kuhu salvestatakse s2i-web-app \u00fclesande tulemused, see tehakse nii:<\/p>\n<pre><code class=\"plaintext\"># This resource is the result of running &quot;npm run build&quot;,  the resulting built files will be located in \/opt\/app-root\/output\napiVersion: tekton.dev\/v1alpha1\nkind: PipelineResource\nmetadata:\n  name: built-web-application-image\nspec:\n  type: image\n  params:\n    - name: url\n      value: image-registry.openshift-image-registry.svc:5000\/webapp-pipeline\/built-web-application:latest\n<\/code><\/pre>\n<p>\nSiin on PipelineResource t\u00fc\u00fcpi image, ja parameetri url v\u00e4\u00e4rtus viitab sisemisele OpenShift Image Registry'le, t\u00e4psemalt sellele, mis asub nimel webapp-pipeline. \u00c4rge unustage muuta seda parameetrit, kui kasutate teistsugust nimeala.<\/p>\n<p>Ja l\u00f5puks, viimane ressurs, mida vajame, on samuti pildi t\u00fc\u00fcpi ning see on l\u00f5plik pilt NGINX, mida kasutatakse hiljem juurutamisel:<\/p>\n<pre><code class=\"plaintext\"># This resource is the image that will be just the static html, css, js files being run with nginx\napiVersion: tekton.dev\/v1alpha1\nkind: PipelineResource\nmetadata:\n  name: runtime-web-application-image\nspec:\n  type: image\n  params:\n    - name: url\n      value: image-registry.openshift-image-registry.svc:5000\/webapp-pipeline\/runtime-web-application:latest\n<\/code><\/pre>\n<p>\nJa j\u00e4lle, p\u00f6\u00f6rake t\u00e4helepanu, et see ressurs salvestab pildi OpenShift'i sisemisse registrisse nimel webapp-pipeline.<\/p>\n<p>Kuna k\u00f5ik need ressursid luua, kasutame k\u00e4sku create:<\/p>\n<pre><code class=\"plaintext\">$ oc create -f https:\/\/raw.githubusercontent.com\/nodeshift\/webapp-pipeline-tutorial\/master\/resources\/resource.yaml\n<\/code><\/pre>\n<p>\nVeenduda, et ressursid on loodud, saab nii:<\/p>\n<pre><code class=\"plaintext\">$ tkn resource ls\n<\/code><\/pre>\n<p><\/p>\n<h4>Torni konveier<\/h4>\n<p>\nN\u00fc\u00fcd, kui meil on k\u00f5ik vajalikud koostisosad, kogume neist konveieri, luues selle j\u00e4rgmise k\u00e4suga:<\/p>\n<pre><code class=\"plaintext\">$ oc create -f https:\/\/raw.githubusercontent.com\/nodeshift\/webapp-pipeline-tutorial\/master\/pipelines\/build-and-deploy-react.yaml\n<\/code><\/pre>\n<p>\nKuid enne, kui k\u00e4ivitame selle k\u00e4su, vaatame \u00fcle need koostisosad. Esimene on nimi:<\/p>\n<pre><code class=\"plaintext\">apiVersion: tekton.dev\/v1alpha1\nkind: Pipeline\nmetadata:\n  name: build-and-deploy-react\n<\/code><\/pre>\n<p>\nSeej\u00e4rel n\u00e4eme section spec's ressursse, mille me varem l\u00f5ime:<\/p>\n<pre><code class=\"plaintext\">spec:\n  resources:\n    - name: web-application-repo\n      type: git\n    - name: built-web-application-image\n      type: image\n    - name: runtime-web-application-image\n      type: image\n<\/code><\/pre>\n<p>\nSeej\u00e4rel loome \u00fclesanded, mida meie konveier peab t\u00e4itma. Esmalt peab ta t\u00e4itma juba loodud \u00fclesande s2i-web-app:<\/p>\n<pre><code class=\"plaintext\">tasks:\n    - name: build-web-application\n      taskRef:\n        name: s2i-web-app\n        kind: ClusterTask\n<\/code><\/pre>\n<p>\nSee \u00fclesanne v\u00f5tab sisendi (gir-ressurss) ja v\u00e4ljundi (ressurs built-web-application-image) parameetrid. Me edastame talle samuti eriparameetri, et ta ei verifitseeriks TLS-i, kuna kasutame isesallekooditud sertifikaate:<\/p>\n<pre><code class=\"plaintext\">resources:\n        inputs:\n          - name: source\n            resource: web-application-repo\n        outputs:\n          - name: image\n            resource: built-web-application-image\n      params:\n        - name: TLSVERIFY\n          value: &quot;false&quot;\n<\/code><\/pre>\n<p>\nJ\u00e4rgmine \u00fclesanne on peaaegu sama, kuid siin kutsume juba loodud klastrite \u00fclesannet webapp-build-runtime:<\/p>\n<pre><code class=\"plaintext\">nimi: ehita-runtime-pilt\n    \u00fclesanneViide:\n      nimi: webapp-build-runtime\n      t\u00fc\u00fcp: ClusterTask\n<\/code><\/pre>\n<p>\nNagu eelmise \u00fclesande puhul, edastame ressursi, kuid n\u00fc\u00fcd on see ehitatud-veebirakenduse-pilt (meie eelmise \u00fclesande v\u00e4ljund). Ja v\u00e4ljundina m\u00e4\u00e4rame taas pildi. Kuna see \u00fclesanne peab toimuma p\u00e4rast eelmist, lisame v\u00e4lja runAfter:<\/p>\n<pre><code class=\"plaintext\">resources:\n        inputs:\n          - name: image\n            resource: built-web-application-image\n        outputs:\n          - name: image\n            resource: runtime-web-application-image\n        params:\n        - name: TLSVERIFY\n          value: &quot;false&quot;\n      runAfter:\n        - build-web-application\n<\/code><\/pre>\n<p>\nJ\u00e4rgmised kaks \u00fclesannet vastutavad YAMLi-failide rakendamise eest, mis puudutavad teenust, marsruuti ja juurutamist, mis elavad meie veebirakenduse katalogis k8s, ning nende juurutamine uute piltide loomisel. Need kaks klastrite \u00fclesannet m\u00e4\u00e4rasime juba artikli alguses.<\/p>\n<h4>Konteineri k\u00e4ivitamine<\/h4>\n<p>\nNii et k\u00f5ik meie konveieri osad on loodud ja k\u00e4ivitame selle j\u00e4rgmise k\u00e4suga:<\/p>\n<pre><code class=\"plaintext\">$ tkn pipeline start build-and-deploy-react\n<\/code><\/pre>\n<p>\nSelles etapis kasutatakse k\u00e4surea liidest interaktiivses re\u017eiimis ning tuleb valida vastavad ressursid iga tema p\u00e4ringu vastusena: allika git jaoks valime veebirakenduse-repo, seej\u00e4rel esimese pildi jaoks \u2013 ehitatud-veebirakenduse-pilt, ja l\u00f5puks teise pildi jaoks \u2013 runtime-veebirakenduse-pilt:<\/p>\n<pre><code class=\"plaintext\">? Choose the git resource to use for web-application-repo: web-application-repo (https:\/\/github.com\/nodeshift-starters\/react-pipeline-example)\n? Choose the image resource to use for built-web-application-image: built-web-application-image (image-registry.openshift-image-registry.svc:5000\/webapp-pipeline\/built-web-\napplication:latest)\n? Choose the image resource to use for runtime-web-application-image: runtime-web-application-image (image-registry.openshift-image-registry.svc:5000\/webapp-pipeline\/runtim\ne-web-application:latest)\nPipelinerun started: build-and-deploy-react-run-4xwsr\n<\/code><\/pre>\n<p>\nN\u00fc\u00fcd kontrollime konveieri olekut j\u00e4rgmise k\u00e4suga:<\/p>\n<pre><code class=\"plaintext\">$ tkn pipeline logs -f\n<\/code><\/pre>\n<p>\nP\u00e4rast konveieri k\u00e4ivitamist ja rakenduse juurutamist k\u00fcsime avaldatud marsruuti j\u00e4rgmise k\u00e4suga:<\/p>\n<pre><code class=\"plaintext\">$ oc get route react-pipeline-example --template='http:\/\/{{.spec.host}}'\n<\/code><\/pre>\n<p>\nVisualiseerimise paremuse nimel v\u00f5ime vaadata meie konveienti arendaja re\u017eiimis veebikonsolis jaotises <b>Torud<\/b>, nagu on n\u00e4idatud joonisel 1.<\/p>\n<p><img decoding=\"async\" alt=\"Kaasaegsed rakendused OpenShiftis, osa 3: OpenShift arenduskeskkonnana ja OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/ede9b076414e389c2cd212adeda08956.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Joonis 1. K\u00e4ivitatud konveieride \u00fclevaade.<\/i><\/p>\n<p>Kl\u00f5psamine k\u00e4ivitatud konveieril kuvab t\u00e4iendavaid \u00fcksikasju, nagu on n\u00e4idatud joonisel 2.<\/p>\n<p><img decoding=\"async\" alt=\"Kaasaegsed rakendused OpenShiftis, osa 3: OpenShift arenduskeskkonnana ja OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/64581b1f6d8ff91aedd963019ef29be5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Joonis 2. T\u00e4iendavad \u00fcksikasjad konveieri kohta.<\/i><\/p>\n<p>P\u00e4rast t\u00e4iendavate \u00fcksikasjade vaatamist v\u00f5ime vaadata k\u00e4ivitatud rakendusi vaates <b>Topoloogia<\/b>, nagu on n\u00e4idatud joonisel 3.<\/p>\n<p><img decoding=\"async\" alt=\"Kaasaegsed rakendused OpenShiftis, osa 3: OpenShift arenduskeskkonnana ja OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/d23f723e14514ff60ecfddd8eb9bf752.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Joonis 3. K\u00e4ivitatud pod.<\/i><\/p>\n<p>Kl\u00f5psamine ikooni paremas \u00fclanurgas avab meie rakenduse, nagu on n\u00e4idatud joonisel 4.<\/p>\n<p><img decoding=\"async\" alt=\"Kaasaegsed rakendused OpenShiftis, osa 3: OpenShift arenduskeskkonnana ja OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/aa8e09d9fd9f33d5faffc7f661d84ca4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Joonis 4. K\u00e4ivitatud Reacti rakendus.<\/i><\/p>\n<h3>Kokkuv\u00f5te<\/h3>\n<p>\nNii et, me n\u00e4itasime, kuidas k\u00e4ivitada OpenShiftis arendusserver oma rakendusele ja s\u00fcnkroonida see kohaliku failis\u00fcsteemiga. Samuti r\u00e4\u00e4kisime, kuidas simuleerida chained-build mallide abil OpenShift Pipelines. K\u00f5ik n\u00e4idiskoodid, mis selles artiklis on, on kergesti saadaval <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/webapp-pipeline-tutorial\">siin<\/a><\/noindex>.<\/p>\n<h3>Lisaressursid (EN)<\/h3>\n<p><\/p>\n<ul>\n<li>Tasuta e-raamat <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/books\/deploying-openshift\/\">\u201eArendamine OpenShiftis: juhend rahututele\u201c<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/06\/11\/container-native-nodejs-istio-rhoar\/\">Konteinerikesksete Node.js rakenduste ehitamine Red Hat OpenShift Application Runtimes ja Istio abil<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/05\/15\/debug-your-node-js-application-on-openshift-with-chrome-devtools\/\">Node.js rakenduste t\u00f5rkeotsing OpenShiftis Chrome DevTools abil<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/04\/16\/zero-express-openshift-3-commands\/\">Kolm k\u00e4sku, et alates algusest omandada Express OpenShiftis<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/03\/12\/rhoar-nodejs-annoucement\/\">Red Hat OpenShift Application Runtimes sisaldava Node.js avaliku versiooni v\u00e4ljaanne<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/12\/21\/monitoring-node-js-applications-on-openshift-with-prometheus\/\">Node.js rakenduste j\u00e4lgimine OpenShiftis Prometheusega<\/a><\/noindex><\/li>\n<li>Teised artiklid teemal <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/kubernetes\/\">OpenShift ja Kubernetes<\/a><\/noindex> Red Hati veebilehel<\/li>\n<\/ul>\n<h3>Tulevaste veebiseminaride teatamine<\/h3>\n<p>\nK\u00e4ivitame n\u00e4dalavahetuste veebiseminaride sarja, mis k\u00e4sitleb Red Hat OpenShift Container Platformi ja Kubernetesega t\u00f6\u00f6tamise loomulikku kogemust:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/events.redhat.com\/profile\/form\/index.cfm?PKformID=0x232599abcd&amp;sc_cid=7013a000002gwqQAAQ\"><b>28. august, veebinar 'Imperatoor': O\u043f\u0435\u0440\u0430\u0442\u043e\u0440id OpenShiftis ja Kuberneteses<\/b><\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/events.redhat.com\/profile\/form\/index.cfm?PKformID=0x232694abcd&amp;sc_cid=7013a000002gwrdAAA\"><b>11. septembril, DeploymentConfig vs Deployment \u2013 OpenShifti spetsiifilised maagilised asjad rakenduste ehitamiseks ja juurutamiseks<\/b><\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/events.redhat.com\/profile\/form\/index.cfm?PKformID=0x232789abcd&amp;sc_cid=7013a000002gws7AAA\"><b>25. septembril, Red Hat OpenShift ja Machine API<\/b><\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/events.redhat.com\/profile\/form\/index.cfm?PKformID=0x232884abcd&amp;sc_cid=7013a000002gwsqAAA\"><b>9. oktoobril, Kuidas toime tulla \u00e4kilise koormuse kasvuga<\/b><\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/events.redhat.com\/profile\/form\/index.cfm?PKformID=0x232979abcd&amp;sc_cid=7013a000002gwumAAA\"><b>23. oktoobril, Sisseehitatud Jenkins, Pipeline-builds, Tekton Red Hat OpenShift Container Platformis<\/b><\/a><\/noindex><\/li>\n<\/ul>\n<p>Allikas: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/515988\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442 \u0432\u0441\u0435\u043c \u0432 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u0433\u0435! \u0421 \u0432\u0430\u043c\u0438 \u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u043e\u0441\u0442 \u0438\u0437 \u0441\u0435\u0440\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043a\u0430\u043a \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Red Hat OpenShift. \u0412 \u0434\u0432\u0443\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0441\u0442\u0430\u0445 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b\u0438, \u043a\u0430\u043a \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u0437\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0448\u0430\u0433\u043e\u0432 \u0438 \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 S2I \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, NGINX \u0441 \u043f\u043e\u043c\u043e\u0449\u044c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u0431\u043e\u0440\u043e\u043a chained [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":92049,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-92048","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442 \u0432\u0441\u0435\u043c \u0432 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u0433\u0435!\" \/>\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-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\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 3: OpenShift \u043a\u0430\u043a \u0441\u0440\u0435\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u044b OpenShift Pipelines | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442 \u0432\u0441\u0435\u043c \u0432 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u0433\u0435!\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-08-22T05:42:57+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-08-22T05:42:57+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Kaasaegsed rakendused OpenShiftis, osa 3: OpenShift arendusena ja OpenShift Pipelines'i t\u00f6\u00f6n\u00e4dalad | ProHoster","description":"Tere k\u00f5ik siin blogis!","canonical_url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"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 3: OpenShift \u043a\u0430\u043a \u0441\u0440\u0435\u0434\u0430 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0438 \u043a\u043e\u043d\u0432\u0435\u0439\u0435\u0440\u044b OpenShift Pipelines | ProHoster","og:description":"\u041f\u0440\u0438\u0432\u0435\u0442 \u0432\u0441\u0435\u043c \u0432 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u0433\u0435!","og:url":"https:\/\/prohoster.info\/et\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-08-22T05:42:57+00:00","article:modified_time":"2020-08-22T05:42:57+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"92048","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 12:16:43","updated":"2022-10-02 02:53:55","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/92048","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=92048"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/posts\/92048\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media\/92049"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/media?parent=92048"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/categories?post=92048"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/et\/wp-json\/wp\/v2\/tags?post=92048"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}