{"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\/cs\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines","title":{"rendered":"Modern\u00ed aplikace na OpenShift, \u010d\u00e1st 3: OpenShift jako v\u00fdvojov\u00e9 prost\u0159ed\u00ed a potrub\u00ed OpenShift Pipelines","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Ahoj v\u0161em v tomto blogu! Dnes m\u00e1te p\u0159ed sebou t\u0159et\u00ed p\u0159\u00edsp\u011bvek ze s\u00e9rie, ve kter\u00e9 ukazujeme, jak nasazovat modern\u00ed webov\u00e9 aplikace na Red Hat OpenShift.<\/p>\n<p><img decoding=\"async\" alt=\"Modern\u00ed aplikace na OpenShift, \u010d\u00e1st 3: OpenShift jako v\u00fdvojov\u00e9 prost\u0159ed\u00ed a potrub\u00ed OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/9c3337b13a3f045d36343308ce6154cc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nV p\u0159edchoz\u00edch dvou p\u0159\u00edsp\u011bvc\u00edch jsme se pod\u00edvali na to, jak nasadit modern\u00ed webov\u00e9 aplikace b\u011bhem n\u011bkolika m\u00e1lo krok\u016f a jak pou\u017e\u00edvat nov\u00fd obraz S2I v kombinaci s hotov\u00fdm HTTP serverem, nap\u0159\u00edklad NGINX, s pomoc\u00ed propojen\u00fdch sestaven\u00ed chained builds pro organizaci produk\u010dn\u00edho nasazen\u00ed.<\/p>\n<p>Dnes uk\u00e1\u017eeme, jak spustit na platform\u011b OpenShift v\u00fdvojov\u00fd server pro svou aplikaci a synchronizovat ho s m\u00edstn\u00edm souborov\u00fdm syst\u00e9mem, a tak\u00e9 si pov\u00edme o tom, co jsou OpenShift Pipelines a jak je pou\u017e\u00edvat jako alternativu k propojen\u00fdm sestaven\u00edm.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>OpenShift jako v\u00fdvojov\u00e9 prost\u0159ed\u00ed<\/h3>\n<p><\/p>\n<h4>V\u00fdvojov\u00fd pracovn\u00ed postup (development workflow)<\/h4>\n<p>\nJak u\u017e bylo zm\u00edn\u011bno v <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/511954\/\">prvn\u00edm p\u0159\u00edsp\u011bvku<\/a><\/noindex>, standardn\u00ed proces v\u00fdvoje pro modern\u00ed webov\u00e9 aplikace je vlastn\u011b jen n\u011bjak\u00fd 'v\u00fdvojov\u00fd server', kter\u00fd sleduje zm\u011bny v m\u00edstn\u00edch souborech. Kdy\u017e se tyto zm\u011bny objev\u00ed, spust\u00ed se sestaven\u00ed aplikace, a ta se pak aktualizuje v prohl\u00ed\u017ee\u010di.<\/p>\n<p>V\u011bt\u0161ina modern\u00edch r\u00e1mc\u016f m\u00e1 takov\u00fd 'v\u00fdvojov\u00fd server' zabudovan\u00fd ve sv\u00fdch p\u0159\u00edslu\u0161n\u00fdch p\u0159\u00edkazov\u00fdch n\u00e1stroj\u00edch.<\/p>\n<h4>Lok\u00e1ln\u00ed p\u0159\u00edklad<\/h4>\n<p>\nNejd\u0159\u00edve se pod\u00edv\u00e1me, jak to funguje v p\u0159\u00edpad\u011b m\u00edstn\u00edho spu\u0161t\u011bn\u00ed aplikac\u00ed. Jako p\u0159\u00edklad pou\u017eijeme aplikaci <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lholmquist\/react-web-app\">React<\/a><\/noindex> z p\u0159edchoz\u00edch \u010dl\u00e1nk\u016f, a\u010dkoliv stejn\u00e9 koncepty pracovn\u00edho postupu se uplat\u0148uj\u00ed i ve v\u0161ech ostatn\u00edch modern\u00edch r\u00e1mc\u00edch.<br \/>\nTak\u017ee, abychom spustili 'v\u00fdvojov\u00fd server' v na\u0161em p\u0159\u00edkladu s React, zadejte n\u00e1sleduj\u00edc\u00ed p\u0159\u00edkaz:<\/p>\n<pre><code class=\"plaintext\">$ npm run start\n<\/code><\/pre>\n<p>\nPak v okn\u011b termin\u00e1lu uvid\u00edme p\u0159ibli\u017en\u011b toto:<\/p>\n<p><img decoding=\"async\" alt=\"Modern\u00ed aplikace na OpenShift, \u010d\u00e1st 3: OpenShift jako v\u00fdvojov\u00e9 prost\u0159ed\u00ed a potrub\u00ed OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/06f84ffb4c9a6a5868b8b47b8ad1d9ec.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>A na\u0161e aplikace se otev\u0159e v prohl\u00ed\u017ee\u010di podle v\u00fdchoz\u00edho nastaven\u00ed:<\/p>\n<p><img decoding=\"async\" alt=\"Modern\u00ed aplikace na OpenShift, \u010d\u00e1st 3: OpenShift jako v\u00fdvojov\u00e9 prost\u0159ed\u00ed a potrub\u00ed OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/72341bb0796352e7343bf31ceb8233cd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Nyn\u00ed, pokud provedeme zm\u011bny v souboru, aplikace by se m\u011bla v prohl\u00ed\u017ee\u010di aktualizovat.<\/p>\n<p>OK, o v\u00fdvoji v m\u00edstn\u00edm re\u017eimu je v\u0161e jasn\u00e9, ale jak dos\u00e1hnout n\u011b\u010deho podobn\u00e9ho na OpenShift?<\/p>\n<h4>V\u00fdvojov\u00fd server na OpenShift<\/h4>\n<p>\nPokud si pamatujete, v <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/513948\/\">p\u0159edchoz\u00edm p\u0159\u00edsp\u011bvku<\/a><\/noindex>, jsme prob\u00edrali takzvanou f\u00e1zi spu\u0161t\u011bn\u00ed (run phase) obrazu S2I a vid\u011bli jsme, \u017ee na\u0161emu webov\u00e9mu aplikaci standardn\u011b obsluhuje modul serve.<\/p>\n<p>Pokud se v\u0161ak pod\u00edv\u00e1te pozorn\u011bji <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/ubi8-s2i-web-app\/blob\/master\/s2i\/run#L10\">run script<\/a><\/noindex> z toho p\u0159\u00edkladu, existuje prom\u011bnn\u00e1 prost\u0159ed\u00ed $NPM_RUN, kter\u00e1 umo\u017e\u0148uje spu\u0161t\u011bn\u00ed vlastn\u00edho p\u0159\u00edkazu.<\/p>\n<p>Nap\u0159\u00edklad m\u016f\u017eete pou\u017e\u00edt modul nodeshift k nasazen\u00ed na\u0161\u00ed aplikace:<\/p>\n<pre><code class=\"plaintext\">$ npx nodeshift --deploy.env NPM_RUN=\"yarn start\" --dockerImage=nodeshift\/ubi8-s2i-web-app\n<\/code><\/pre>\n<p>\n<i>Pozn\u00e1mka: v\u00fd\u0161e uveden\u00fd p\u0159\u00edklad je uveden ve zjednodu\u0161en\u00e9 podob\u011b, aby ilustroval celkovou my\u0161lenku.<\/i><\/p>\n<p>Zde jsme do na\u0161eho nasazen\u00ed p\u0159idali prom\u011bnnou prost\u0159ed\u00ed NPM_RUN, kter\u00e1 \u0159\u00edk\u00e1 prov\u00e1d\u011bc\u00edmu kroku, \u017ee by m\u011bl spustit p\u0159\u00edkaz yarn start, kter\u00fd spust\u00ed v\u00fdvojov\u00fd server React uvnit\u0159 na\u0161eho OpenShift podu.<\/p>\n<p>Pokud se pod\u00edv\u00e1me na log b\u011b\u017e\u00edc\u00edho podu, bude to p\u0159ibli\u017en\u011b n\u00e1sleduj\u00edc\u00ed:<\/p>\n<p><img decoding=\"async\" alt=\"Modern\u00ed aplikace na OpenShift, \u010d\u00e1st 3: OpenShift jako v\u00fdvojov\u00e9 prost\u0159ed\u00ed a potrub\u00ed OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/5b090223e08e32a3356608881068ce1a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Samoz\u0159ejm\u011b, to v\u0161echno nebude m\u00edt smysl, dokud nebudeme schopni synchronizovat m\u00edstn\u00ed k\u00f3d s k\u00f3dem, kter\u00fd je tak\u00e9 kontrolov\u00e1n na zm\u011bny, ale \u017eije na vzd\u00e1len\u00e9m serveru.<\/p>\n<h4>Synchronizace vzd\u00e1len\u00e9ho a m\u00edstn\u00edho k\u00f3du<\/h4>\n<p>\nNa\u0161t\u011bst\u00ed s synchronizac\u00ed snadno pom\u016f\u017ee nodeshift a pro sledov\u00e1n\u00ed zm\u011bn m\u016f\u017eeme pou\u017e\u00edt p\u0159\u00edkaz watch.<\/p>\n<p>Tak\u017ee po proveden\u00ed p\u0159\u00edkazu pro nasazen\u00ed v\u00fdvojov\u00e9ho serveru pro na\u0161i aplikaci m\u016f\u017eeme bez obav pou\u017e\u00edt tento p\u0159\u00edkaz:<\/p>\n<pre><code class=\"plaintext\">$ npx nodeshift watch\n<\/code><\/pre>\n<p>\nV d\u016fsledku toho se p\u0159ipoj\u00ed k b\u011b\u017e\u00edc\u00edmu podu, kter\u00fd jsme vytvo\u0159ili o n\u011bco d\u0159\u00edve, aktivuje synchronizaci na\u0161ich m\u00edstn\u00edch soubor\u016f se vzd\u00e1len\u00fdm klastrem a soubory na na\u0161em m\u00edstn\u00edm syst\u00e9mu za\u010dnou b\u00fdt sledov\u00e1ny na zm\u011bny.<\/p>\n<p>Proto, pokud nyn\u00ed aktualizujeme soubor src\/App.js, syst\u00e9m na tyto zm\u011bny zareaguje, zkop\u00edruje je na vzd\u00e1len\u00fd klastr a spust\u00ed v\u00fdvojov\u00fd server, kter\u00fd pot\u00e9 aktualizuje na\u0161i aplikaci v prohl\u00ed\u017ee\u010di.<\/p>\n<p>Pro \u00faplnost uk\u00e1\u017eeme, jak tyto p\u0159\u00edkazy vypadaj\u00ed v celku:<\/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=\"yarn start\" --deploy.port 3000\n\n$ npx nodeshift watch --strictSSL=false\n<\/code><\/pre>\n<p>\nP\u0159\u00edkaz watch je abstrakc\u00ed nad p\u0159\u00edkazem oc rsync, podrobnosti o tom, jak to funguje, se m\u016f\u017eete dozv\u011bd\u011bt. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.okd.io\/latest\/dev_guide\/copy_files_to_container.html\">zde<\/a><\/noindex>.<\/p>\n<p>To byl p\u0159\u00edklad pro React, ale stejnou metodu lze pou\u017e\u00edt i s jin\u00fdmi frameworky, sta\u010d\u00ed spr\u00e1vn\u011b zapsat prom\u011bnnou prost\u0159ed\u00ed NPM_RUN.<br \/>\n\u2003<\/p>\n<h3>Pipelines Openshift<\/h3>\n<p><img decoding=\"async\" alt=\"Modern\u00ed aplikace na OpenShift, \u010d\u00e1st 3: OpenShift jako v\u00fdvojov\u00e9 prost\u0159ed\u00ed a potrub\u00ed OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/33b932d3591b22dd00d82509b352d489.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>D\u00e1le si pov\u00edme o n\u00e1stroji OpenShift Pipelines a o tom, jak ho lze vyu\u017e\u00edt jako alternativu k souvisej\u00edc\u00edm sestaven\u00edm chained build.<\/p>\n<h4>Co jsou OpenShift Pipelines<\/h4>\n<p>\nOpenShift Pipelines je cloudov\u011b orientovan\u00fd CI\/CD syst\u00e9m pro kontinu\u00e1ln\u00ed integraci a dod\u00e1n\u00ed, ur\u010den\u00fd k organizaci pipeline s vyu\u017eit\u00edm Tektonu. Tekton je flexibiln\u00ed Kubernetes-nativn\u00ed CI\/CD r\u00e1mec s otev\u0159en\u00fdm k\u00f3dem, kter\u00fd umo\u017e\u0148uje automatizaci nasazen\u00ed na r\u016fzn\u00fdch platform\u00e1ch (Kubernetes, serverless, virtu\u00e1ln\u00ed stroje atd.) t\u00edm, \u017ee abstrahuje od z\u00e1kladn\u00ed \u00farovn\u011b.<\/p>\n<p>Pro porozum\u011bn\u00ed tomuto \u010dl\u00e1nku jsou pot\u0159ebn\u00e9 ur\u010dit\u00e9 znalosti o Pipelines, proto d\u016frazn\u011b doporu\u010dujeme nejprve se sezn\u00e1mit s <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openshift\/pipelines-tutorial\">ofici\u00e1ln\u00edm v\u00fdukov\u00fdm materi\u00e1lem<\/a><\/noindex>.<\/p>\n<h4>Nastaven\u00ed pracovn\u00edho prost\u0159ed\u00ed<\/h4>\n<p>\nAbychom si mohli vyzkou\u0161et p\u0159\u00edklady z tohoto \u010dl\u00e1nku, mus\u00edme nejprve p\u0159ipravit pracovn\u00ed prost\u0159ed\u00ed:<\/p>\n<ol>\n<li>Nainstalujte a nastavte cluster OpenShift 4. V na\u0161ich p\u0159\u00edkladech pou\u017e\u00edv\u00e1me CodeReady Containers (CRD), pokyny k instalaci najdete <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.redhat.com\/openshift\/install\/crc\/installer-provisioned\">zde<\/a><\/noindex>.<\/li>\n<li>Jakmile bude cluster p\u0159ipraven, je t\u0159eba na n\u011bj nainstalovat Pipeline Operator. Nebojte se, je to snadn\u00e9, pokyny k instalaci <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openshift\/pipelines-tutorial\/blob\/master\/install-operator.md\">zde<\/a><\/noindex>.<\/li>\n<li>Na\u010d\u00edst <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\">zde<\/a><\/noindex>.<\/li>\n<li>Spus\u0165te n\u00e1stroj p\u0159\u00edkazov\u00e9ho \u0159\u00e1dku create-react-app pro vytvo\u0159en\u00ed aplikace, kter\u00e1 bude n\u00e1sledn\u011b nasazena (je to jednoduch\u00e1 aplikace <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift-starters\/react-pipeline-example\">React<\/a><\/noindex>).<\/li>\n<li>(Voliteln\u011b) Klonujte repozit\u00e1\u0159 pro lok\u00e1ln\u00ed spu\u0161t\u011bn\u00ed p\u0159\u00edkladu aplikace pomoc\u00ed p\u0159\u00edkazu npm install a pot\u00e9 npm start.<\/li>\n<\/ol>\n<p>\nV repozit\u00e1\u0159i aplikace bude tak\u00e9 slo\u017eka k8s, kde budou um\u00edst\u011bny YAML soubory Kubernetes\/OpenShift pou\u017e\u00edvan\u00e9 pro nasazen\u00ed aplikace. Tam budou \u00fakoly, ClusterTasks, Resources a Pipelines, kter\u00e9 vytvo\u0159\u00edme v tomto <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/webapp-pipeline-tutorial\">repozit\u00e1\u0159e<\/a><\/noindex>.<\/p>\n<h4>Za\u010d\u00edn\u00e1me<\/h4>\n<p>\nNejd\u0159\u00edve je t\u0159eba vytvo\u0159it nov\u00fd projekt v clusteru OpenShift pro n\u00e1\u0161 p\u0159\u00edklad. Nazveme tento projekt webapp-pipeline a vytvo\u0159\u00edme ho n\u00e1sleduj\u00edc\u00edm p\u0159\u00edkazem:<\/p>\n<pre><code class=\"plaintext\">$ oc new-project webapp-pipeline\n<\/code><\/pre>\n<p>\nD\u00e1le se toto jm\u00e9no projektu bude objevovat v k\u00f3du, tak\u017ee pokud se rozhodnete pojmenovat ho jinak, nezapome\u0148te odpov\u00eddaj\u00edc\u00edm zp\u016fsobem upravit k\u00f3d z p\u0159\u00edklad\u016f. Od t\u00e9to chv\u00edle se nebudeme \u0159\u00eddit shora dol\u016f, ale zdola nahoru: tedy nejprve vytvo\u0159\u00edme v\u0161echny komponenty pipeline a teprve potom samotnou pipeline.<\/p>\n<p>Tak\u017ee, nejprve\u2026<\/p>\n<h4>\u00dakoly<\/h4>\n<p>\nVytvo\u0159\u00edme p\u00e1r \u00faloh (tasks), kter\u00e9 potom pomohou nasadit aplikaci v r\u00e1mci na\u0161eho pipeline. Prvn\u00ed \u00faloha \u2013 apply_manifests_task \u2013 zaji\u0161\u0165uje aplikaci YAML soubor\u016f Kubernetes-rozsahu (service, deployment a route), kter\u00e9 se nach\u00e1z\u00ed ve slo\u017ece k8s na\u0161\u00ed aplikace. Druh\u00e1 \u00faloha \u2013 update_deployment_task \u2013 zaji\u0161\u0165uje aktualizaci ji\u017e nasazen\u00e9ho obrazu na ten, kter\u00fd vytv\u00e1\u0159\u00ed n\u00e1\u0161 pipeline.<\/p>\n<p>Nebojte se, pokud to zat\u00edm nen\u00ed \u00fapln\u011b jasn\u00e9. Tyto \u00falohy jsou vlastn\u011b n\u011bco jako utility, podrobn\u011bji se jimi budeme zab\u00fdvat pozd\u011bji. Te\u010f si je jen vytvo\u0159\u00edme:<\/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>\nPak pomoc\u00ed p\u0159\u00edkazu tkn CLI zkontrolujeme, \u017ee \u00falohy byly vytvo\u0159eny:<\/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>Pozn\u00e1mka: Toto jsou lok\u00e1ln\u00ed \u00falohy va\u0161eho aktu\u00e1ln\u00edho projektu.<\/i><\/p>\n<h4>Klusterov\u00e9 \u00falohy Cluster tasks<\/h4>\n<p>\nKlusterov\u00e9 \u00falohy jsou v podstat\u011b to sam\u00e9 jako jednoduch\u00e9 \u00falohy. To znamen\u00e1, \u017ee se jedn\u00e1 o opakovan\u011b pou\u017eiteln\u00e9 kolekce krok\u016f, kter\u00e9 se kombinuj\u00ed ur\u010dit\u00fdm zp\u016fsobem p\u0159i spu\u0161t\u011bn\u00ed konkr\u00e9tn\u00ed \u00falohy. Rozd\u00edl spo\u010d\u00edv\u00e1 v tom, \u017ee klusterov\u00e1 \u00faloha je dostupn\u00e1 kdekoli v r\u00e1mci klusteru. Abychom vid\u011bli seznam klusterov\u00fdch \u00faloh, kter\u00e9 se automaticky vytv\u00e1\u0159ej\u00ed p\u0159i p\u0159id\u00e1n\u00ed Pipeline Operator, znovu pou\u017eijeme p\u0159\u00edkaz tkn CLI:<\/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>\nA nyn\u00ed vytvo\u0159\u00edme dv\u011b klusterov\u00e9 \u00falohy. Prvn\u00ed bude generovat obraz S2I a odes\u00edlat jej do intern\u00edho registru OpenShift; druh\u00e1 \u2013 provede sestaven\u00ed na\u0161eho obrazu na z\u00e1klad\u011b NGINX, pou\u017e\u00edvaj\u00edc\u00ed jako obsah ji\u017e sestavenou aplikaci.<\/p>\n<h4>Vytv\u00e1\u0159\u00edme a odes\u00edl\u00e1me obraz<\/h4>\n<p>\nP\u0159i vytv\u00e1\u0159en\u00ed prvn\u00ed \u00falohy si zopakujeme to, co jsme ji\u017e d\u011blali v p\u0159edchoz\u00edm \u010dl\u00e1nku o propojen\u00fdch sestaven\u00edch. P\u0159ipom\u00edn\u00e1me, \u017ee jsme pou\u017eili obraz S2I (ubi8-s2i-web-app), abychom 'sestavili' na\u0161i aplikaci, a nakonec jsme z\u00edskali obraz ulo\u017een\u00fd v intern\u00edm registru OpenShift. Nyn\u00ed pou\u017eijeme tento S2I obraz webov\u00e9 aplikace k vytvo\u0159en\u00ed DockerFile pro na\u0161i aplikaci, a pot\u00e9 nasad\u00edme Buildah, abychom provedli skute\u010dn\u00e9 sestaven\u00ed a poslali z\u00edskan\u00fd obraz do intern\u00edho registru OpenShift, proto\u017ee pr\u00e1v\u011b to OpenShift d\u011bl\u00e1, kdy\u017e nasazujete sv\u00e9 aplikace pomoc\u00ed NodeShift.<\/p>\n<p>Pt\u00e1te se, odkud jsme to v\u0161echno vzali? Z <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>, jednodu\u0161e jsme jej zkop\u00edrovali a p\u0159izp\u016fsobili si ho.<\/p>\n<p>Tak, a nyn\u00ed vytvo\u0159\u00edme clusterovou \u00falohu s n\u00e1zvem 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>\nNebudeme to podrobn\u011b rozeb\u00edrat, pouze se zam\u011b\u0159\u00edme na parametr OUTPUT_DIR:<\/p>\n<pre><code class=\"plaintext\">params:\n      - name: OUTPUT_DIR\n        description: M\u00edsto, kde se nach\u00e1z\u00ed v\u00fdstupn\u00ed adres\u00e1\u0159 sestaven\u00ed\n        default: build\n<\/code><\/pre>\n<p>\nVe v\u00fdchoz\u00edm nastaven\u00ed m\u00e1 tento parametr hodnotu build, kam React ukl\u00e1d\u00e1 sestaven\u00fd obsah. V jin\u00fdch frameworc\u00edch se pou\u017e\u00edvaj\u00ed jin\u00e9 cesty, nap\u0159\u00edklad v Ember je to dist. V\u00fdstup na\u0161\u00ed prvn\u00ed clusterov\u00e9 \u00falohy bude obraz, kter\u00fd obsahuje HTML, JavaScript a CSS, kter\u00e9 jsme sestavili.<\/p>\n<h4>Sestavujeme obraz zalo\u017een\u00fd na NGINX<\/h4>\n<p>\nPokud jde o na\u0161i druhou clusterovou \u00falohu, ta by m\u011bla sestavovat obraz na z\u00e1klad\u011b NGINX s vyu\u017eit\u00edm obsahu ji\u017e sestaven\u00e9 aplikace. V podstat\u011b jde o tu \u010d\u00e1st p\u0159edchoz\u00edho odd\u00edlu, kde jsme se zab\u00fdvali propojen\u00fdmi sestaven\u00edmi.<\/p>\n<p>K tomu \u2013 p\u0159esn\u011b tak, jak jsme to ud\u011blali v\u00fd\u0161e \u2013 vytvo\u0159\u00edme clusterovou \u00falohu 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>\nPokud se pod\u00edv\u00e1te na k\u00f3d t\u011bchto clusterov\u00fdch \u00faloh, uvid\u00edte, \u017ee tam nen\u00ed konkretizov\u00e1no Git repozit\u00e1\u0159, se kter\u00fdm pracujeme, nebo n\u00e1zvy obraz\u016f, kter\u00e9 vytv\u00e1\u0159\u00edme. Ur\u010dujeme pouze, co skute\u010dn\u011b p\u0159ed\u00e1v\u00e1me do Gitu, nebo n\u011bjak\u00fd obraz, kam je t\u0159eba vyexportovat v\u00fdsledn\u00fd obraz. Pr\u00e1v\u011b proto lze tyto clusterov\u00e9 \u00falohy op\u011btovn\u011b pou\u017e\u00edt i p\u0159i pr\u00e1ci s jin\u00fdmi aplikacemi.<\/p>\n<p>A zde elegantn\u011b p\u0159ech\u00e1z\u00edme k dal\u0161\u00edmu bodu\u2026<\/p>\n<h4>Zdroje<\/h4>\n<p>\nTak\u017ee, jak jsme pr\u00e1v\u011b \u0159ekli, clusteringov\u00e9 \u00fakoly by m\u011bly b\u00fdt co nejv\u00edce obecn\u00e9. Mus\u00edme vytvo\u0159it zdroje, kter\u00e9 budou pou\u017eity na vstupu (Git repozit\u00e1\u0159) a na v\u00fdstupu (kone\u010dn\u00e9 obrazy). Prvn\u00edm zdrojem, kter\u00fd pot\u0159ebujeme, je Git, kde se nach\u00e1z\u00ed na\u0161e aplikace, n\u011bco jako toto:<\/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>\nZde m\u00e1 PipelineResource typ git. Kl\u00ed\u010d url v sekci params ukazuje na konkr\u00e9tn\u00ed repozit\u00e1\u0159 a nastavuje v\u011btev master (to je voliteln\u00e9, ale p\u00ed\u0161eme to pro kompletnost).<\/p>\n<p>Nyn\u00ed mus\u00edme vytvo\u0159it zdroj pro obraz, kam budou ukl\u00e1d\u00e1ny v\u00fdsledky vykon\u00e1n\u00ed \u00fakolu s2i-web-app, d\u011bl\u00e1 se to takto:<\/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>\nZde m\u00e1 PipelineResource typ image a hodnota parametru url ukazuje na intern\u00ed OpenShift Image Registry, konkr\u00e9tn\u011b na ten, kter\u00fd se nach\u00e1z\u00ed v prostoru webapp-pipeline. Nezapome\u0148te zm\u011bnit tento parametr, pokud pou\u017e\u00edv\u00e1te jin\u00fd prostor.<\/p>\n<p>A kone\u010dn\u011b, posledn\u00ed zdroj, kter\u00fd budeme pot\u0159ebovat, bude tak\u00e9 m\u00edt typ image a to bude kone\u010dn\u00fd obraz NGINX, kter\u00fd bude pou\u017eit p\u0159i nasazen\u00ed:<\/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>\nOp\u011bt si dejte pozor, \u017ee tento zdroj ukl\u00e1d\u00e1 obraz do intern\u00edho registru OpenShift ve jmenn\u00e9m prostoru webapp-pipeline.<\/p>\n<p>Abychom mohli vytvo\u0159it v\u0161echny tyto zdroje najednou, pou\u017eijeme p\u0159\u00edkaz 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>\nMo\u017en\u00e9 ov\u011b\u0159it, \u017ee byly zdroje vytvo\u0159eny, lze takto:<\/p>\n<pre><code class=\"plaintext\">$ tkn resource ls\n<\/code><\/pre>\n<p><\/p>\n<h4>Pipeline<\/h4>\n<p>\nTe\u010f, kdy\u017e m\u00e1me v\u0161echny pot\u0159ebn\u00e9 komponenty, slo\u017e\u00edme z nich pipeline t\u00edmto p\u0159\u00edkazem:<\/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>\nAle ne\u017e spust\u00edme tento p\u0159\u00edkaz, pod\u00edvejme se na tyto komponenty. Prvn\u00edm je n\u00e1zev:<\/p>\n<pre><code class=\"plaintext\">apiVersion: tekton.dev\/v1alpha1\nkind: Pipeline\nmetadata:\n  name: build-and-deploy-react\n<\/code><\/pre>\n<p>\nPot\u00e9 v sekci spec vid\u00edme ur\u010den\u00ed zdroj\u016f, kter\u00e9 jsme vytvo\u0159ili d\u0159\u00edve:<\/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>\nPot\u00e9 vytv\u00e1\u0159\u00edme \u00fakoly, kter\u00e9 mus\u00ed n\u00e1\u0161 pipeline splnit. Nejd\u0159\u00edve mus\u00ed vykonat n\u00e1mi ji\u017e vytvo\u0159en\u00fd \u00fakol 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>\nTento \u00fakol bere vstupn\u00ed (gir-zdroj) a v\u00fdstupn\u00ed (zdroj built-web-application-image) parametry. Tak\u00e9 j\u00ed p\u0159ed\u00e1v\u00e1me speci\u00e1ln\u00ed parametr, aby neov\u011b\u0159ovala TLS, proto\u017ee pou\u017e\u00edv\u00e1me self-signed certifik\u00e1ty:<\/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: \"false\"\n<\/code><\/pre>\n<p>\nDal\u0161\u00ed \u00fakol je t\u00e9m\u011b\u0159 stejn\u00fd, jen zde se vol\u00e1 ji\u017e vytvo\u0159en\u00fd clusterov\u00fd \u00fakol webapp-build-runtime:<\/p>\n<pre><code class=\"plaintext\">name: build-runtime-image\n    taskRef:\n      name: webapp-build-runtime\n      kind: ClusterTask\n<\/code><\/pre>\n<p>\nStejn\u011b jako u p\u0159edchoz\u00edho \u00fakolu p\u0159ed\u00e1v\u00e1me zdroj, ale nyn\u00ed je to built-web-application-image (v\u00fdstup na\u0161eho p\u0159edchoz\u00edho \u00fakolu). A jako v\u00fdstup op\u011bt definujeme obraz. Proto\u017ee tento \u00fakol mus\u00ed b\u00fdt proveden po p\u0159edchoz\u00edm, p\u0159id\u00e1me pole 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: \"false\"\n      runAfter:\n        - build-web-application\n<\/code><\/pre>\n<p>\nN\u00e1sleduj\u00edc\u00ed dv\u011b \u00fakoly odpov\u00eddaj\u00ed za aplikaci YAML soubor\u016f slu\u017eby, trasy a nasazen\u00ed, kter\u00e9 se nach\u00e1zej\u00ed v adres\u00e1\u0159i k8s na\u0161eho webov\u00e9 aplikace, a tak\u00e9 za aktualizaci tohoto nasazen\u00ed p\u0159i vytv\u00e1\u0159en\u00ed nov\u00fdch obraz\u016f. Tyto dv\u011b clusterov\u00e9 \u00fakoly jsme definovali na za\u010d\u00e1tku \u010dl\u00e1nku.<\/p>\n<h4>Spu\u0161t\u011bn\u00ed kan\u00e1lov\u00e9ho zpracov\u00e1n\u00ed<\/h4>\n<p>\nTak\u017ee v\u0161echny \u010d\u00e1sti na\u0161eho pipeline jsou vytvo\u0159eny a spust\u00edme ji n\u00e1sleduj\u00edc\u00edm p\u0159\u00edkazem:<\/p>\n<pre><code class=\"plaintext\">$ tkn pipeline start build-and-deploy-react\n<\/code><\/pre>\n<p>\nV t\u00e9to f\u00e1zi se p\u0159\u00edkazov\u00fd \u0159\u00e1dek pou\u017e\u00edv\u00e1 v interaktivn\u00edm re\u017eimu a je t\u0159eba vyb\u00edrat odpov\u00eddaj\u00edc\u00ed zdroje v odpov\u011bdi na ka\u017ed\u00fd jeho dotaz: pro zdroj git vybereme web-application-repo, pot\u00e9 pro zdroj prvn\u00edho obrazu \u2013 built-web-application-image, a nakonec pro zdroj druh\u00e9ho obrazu \u2013 runtime-web-application-image:<\/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>\nNyn\u00ed zkontrolujeme stav pipeline pomoc\u00ed n\u00e1sleduj\u00edc\u00edho p\u0159\u00edkazu:<\/p>\n<pre><code class=\"plaintext\">$ tkn pipeline logs -f\n<\/code><\/pre>\n<p>\nPot\u00e9, co pipeline spust\u00ed a aplikace se nasad\u00ed, po\u017e\u00e1d\u00e1me o zve\u0159ejn\u011bnou trasu n\u00e1sleduj\u00edc\u00edm p\u0159\u00edkazem:<\/p>\n<pre><code class=\"plaintext\">$ oc get route react-pipeline-example --template='http:\/\/{{.spec.host}}'\n<\/code><\/pre>\n<p>\nPro lep\u0161\u00ed vizualizaci m\u016f\u017eeme pod\u00edvat na na\u0161i pipeline v re\u017eimu Developer webov\u00e9 konzole v sekci <b>Pipeline<\/b>, jak je zn\u00e1zorn\u011bno na Obr. 1.<\/p>\n<p><img decoding=\"async\" alt=\"Modern\u00ed aplikace na OpenShift, \u010d\u00e1st 3: OpenShift jako v\u00fdvojov\u00e9 prost\u0159ed\u00ed a potrub\u00ed OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/ede9b076414e389c2cd212adeda08956.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Obr.1. P\u0159ehled spu\u0161t\u011bn\u00fdch pipeline.<\/i><\/p>\n<p>Kliknut\u00edm na spu\u0161t\u011bnou pipeline se zobraz\u00ed dal\u0161\u00ed informace, jak je zn\u00e1zorn\u011bno na Obr.2.<\/p>\n<p><img decoding=\"async\" alt=\"Modern\u00ed aplikace na OpenShift, \u010d\u00e1st 3: OpenShift jako v\u00fdvojov\u00e9 prost\u0159ed\u00ed a potrub\u00ed OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/64581b1f6d8ff91aedd963019ef29be5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Obr. 2. Dal\u0161\u00ed informace o pipeline.<\/i><\/p>\n<p>Po dal\u0161\u00edch informac\u00edch si m\u016f\u017eeme prohl\u00e9dnout spu\u0161t\u011bn\u00e9 aplikace ve zobrazen\u00ed <b>Topology<\/b>, jak je zn\u00e1zorn\u011bno na Obr.3.<\/p>\n<p><img decoding=\"async\" alt=\"Modern\u00ed aplikace na OpenShift, \u010d\u00e1st 3: OpenShift jako v\u00fdvojov\u00e9 prost\u0159ed\u00ed a potrub\u00ed OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/d23f723e14514ff60ecfddd8eb9bf752.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Obr 3. Spu\u0161t\u011bn\u00fd pod.<\/i><\/p>\n<p>Kliknut\u00edm na kruhovou ikonu v prav\u00e9m horn\u00edm rohu ikony otev\u0159e na\u0161i aplikaci, jak je zn\u00e1zorn\u011bno na Obr.4.<\/p>\n<p><img decoding=\"async\" alt=\"Modern\u00ed aplikace na OpenShift, \u010d\u00e1st 3: OpenShift jako v\u00fdvojov\u00e9 prost\u0159ed\u00ed a potrub\u00ed OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/aa8e09d9fd9f33d5faffc7f661d84ca4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Obr. 4. Spu\u0161t\u011bn\u00e1 aplikace React.<\/i><\/p>\n<h3>Z\u00e1v\u011br<\/h3>\n<p>\nTak\u017ee jsme uk\u00e1zali, jak spustit na OpenShift v\u00fdvojov\u00fd server pro svou aplikaci a synchronizovat jej s m\u00edstn\u00edm souborov\u00fdm syst\u00e9mem. Tak\u00e9 jsme se pod\u00edvali, jak simulovat chained-build template pomoc\u00ed OpenShift Pipelines. V\u0161echny k\u00f3dy p\u0159\u00edklad\u016f z tohoto \u010dl\u00e1nku najdete <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/webapp-pipeline-tutorial\">zde<\/a><\/noindex>.<\/p>\n<h3>Dal\u0161\u00ed zdroje (EN)<\/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\/\">\u201eV\u00fdvoj na OpenShift: p\u0159\u00edru\u010dka pro netrp\u011bliv\u00e9\u201c<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/06\/11\/container-native-nodejs-istio-rhoar\/\">Sestaven\u00ed kontejnerov\u011b orientovan\u00fdch aplikac\u00ed Node.js pomoc\u00ed Red Hat OpenShift Application Runtimes a Istio<\/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\/\">Lad\u011bn\u00ed aplikac\u00ed Node.js na OpenShift pomoc\u00ed Chrome DevTools<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/04\/16\/zero-express-openshift-3-commands\/\">T\u0159i p\u0159\u00edkazy, jak se od nuly nau\u010dit Express na OpenShift<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/03\/12\/rhoar-nodejs-annoucement\/\">Ozn\u00e1men\u00ed o ve\u0159ejn\u00e9 verzi Node.js v r\u00e1mci Red Hat OpenShift Application Runtimes<\/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\/\">Monitoring aplikac\u00ed Node.js na OpenShift pomoc\u00ed Prometheus<\/a><\/noindex><\/li>\n<li>Dal\u0161\u00ed \u010dl\u00e1nky o <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/kubernetes\/\">OpenShift a Kubernetes<\/a><\/noindex> na str\u00e1nk\u00e1ch Red Hat<\/li>\n<\/ul>\n<h3>Ozn\u00e1men\u00ed o nadch\u00e1zej\u00edc\u00edch webin\u00e1\u0159\u00edch<\/h3>\n<p>\nZa\u010d\u00edn\u00e1me s\u00e9rii p\u00e1te\u010dn\u00edch webin\u00e1\u0159\u016f o nativn\u00edm pou\u017e\u00edv\u00e1n\u00ed Red Hat OpenShift Container Platform a Kubernetes:<\/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. srpna, webin\u00e1\u0159 C\u00edsa\u0159 \u201cOper\u00e1tor\u201d: Oper\u00e1to\u0159i v OpenShift a Kubernetes<\/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. z\u00e1\u0159\u00ed, DeploymentConfig vs Deployment \u2013 OpenShift-specifick\u00e9 kouzeln\u00e9 v\u011bci pro sestaven\u00ed a nasazen\u00ed aplikac\u00ed<\/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. z\u00e1\u0159\u00ed, Red Hat OpenShift a 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. \u0159\u00edjna, Jak zvl\u00e1dnout n\u00e1hl\u00fd n\u00e1r\u016fst zat\u00ed\u017een\u00ed<\/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. \u0159\u00edjna, Vestav\u011bn\u00fd Jenkins, Pipeline-builds, Tekton v Red Hat OpenShift Container Platform<\/b><\/a><\/noindex><\/li>\n<\/ul>\n<p>Zdroj: <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.3 - 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\/cs\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\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\/cs\/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\udd47Modern\u00ed aplikace na OpenShift, \u010d\u00e1st 3: OpenShift jako v\u00fdvojov\u00e9 prost\u0159ed\u00ed a konveje OpenShift Pipelines | ProHoster","description":"Ahoj v\u0161ichni na tomto blogu!","canonical_url":"https:\/\/prohoster.info\/cs\/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":"cs_CZ","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\/cs\/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\/cs\/wp-json\/wp\/v2\/posts\/92048","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=92048"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/92048\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/92049"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=92048"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=92048"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=92048"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}