{"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\/sv\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines","title":{"rendered":"Moderna applikationer p\u00e5 OpenShift, del 3: OpenShift som utvecklingsmilj\u00f6 och OpenShift Pipelines.","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hej alla i denna blogg! H\u00e4r \u00e4r det tredje inl\u00e4gget i serien d\u00e4r vi visar hur man distribuerar moderna webbapplikationer p\u00e5 Red Hat OpenShift.<\/p>\n<p><img decoding=\"async\" alt=\"Moderna applikationer p\u00e5 OpenShift, del 3: OpenShift som utvecklingsmilj\u00f6 och OpenShift Pipelines.\" src=\"\/wp-content\/uploads\/2020\/08\/9c3337b13a3f045d36343308ce6154cc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI de tv\u00e5 tidigare inl\u00e4ggen har vi ber\u00e4ttat hur man distribuerar moderna webbapplikationer p\u00e5 bara n\u00e5gra steg och hur man anv\u00e4nder den nya S2I-bilden tillsammans med en f\u00e4rdig HTTP-serverbild, som NGINX, med hj\u00e4lp av kedjade byggnader f\u00f6r att organisera produktionsdistributionen.<\/p>\n<p>Idag visar vi hur man startar en utvecklingsserver f\u00f6r sin applikation p\u00e5 OpenShift och synkroniserar den med filsystemet lokalt, samt pratar om vad OpenShift Pipelines \u00e4r och hur man kan anv\u00e4nda det som ett alternativ till kedjade byggnader.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>OpenShift som utvecklingsmilj\u00f6<\/h3>\n<p><\/p>\n<h4>Utvecklingsarbetsfl\u00f6de<\/h4>\n<p>\nSom n\u00e4mnts i <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/511954\/\">det f\u00f6rsta inl\u00e4gget<\/a><\/noindex>, \u00e4r den typiska utvecklingsprocessen f\u00f6r moderna webbapplikationer helt enkelt en \"utvecklingsserver\" som \u00f6vervakar \u00e4ndringar i lokala filer. N\u00e4r de intr\u00e4ffar startas en byggnad av applikationen och den uppdateras sedan i webbl\u00e4saren.<\/p>\n<p>I de flesta moderna ramverk \u00e4r en s\u00e5dan \"utvecklingsserver\" inbyggd i de relevanta kommandoradsverktygen.<\/p>\n<h4>Lokalt exempel<\/h4>\n<p>\nL\u00e5t oss b\u00f6rja med att visa hur detta fungerar i fallet med lokal k\u00f6rning av applikationer. Som exempel tar vi applikationen <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lholmquist\/react-web-app\">React<\/a><\/noindex> fr\u00e5n de tidigare artiklarna, \u00e4ven om praktiskt taget samma processt\u00e4nkande g\u00e4ller f\u00f6r alla andra moderna ramverk.<br \/>\nS\u00e5 f\u00f6r att k\u00f6ra en \"utvecklingsserver\" i v\u00e5rt exempel med React, skriver vi in f\u00f6ljande kommando:<\/p>\n<pre><code class=\"plaintext\">$ npm run start\n<\/code><\/pre>\n<p>\nD\u00e5 ser vi ungef\u00e4r f\u00f6ljande i terminalf\u00f6nstret:<\/p>\n<p><img decoding=\"async\" alt=\"Moderna applikationer p\u00e5 OpenShift, del 3: OpenShift som utvecklingsmilj\u00f6 och OpenShift Pipelines.\" src=\"\/wp-content\/uploads\/2020\/08\/06f84ffb4c9a6a5868b8b47b8ad1d9ec.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Och v\u00e5r applikation \u00f6ppnas i webbl\u00e4saren som standard:<\/p>\n<p><img decoding=\"async\" alt=\"Moderna applikationer p\u00e5 OpenShift, del 3: OpenShift som utvecklingsmilj\u00f6 och OpenShift Pipelines.\" src=\"\/wp-content\/uploads\/2020\/08\/72341bb0796352e7343bf31ceb8233cd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Nu, om vi g\u00f6r \u00e4ndringar i filen, b\u00f6r applikationen uppdateras i webbl\u00e4saren.<\/p>\n<p>OK, utvecklingen i lokalt l\u00e4ge \u00e4r tydlig, men hur f\u00e5r man till samma sak p\u00e5 OpenShift?<\/p>\n<h4>Utvecklingsserver p\u00e5 OpenShift<\/h4>\n<p>\nOm ni minns, i <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/513948\/\">i det f\u00f6reg\u00e5ende inl\u00e4gget<\/a><\/noindex>, vi granskade s\u00e5 kallad k\u00f6rningsfas (run phase) av S2I-bilden och s\u00e5g att servermodulen sk\u00f6ter v\u00e5r webbapplikation som standard.<\/p>\n<p>Men om man tittar lite n\u00e4rmare <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/ubi8-s2i-web-app\/blob\/master\/s2i\/run#L10\">k\u00f6r skript<\/a><\/noindex> p\u00e5 det exemplet, s\u00e5 finns det en milj\u00f6variabel $NPM_RUN, som till\u00e5ter att k\u00f6ra sin egen kommando.<\/p>\n<p>Till exempel kan man anv\u00e4nda modulen nodeshift f\u00f6r att distribuera v\u00e5r applikation:<\/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>Observera: exemplet ovan ges i en f\u00f6rkortad form f\u00f6r att illustrera den allm\u00e4nna id\u00e9n.<\/i><\/p>\n<p>H\u00e4r har vi lagt till en milj\u00f6variabel NPM_RUN i v\u00e5r deployment, som s\u00e4ger till k\u00f6rrutinen att den ska k\u00f6ra kommandot yarn start, vilket startar Reacts utvecklingsserver inuti v\u00e5r OpenShift pod.<\/p>\n<p>Om vi tittar p\u00e5 loggen fr\u00e5n den k\u00f6rande podden, s\u00e5 kommer det att se ungef\u00e4r ut s\u00e5 h\u00e4r:<\/p>\n<p><img decoding=\"async\" alt=\"Moderna applikationer p\u00e5 OpenShift, del 3: OpenShift som utvecklingsmilj\u00f6 och OpenShift Pipelines.\" src=\"\/wp-content\/uploads\/2020\/08\/5b090223e08e32a3356608881068ce1a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Sj\u00e4lvklart \u00e4r det h\u00e4r allt meningsl\u00f6st tills vi kan synkronisera lokal kod med den kod som ocks\u00e5 kontrolleras f\u00f6r f\u00f6r\u00e4ndringar, men som bor p\u00e5 en fj\u00e4rrserver.<\/p>\n<h4>Synkronisering av fj\u00e4rr- och lokal kod<\/h4>\n<p>\nLyckligtvis kan nodeshift hj\u00e4lpa till med synkroniseringen enkelt, och f\u00f6r att \u00f6vervaka f\u00f6r\u00e4ndringar kan vi anv\u00e4nda kommandot watch.<\/p>\n<p>S\u00e5 efter att vi har k\u00f6rt kommandot f\u00f6r att deploya utvecklingsservern f\u00f6r v\u00e5r applikation, kan vi utan problem anv\u00e4nda f\u00f6ljande kommando:<\/p>\n<pre><code class=\"plaintext\">$ npx nodeshift watch\n<\/code><\/pre>\n<p>\nSom ett resultat kommer vi att ansluta till den pod som vi skapade tidigare, synkronisera v\u00e5ra lokala filer med den fj\u00e4rrklustret, och filerna p\u00e5 v\u00e5rt lokala system kommer att \u00f6vervakas f\u00f6r f\u00f6r\u00e4ndringar.<\/p>\n<p>S\u00e5 om vi nu uppdaterar filen src\/App.js, kommer systemet att reagera p\u00e5 dessa f\u00f6r\u00e4ndringar, kopiera dem till den fj\u00e4rrklustret och starta utvecklingsservern, som sedan uppdaterar v\u00e5r applikation i webbl\u00e4saren.<\/p>\n<p>F\u00f6r att f\u00e5 en komplett bild visar vi hur dessa kommandon ser ut helt:<\/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>\nKommandot watch \u00e4r en abstraktion \u00f6ver kommandot oc rsync, mer information om hur det fungerar kan man f\u00e5. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.okd.io\/latest\/dev_guide\/copy_files_to_container.html\">h\u00e4r<\/a><\/noindex>.<\/p>\n<p>Detta var ett exempel f\u00f6r React, men exakt samma metod kan anv\u00e4ndas med andra ramverk, skriv helt enkelt milj\u00f6variabeln NPM_RUN p\u00e5 r\u00e4tt s\u00e4tt.<br \/>\n\u2003<\/p>\n<h3>OpenShift Pipelines<\/h3>\n<p><img decoding=\"async\" alt=\"Moderna applikationer p\u00e5 OpenShift, del 3: OpenShift som utvecklingsmilj\u00f6 och OpenShift Pipelines.\" src=\"\/wp-content\/uploads\/2020\/08\/33b932d3591b22dd00d82509b352d489.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Vidare kommer vi att tala om ett verktyg som OpenShift Pipelines, och hur det kan anv\u00e4ndas som ett alternativ till sammanh\u00e4ngande byggen, chained build.<\/p>\n<h4>Vad \u00e4r OpenShift Pipelines<\/h4>\n<p>\nOpenShift Pipelines \u00e4r ett molnbaserat CI\/CD-system f\u00f6r kontinuerlig integration och leverans, som \u00e4r utformat f\u00f6r att organisera pipeline med hj\u00e4lp av Tekton. Tekton \u00e4r ett flexibelt Kubernetes-nativt CI\/CD-ramverk med \u00f6ppen k\u00e4llkod som g\u00f6r det m\u00f6jligt att automatisera distribution p\u00e5 olika plattformar (Kubernetes, serverless, virtuella maskiner, etc.) genom att abstrahera bort fr\u00e5n underliggande niv\u00e5.<\/p>\n<p>F\u00f6r att f\u00f6rst\u00e5 denna artikel beh\u00f6vs vissa kunskaper om Pipelines, s\u00e5 vi rekommenderar starkt att du f\u00f6rst bekantar dig med <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openshift\/pipelines-tutorial\">den officiella handboken<\/a><\/noindex>.<\/p>\n<h4>Konfigurera arbetsmilj\u00f6<\/h4>\n<p>\nF\u00f6r att leka med exemplen i denna artikel m\u00e5ste du f\u00f6rst f\u00f6rbereda din arbetsmilj\u00f6:<\/p>\n<ol>\n<li>Installera och konfigurera en OpenShift 4-kluster. I v\u00e5ra exempel anv\u00e4nder vi CodeReady Containers (CRD), installationsanvisningar f\u00f6r detta kan du hitta <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.redhat.com\/openshift\/install\/crc\/installer-provisioned\">h\u00e4r<\/a><\/noindex>.<\/li>\n<li>N\u00e4r klustret \u00e4r klart m\u00e5ste Pipeline Operator installeras p\u00e5 det. Oroa dig inte, det \u00e4r enkelt, installationsanvisningar <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openshift\/pipelines-tutorial\/blob\/master\/install-operator.md\">h\u00e4r<\/a><\/noindex>.<\/li>\n<li>Ladda ner <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\">h\u00e4r<\/a><\/noindex>.<\/li>\n<li>K\u00f6r kommandoradsverktyget create-react-app f\u00f6r att skapa en applikation som sedan kommer att distribueras (detta \u00e4r en enkel applikation <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift-starters\/react-pipeline-example\">React<\/a><\/noindex>).<\/li>\n<li>(Valfritt) Klona repositoriet f\u00f6r att lokalt k\u00f6ra exempelapplikationen med kommandot npm install och sedan npm start.<\/li>\n<\/ol>\n<p>\nI applikationens repository finns ocks\u00e5 en mapp k8s, d\u00e4r YAML-filer f\u00f6r Kubernetes\/OpenShift, som anv\u00e4nds f\u00f6r distribution av applikationen, kommer att ligga. D\u00e4r kommer det att finnas Tasks, ClusterTasks, Resources och Pipelines som vi kommer att skapa i detta <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/webapp-pipeline-tutorial\">f\u00f6rr\u00e5det<\/a><\/noindex>.<\/p>\n<h4>L\u00e5t oss b\u00f6rja<\/h4>\n<p>\nF\u00f6rst och fr\u00e4mst, f\u00f6r v\u00e5rt exempel m\u00e5ste vi skapa ett nytt projekt i OpenShift-klustret. Vi kallar detta projekt webapp-pipeline och skapar det med f\u00f6ljande kommando:<\/p>\n<pre><code class=\"plaintext\">$ oc new-project webapp-pipeline\n<\/code><\/pre>\n<p>\nFram\u00f6ver kommer detta projektnamn att f\u00f6rekomma i koden, s\u00e5 om du v\u00e4ljer att kalla det n\u00e5got annat, gl\u00f6m inte att justera koden fr\u00e5n exemplen i enlighet d\u00e4rmed. Fr\u00e5n och med denna punkt kommer vi att g\u00e5 botten upp, det vill s\u00e4ga, f\u00f6rst skapa alla delar av pipelinen och f\u00f6rst d\u00e4refter sj\u00e4lva pipelinen.<\/p>\n<p>S\u00e5, f\u00f6rst och fr\u00e4mst\u2026<\/p>\n<h4>Tasks<\/h4>\n<p>\nVi skapar ett par uppgifter (tasks) som sedan kommer att hj\u00e4lpa till att distribuera applikationen inom v\u00e5r pipeline. Den f\u00f6rsta uppgiften \u2013 apply_manifests_task \u2013 ansvarar f\u00f6r att till\u00e4mpa YAML-filerna av Kubernetes-resurser (service, deployment och route) som finns i k8s-mappen f\u00f6r v\u00e5r applikation. Den andra uppgiften \u2013 update_deployment_task \u2013 ansvarar f\u00f6r att uppdatera den redan distribuerade bilden till den som skapas av v\u00e5r pipeline.<\/p>\n<p>Oroa dig inte om det \u00e4r oklart just nu. Egentligen \u00e4r dessa uppgifter n\u00e5got som verktyg, och vi kommer att diskutera dem mer detaljerat senare. Men f\u00f6rst skapar vi dem:<\/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>\nSedan, med hj\u00e4lp av tkn CLI-kommandot, kontrollerar vi att uppgifterna har skapats:<\/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>Obs: detta \u00e4r lokala uppgifter f\u00f6r ditt nuvarande projekt.<\/i><\/p>\n<h4>Klasuppgifter Cluster tasks<\/h4>\n<p>\nKlasuppgifter \u00e4r i princip samma sak som vanliga uppgifter. Det vill s\u00e4ga, det \u00e4r en \u00e5teranv\u00e4ndbar samling steg som kombineras p\u00e5 olika s\u00e4tt n\u00e4r en specifik uppgift k\u00f6rs. Skillnaden \u00e4r att klasuppgiften \u00e4r tillg\u00e4nglig \u00f6ver hela klustret. F\u00f6r att se listan \u00f6ver klasuppgifter som automatiskt skapas n\u00e4r Pipeline Operator l\u00e4ggs till, anv\u00e4nder vi \u00e5terigen tkn CLI-kommandot:<\/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>\nOch nu ska vi skapa tv\u00e5 klasuppgifter. Den f\u00f6rsta kommer att generera en S2I-bild och skicka den till det interna OpenShift-registret; den andra kommer att bygga v\u00e5r bild baserat p\u00e5 NGINX, med det inneh\u00e5ll som vi redan har samlat ihop.<\/p>\n<h4>Vi skapar och skickar bilden<\/h4>\n<p>\nN\u00e4r vi skapar den f\u00f6rsta uppgiften kommer vi att upprepa vad vi redan har gjort i den tidigare artikeln om relaterade samlingar. Vi p\u00e5minde oss om att vi anv\u00e4nde S2I-bilden (ubi8-s2i-web-app) f\u00f6r att \"bygga\" v\u00e5r applikation, och vi slutade med en bild som lagras i OpenShifts interna register. Nu kommer vi att anv\u00e4nda denna S2I-bild f\u00f6r webbapplikationen f\u00f6r att skapa en DockerFile f\u00f6r v\u00e5r applikation, och sedan anv\u00e4nder vi Buildah f\u00f6r att utf\u00f6ra den verkliga byggnationen och skicka den resulterande bilden till OpenShifts interna register, eftersom det \u00e4r precis vad OpenShift g\u00f6r n\u00e4r du distribuerar dina applikationer med NodeShift.<\/p>\n<p>Fr\u00e5gar ni hur vi kom fram till allt detta? Fr\u00e5n <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>, vi kopierade den bara och anpassade den f\u00f6r oss sj\u00e4lva.<\/p>\n<p>S\u00e5, nu skapar vi en klusteruppgift 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>\nVi kommer inte att g\u00e5 in p\u00e5 detaljer om detta, utan bara stanna vid parametern OUTPUT_DIR:<\/p>\n<pre><code class=\"plaintext\">params:\n      - name: OUTPUT_DIR\n        description: Platsen f\u00f6r byggutmatningskatalogen\n        default: build\n<\/code><\/pre>\n<p>\nSom standard \u00e4r den h\u00e4r parametern inst\u00e4lld p\u00e5 build, dit React l\u00e4gger den samlade inneh\u00e5llet. Andra ramverk anv\u00e4nder olika s\u00f6kv\u00e4gar, till exempel i Ember \u00e4r det dist. Utmatningen av v\u00e5r f\u00f6rsta klusteruppgift kommer att vara en bild som inneh\u00e5ller de HTML-, JavaScript- och CSS-filer vi har samlat.<\/p>\n<h4>Bygger en bild baserad p\u00e5 NGINX<\/h4>\n<p>\nF\u00f6r v\u00e5r andra klusteruppgift m\u00e5ste den bygga en bild baserad p\u00e5 NGINX, som anv\u00e4nder inneh\u00e5llet fr\u00e5n v\u00e5r redan samlade applikation. I huvudsak \u00e4r detta den del av det f\u00f6reg\u00e5ende avsnittet d\u00e4r vi diskuterade sammanl\u00e4nkade byggnader (chained builds).<\/p>\n<p>F\u00f6r detta \u2013 p\u00e5 samma s\u00e4tt som ovan \u2013 kommer vi att skapa en klusteruppgift 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>\nOm man tittar p\u00e5 koden f\u00f6r dessa klusteruppgifter ser man att det inte specificeras vilket Git-repo vi arbetar med, eller namnen p\u00e5 de bilder vi skapar. Vi anger bara vad vi skickar till Git, eller en viss bild dit den slutliga bilden ska matas. Just d\u00e4rf\u00f6r kan dessa klusteruppgifter \u00e5teranv\u00e4ndas \u00e4ven n\u00e4r man arbetar med andra applikationer.<\/p>\n<p>Och h\u00e4r \u00f6verg\u00e5r vi elegant till n\u00e4sta punkt\u2026<\/p>\n<h4>Resurser<\/h4>\n<p>\nS\u00e5, eftersom som vi just n\u00e4mnde, m\u00e5ste klusteruppgifterna vara s\u00e5 allm\u00e4nna som m\u00f6jligt, m\u00e5ste vi skapa resurser som kommer att anv\u00e4ndas som indata (Git-repository) och utdata (slutbilder). Den f\u00f6rsta resursen vi beh\u00f6ver \u00e4r Git, d\u00e4r v\u00e5r applikation finns, n\u00e5got som detta:<\/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>\nH\u00e4r har PipelineResource typen git. Nyckeln url i sektionen params anger det specifika repositoryt och st\u00e4ller in master-grenen (detta \u00e4r valfritt, men vi skriver den f\u00f6r fullst\u00e4ndighetens skull).<\/p>\n<p>Nu m\u00e5ste vi skapa en resurs f\u00f6r bilden, d\u00e4r resultaten av s2i-web-app-uppgiften kommer att sparas, det g\u00f6rs s\u00e5 h\u00e4r:<\/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>\nH\u00e4r har PipelineResource typen image, och v\u00e4rdet f\u00f6r parametern url pekar p\u00e5 den interna OpenShift Image Registry, specifikt den som finns i namnomr\u00e5det webapp-pipeline. Gl\u00f6m inte att \u00e4ndra denna parameter om du anv\u00e4nder ett annat namnomr\u00e5de.<\/p>\n<p>Och slutligen, den sista resursen vi beh\u00f6ver kommer ocks\u00e5 att ha typen image och detta blir den slutliga bilden av NGINX, som sedan kommer att anv\u00e4ndas vid distribution:<\/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>\nOch igen, observera att denna resurs sparar bilden i OpenShift:s interna register i namnomr\u00e5det webapp-pipeline.<\/p>\n<p>F\u00f6r att skapa alla dessa resurser p\u00e5 en g\u00e5ng, anv\u00e4nder vi kommandot 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>\nF\u00f6r att s\u00e4kerst\u00e4lla att resurserna har skapats kan man g\u00f6ra s\u00e5 h\u00e4r:<\/p>\n<pre><code class=\"plaintext\">$ tkn resource ls\n<\/code><\/pre>\n<p><\/p>\n<h4>Pipeline-conveyern<\/h4>\n<p>\nNu n\u00e4r vi har alla n\u00f6dv\u00e4ndiga delar, ska vi bygga en pipeline av dem genom att k\u00f6ra f\u00f6ljande kommando:<\/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>\nMen innan vi k\u00f6r detta kommando, l\u00e5t oss g\u00e5 igenom dessa delar. Den f\u00f6rsta \u00e4r namnet:<\/p>\n<pre><code class=\"plaintext\">apiVersion: tekton.dev\/v1alpha1\nkind: Pipeline\nmetadata:\n  name: build-and-deploy-react\n<\/code><\/pre>\n<p>\nSedan ser vi i sektionen spec en angivelse av resurserna som vi skapade tidigare:<\/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>\nSedan skapar vi uppgifter som v\u00e5r pipeline ska utf\u00f6ra. F\u00f6rst och fr\u00e4mst m\u00e5ste den utf\u00f6ra den uppgift vi redan har skapat, 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>\nDenna uppgift tar indata (gir-resurs) och utdata (resurs built-web-application-image) parametrar. Vi skickar ocks\u00e5 en speciell parameter s\u00e5 att den inte verifierar TLS, eftersom vi anv\u00e4nder sj\u00e4lvsignerade certifikat:<\/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>\nDen n\u00e4sta uppgiften \u00e4r n\u00e4stan densamma, men h\u00e4r anropas redan den klustertask som vi har skapat, webapp-build-runtime:<\/p>\n<pre><code class=\"plaintext\">namn: build-runtime-image\n    taskRef:\n      namn: webapp-build-runtime\n      typ: ClusterTask\n<\/code><\/pre>\n<p>\nSom med den f\u00f6reg\u00e5ende uppgiften \u00f6verf\u00f6r vi en resurs, men nu \u00e4r det built-web-application-image (utg\u00e5ngen fr\u00e5n v\u00e5r tidigare uppgift). Och som utg\u00e5ng s\u00e4tter vi \u00e5terigen en bild. Eftersom denna uppgift ska utf\u00f6ras efter den f\u00f6reg\u00e5ende, l\u00e4gger vi till f\u00e4ltet 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>\nDe n\u00e4sta tv\u00e5 uppgifterna ansvarar f\u00f6r till\u00e4mpningen av YAML-filerna f\u00f6r tj\u00e4nsten, routen och distributionen som ligger i k8s-katalogen av v\u00e5r webbapplikation, samt f\u00f6r att uppdatera denna distribution vid skapandet av nya bilder. Dessa tv\u00e5 klustertasks angav vi redan i b\u00f6rjan av artikeln.<\/p>\n<h4>Starta pipelinen<\/h4>\n<p>\nS\u00e5, alla delar av v\u00e5r pipeline \u00e4r skapade, och vi startar den med f\u00f6ljande kommando:<\/p>\n<pre><code class=\"plaintext\">$ tkn pipeline start build-and-deploy-react\n<\/code><\/pre>\n<p>\nI detta skede anv\u00e4nds kommandoraden i interaktivt l\u00e4ge och man m\u00e5ste v\u00e4lja l\u00e4mpliga resurser som svar p\u00e5 varje fr\u00e5ga: f\u00f6r git-resursen v\u00e4ljer vi web-application-repo, sedan f\u00f6r den f\u00f6rsta bildresursen \u2013 built-web-application-image, och slutligen f\u00f6r den andra bildresursen \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>\nNu kontrollerar vi statusen f\u00f6r pipelinen med f\u00f6ljande kommando:<\/p>\n<pre><code class=\"plaintext\">$ tkn pipeline logs -f\n<\/code><\/pre>\n<p>\nEfter att pipelinen har startat och applikationen har distribuerats, beg\u00e4r vi den publicerade routen med f\u00f6ljande kommando:<\/p>\n<pre><code class=\"plaintext\">$ oc get route react-pipeline-example --template='http:\/\/{{.spec.host}}'\n<\/code><\/pre>\n<p>\nF\u00f6r b\u00e4ttre visuell \u00f6versikt kan vi se v\u00e5r pipeline i Developer-l\u00e4get i webbkonsolen i avsnittet <b>Pipeline<\/b>, som visas i Fig. 1.<\/p>\n<p><img decoding=\"async\" alt=\"Moderna applikationer p\u00e5 OpenShift, del 3: OpenShift som utvecklingsmilj\u00f6 och OpenShift Pipelines.\" src=\"\/wp-content\/uploads\/2020\/08\/ede9b076414e389c2cd212adeda08956.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Fig. 1. \u00d6versikt \u00f6ver k\u00f6rda pipelines.<\/i><\/p>\n<p>Ett klick p\u00e5 den k\u00f6rda pipelinen visar ytterligare information, som visas i Fig. 2.<\/p>\n<p><img decoding=\"async\" alt=\"Moderna applikationer p\u00e5 OpenShift, del 3: OpenShift som utvecklingsmilj\u00f6 och OpenShift Pipelines.\" src=\"\/wp-content\/uploads\/2020\/08\/64581b1f6d8ff91aedd963019ef29be5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Fig. 2. Ytterligare information om pipelinen.<\/i><\/p>\n<p>Efter den ytterligare informationen kan man se de k\u00f6rda applikationerna i visningen <b>Topologi<\/b>, som visas i Fig. 3.<\/p>\n<p><img decoding=\"async\" alt=\"Moderna applikationer p\u00e5 OpenShift, del 3: OpenShift som utvecklingsmilj\u00f6 och OpenShift Pipelines.\" src=\"\/wp-content\/uploads\/2020\/08\/d23f723e14514ff60ecfddd8eb9bf752.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Fig. 3. K\u00f6rd pod.<\/i><\/p>\n<p>Ett klick p\u00e5 cirkeln i \u00f6vre h\u00f6gra h\u00f6rnet av ikonen \u00f6ppnar v\u00e5r applikation, som visas i Fig. 4.<\/p>\n<p><img decoding=\"async\" alt=\"Moderna applikationer p\u00e5 OpenShift, del 3: OpenShift som utvecklingsmilj\u00f6 och OpenShift Pipelines.\" src=\"\/wp-content\/uploads\/2020\/08\/aa8e09d9fd9f33d5faffc7f661d84ca4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Fig. 4. K\u00f6rd React-applikation.<\/i><\/p>\n<h3>Slutsats<\/h3>\n<p>\nS\u00e5 vi har visat hur man startar en utvecklingsserver f\u00f6r sin applikation p\u00e5 OpenShift och synkroniserar den med det lokala filsystemet. Vi har ocks\u00e5 g\u00e5tt igenom hur man simulerar en chained-build mall med hj\u00e4lp av OpenShift Pipelines. All kod i exemplen fr\u00e5n denna artikel g\u00e5r att hitta <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/webapp-pipeline-tutorial\">h\u00e4r<\/a><\/noindex>.<\/p>\n<h3>Ytterligare resurser (EN)<\/h3>\n<p><\/p>\n<ul>\n<li>Gratis e-bok <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/books\/deploying-openshift\/\">\"Utveckling p\u00e5 OpenShift: en guide f\u00f6r ot\u00e5liga\"<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/06\/11\/container-native-nodejs-istio-rhoar\/\">Bygg containerorienterade Node.js-applikationer med Red Hat OpenShift Application Runtimes och 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\/\">Debugga Node.js-applikationer p\u00e5 OpenShift med 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\/\">Tre kommandon f\u00f6r att l\u00e4ra sig Express fr\u00e5n grunden p\u00e5 OpenShift<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/03\/12\/rhoar-nodejs-annoucement\/\">Tillk\u00e4nnagivande av offentlig version av Node.js inom ramen f\u00f6r 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\/\">\u00d6vervakning av Node.js-applikationer p\u00e5 OpenShift med Prometheus<\/a><\/noindex><\/li>\n<li>Andra artiklar om <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/kubernetes\/\">OpenShift och Kubernetes<\/a><\/noindex> p\u00e5 Red Hats webbplats<\/li>\n<\/ul>\n<h3>Tillk\u00e4nnagivanden om kommande webbinarier<\/h3>\n<p>\nVi startar en serie fredagswebbinarier om den inhemska upplevelsen av Red Hat OpenShift Container Platform och 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 augusti, webbinariet Imperator \u201cOperat\u00f6r\u201d: Operat\u00f6rer i OpenShift och 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 september, DeploymentConfig vs Deployment \u2013 OpenShift-specifika magiska saker f\u00f6r att bygga och distribuera applikationer<\/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 september, Red Hat OpenShift och 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 oktober, Hur man hanterar en pl\u00f6tslig \u00f6kning av belastningen<\/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 oktober, Inbyggd Jenkins, Pipeline-builds, Tekton i Red Hat OpenShift Container Platform<\/b><\/a><\/noindex><\/li>\n<\/ul>\n<p>K\u00e4lla: <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.4 - 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\/sv\/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.4\" \/>\n\t\t<meta property=\"og:locale\" content=\"sv_SE\" \/>\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\/sv\/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\udd47Moderna applikationer p\u00e5 OpenShift, del 3: OpenShift som utvecklingsmilj\u00f6 och OpenShift Pipelines | ProHoster","description":"Hej alla i denna blogg!","canonical_url":"https:\/\/prohoster.info\/sv\/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":"sv_SE","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\/sv\/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\/sv\/wp-json\/wp\/v2\/posts\/92048","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/comments?post=92048"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/posts\/92048\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media\/92049"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/media?parent=92048"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/categories?post=92048"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/sv\/wp-json\/wp\/v2\/tags?post=92048"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}