Hej alla i denna blogg! HÀr Àr det tredje inlÀgget i serien dÀr vi visar hur man distribuerar moderna webbapplikationer pÄ Red Hat OpenShift.

I de tvÄ tidigare inlÀggen har vi berÀttat hur man distribuerar moderna webbapplikationer pÄ bara nÄgra steg och hur man anvÀnder den nya S2I-bilden tillsammans med en fÀrdig HTTP-serverbild, som NGINX, med hjÀlp av kedjade byggnader för att organisera produktionsdistributionen.
Idag visar vi hur man startar en utvecklingsserver för sin applikation pÄ OpenShift och synkroniserar den med filsystemet lokalt, samt pratar om vad OpenShift Pipelines Àr och hur man kan anvÀnda det som ett alternativ till kedjade byggnader.
OpenShift som utvecklingsmiljö
Utvecklingsarbetsflöde
Som nÀmnts i , Àr den typiska utvecklingsprocessen för moderna webbapplikationer helt enkelt en "utvecklingsserver" som övervakar Àndringar i lokala filer. NÀr de intrÀffar startas en byggnad av applikationen och den uppdateras sedan i webblÀsaren.
I de flesta moderna ramverk Àr en sÄdan "utvecklingsserver" inbyggd i de relevanta kommandoradsverktygen.
Lokalt exempel
LÄt oss börja med att visa hur detta fungerar i fallet med lokal körning av applikationer. Som exempel tar vi applikationen frÄn de tidigare artiklarna, Àven om praktiskt taget samma processtÀnkande gÀller för alla andra moderna ramverk.
SÄ för att köra en "utvecklingsserver" i vÄrt exempel med React, skriver vi in följande kommando:
$ npm run start
DÄ ser vi ungefÀr följande i terminalfönstret:

Och vÄr applikation öppnas i webblÀsaren som standard:

Nu, om vi gör Àndringar i filen, bör applikationen uppdateras i webblÀsaren.
OK, utvecklingen i lokalt lÀge Àr tydlig, men hur fÄr man till samma sak pÄ OpenShift?
Utvecklingsserver pÄ OpenShift
Om ni minns, i , vi granskade sÄ kallad körningsfas (run phase) av S2I-bilden och sÄg att servermodulen sköter vÄr webbapplikation som standard.
Men om man tittar lite nÀrmare pÄ det exemplet, sÄ finns det en miljövariabel $NPM_RUN, som tillÄter att köra sin egen kommando.
Till exempel kan man anvÀnda modulen nodeshift för att distribuera vÄr applikation:
$ npx nodeshift --deploy.env NPM_RUN="yarn start" --dockerImage=nodeshift/ubi8-s2i-web-app
Observera: exemplet ovan ges i en förkortad form för att illustrera den allmÀnna idén.
HÀr har vi lagt till en miljövariabel NPM_RUN i vÄr deployment, som sÀger till körrutinen att den ska köra kommandot yarn start, vilket startar Reacts utvecklingsserver inuti vÄr OpenShift pod.
Om vi tittar pÄ loggen frÄn den körande podden, sÄ kommer det att se ungefÀr ut sÄ hÀr:

SjÀlvklart Àr det hÀr allt meningslöst tills vi kan synkronisera lokal kod med den kod som ocksÄ kontrolleras för förÀndringar, men som bor pÄ en fjÀrrserver.
Synkronisering av fjÀrr- och lokal kod
Lyckligtvis kan nodeshift hjÀlpa till med synkroniseringen enkelt, och för att övervaka förÀndringar kan vi anvÀnda kommandot watch.
SÄ efter att vi har kört kommandot för att deploya utvecklingsservern för vÄr applikation, kan vi utan problem anvÀnda följande kommando:
$ npx nodeshift watch
Som ett resultat kommer vi att ansluta till den pod som vi skapade tidigare, synkronisera vÄra lokala filer med den fjÀrrklustret, och filerna pÄ vÄrt lokala system kommer att övervakas för förÀndringar.
SÄ om vi nu uppdaterar filen src/App.js, kommer systemet att reagera pÄ dessa förÀndringar, kopiera dem till den fjÀrrklustret och starta utvecklingsservern, som sedan uppdaterar vÄr applikation i webblÀsaren.
För att fÄ en komplett bild visar vi hur dessa kommandon ser ut helt:
$ 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
$ npx nodeshift watch --strictSSL=false
Kommandot watch Àr en abstraktion över kommandot oc rsync, mer information om hur det fungerar kan man fÄ. .
Detta var ett exempel för React, men exakt samma metod kan anvÀndas med andra ramverk, skriv helt enkelt miljövariabeln NPM_RUN pÄ rÀtt sÀtt.
â
OpenShift Pipelines

Vidare kommer vi att tala om ett verktyg som OpenShift Pipelines, och hur det kan anvÀndas som ett alternativ till sammanhÀngande byggen, chained build.
Vad Àr OpenShift Pipelines
OpenShift Pipelines Àr ett molnbaserat CI/CD-system för kontinuerlig integration och leverans, som Àr utformat för att organisera pipeline med hjÀlp av Tekton. Tekton Àr ett flexibelt Kubernetes-nativt CI/CD-ramverk med öppen kÀllkod som gör det möjligt att automatisera distribution pÄ olika plattformar (Kubernetes, serverless, virtuella maskiner, etc.) genom att abstrahera bort frÄn underliggande nivÄ.
För att förstÄ denna artikel behövs vissa kunskaper om Pipelines, sÄ vi rekommenderar starkt att du först bekantar dig med .
Konfigurera arbetsmiljö
För att leka med exemplen i denna artikel mÄste du först förbereda din arbetsmiljö:
- Installera och konfigurera en OpenShift 4-kluster. I vÄra exempel anvÀnder vi CodeReady Containers (CRD), installationsanvisningar för detta kan du hitta .
- NÀr klustret Àr klart mÄste Pipeline Operator installeras pÄ det. Oroa dig inte, det Àr enkelt, installationsanvisningar .
- Ladda ner (tkn) .
- Kör kommandoradsverktyget create-react-app för att skapa en applikation som sedan kommer att distribueras (detta Àr en enkel applikation ).
- (Valfritt) Klona repositoriet för att lokalt köra exempelapplikationen med kommandot npm install och sedan npm start.
I applikationens repository finns ocksÄ en mapp k8s, dÀr YAML-filer för Kubernetes/OpenShift, som anvÀnds för distribution av applikationen, kommer att ligga. DÀr kommer det att finnas Tasks, ClusterTasks, Resources och Pipelines som vi kommer att skapa i detta .
LÄt oss börja
Först och frÀmst, för vÄrt exempel mÄste vi skapa ett nytt projekt i OpenShift-klustret. Vi kallar detta projekt webapp-pipeline och skapar det med följande kommando:
$ oc new-project webapp-pipeline
Framöver kommer detta projektnamn att förekomma i koden, sÄ om du vÀljer att kalla det nÄgot annat, glöm inte att justera koden frÄn exemplen i enlighet dÀrmed. FrÄn och med denna punkt kommer vi att gÄ botten upp, det vill sÀga, först skapa alla delar av pipelinen och först dÀrefter sjÀlva pipelinen.
SĂ„, först och frĂ€mstâŠ
Tasks
Vi skapar ett par uppgifter (tasks) som sedan kommer att hjĂ€lpa till att distribuera applikationen inom vĂ„r pipeline. Den första uppgiften â apply_manifests_task â ansvarar för att tillĂ€mpa YAML-filerna av Kubernetes-resurser (service, deployment och route) som finns i k8s-mappen för vĂ„r applikation. Den andra uppgiften â update_deployment_task â ansvarar för att uppdatera den redan distribuerade bilden till den som skapas av vĂ„r pipeline.
Oroa dig inte om det Àr oklart just nu. Egentligen Àr dessa uppgifter nÄgot som verktyg, och vi kommer att diskutera dem mer detaljerat senare. Men först skapar vi dem:
$ oc create -f https://raw.githubusercontent.com/nodeshift/webapp-pipeline-tutorial/master/tasks/update_deployment_task.yaml
$ oc create -f https://raw.githubusercontent.com/nodeshift/webapp-pipeline-tutorial/master/tasks/apply_manifests_task.yaml
Sedan, med hjÀlp av tkn CLI-kommandot, kontrollerar vi att uppgifterna har skapats:
$ tkn task ls
NAME AGE
apply-manifests 1 minute ago
update-deployment 1 minute ago
Obs: detta Àr lokala uppgifter för ditt nuvarande projekt.
Klasuppgifter Cluster tasks
Klasuppgifter Àr i princip samma sak som vanliga uppgifter. Det vill sÀga, det Àr en ÄteranvÀndbar samling steg som kombineras pÄ olika sÀtt nÀr en specifik uppgift körs. Skillnaden Àr att klasuppgiften Àr tillgÀnglig över hela klustret. För att se listan över klasuppgifter som automatiskt skapas nÀr Pipeline Operator lÀggs till, anvÀnder vi Äterigen tkn CLI-kommandot:
$ tkn clustertask ls
NAME AGE
buildah 1 day ago
buildah-v0-10-0 1 day ago
jib-maven 1 day ago
kn 1 day ago
maven 1 day ago
openshift-client 1 day ago
openshift-client-v0-10-0 1 day ago
s2i 1 day ago
s2i-go 1 day ago
s2i-go-v0-10-0 1 day ago
s2i-java-11 1 day ago
s2i-java-11-v0-10-0 1 day ago
s2i-java-8 1 day ago
s2i-java-8-v0-10-0 1 day ago
s2i-nodejs 1 day ago
s2i-nodejs-v0-10-0 1 day ago
s2i-perl 1 day ago
s2i-perl-v0-10-0 1 day ago
s2i-php 1 day ago
s2i-php-v0-10-0 1 day ago
s2i-python-3 1 day ago
s2i-python-3-v0-10-0 1 day ago
s2i-ruby 1 day ago
s2i-ruby-v0-10-0 1 day ago
s2i-v0-10-0 1 day ago
Och nu ska vi skapa tvÄ klasuppgifter. Den första kommer att generera en S2I-bild och skicka den till det interna OpenShift-registret; den andra kommer att bygga vÄr bild baserat pÄ NGINX, med det innehÄll som vi redan har samlat ihop.
Vi skapar och skickar bilden
NÀr vi skapar den första uppgiften kommer vi att upprepa vad vi redan har gjort i den tidigare artikeln om relaterade samlingar. Vi pÄminde oss om att vi anvÀnde S2I-bilden (ubi8-s2i-web-app) för att "bygga" vÄr applikation, och vi slutade med en bild som lagras i OpenShifts interna register. Nu kommer vi att anvÀnda denna S2I-bild för webbapplikationen för att skapa en DockerFile för vÄr applikation, och sedan anvÀnder vi Buildah för att utföra den verkliga byggnationen och skicka den resulterande bilden till OpenShifts interna register, eftersom det Àr precis vad OpenShift gör nÀr du distribuerar dina applikationer med NodeShift.
FrÄgar ni hur vi kom fram till allt detta? FrÄn , vi kopierade den bara och anpassade den för oss sjÀlva.
SĂ„, nu skapar vi en klusteruppgift s2i-web-app:
$ oc create -f https://raw.githubusercontent.com/nodeshift/webapp-pipeline-tutorial/master/clustertasks/s2i-web-app-task.yaml
Vi kommer inte att gÄ in pÄ detaljer om detta, utan bara stanna vid parametern OUTPUT_DIR:
params:
- name: OUTPUT_DIR
description: Platsen för byggutmatningskatalogen
default: build
Som standard Àr den hÀr parametern instÀlld pÄ build, dit React lÀgger den samlade innehÄllet. Andra ramverk anvÀnder olika sökvÀgar, till exempel i Ember Àr det dist. Utmatningen av vÄr första klusteruppgift kommer att vara en bild som innehÄller de HTML-, JavaScript- och CSS-filer vi har samlat.
Bygger en bild baserad pÄ NGINX
För vÄr andra klusteruppgift mÄste den bygga en bild baserad pÄ NGINX, som anvÀnder innehÄllet frÄn vÄr redan samlade applikation. I huvudsak Àr detta den del av det föregÄende avsnittet dÀr vi diskuterade sammanlÀnkade byggnader (chained builds).
För detta â pĂ„ samma sĂ€tt som ovan â kommer vi att skapa en klusteruppgift webapp-build-runtime:
$ oc create -f https://raw.githubusercontent.com/nodeshift/webapp-pipeline-tutorial/master/clustertasks/webapp-build-runtime-task.yaml
Om man tittar pÄ koden för dessa klusteruppgifter ser man att det inte specificeras vilket Git-repo vi arbetar med, eller namnen pÄ de bilder vi skapar. Vi anger bara vad vi skickar till Git, eller en viss bild dit den slutliga bilden ska matas. Just dÀrför kan dessa klusteruppgifter ÄteranvÀndas Àven nÀr man arbetar med andra applikationer.
Och hĂ€r övergĂ„r vi elegant till nĂ€sta punktâŠ
Resurser
SÄ, eftersom som vi just nÀmnde, mÄste klusteruppgifterna vara sÄ allmÀnna som möjligt, mÄste vi skapa resurser som kommer att anvÀndas som indata (Git-repository) och utdata (slutbilder). Den första resursen vi behöver Àr Git, dÀr vÄr applikation finns, nÄgot som detta:
# This resource is the location of the git repo with the web application source
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
name: web-application-repo
spec:
type: git
params:
- name: url
value: https://github.com/nodeshift-starters/react-pipeline-example
- name: revision
value: master
HÀr har PipelineResource typen git. Nyckeln url i sektionen params anger det specifika repositoryt och stÀller in master-grenen (detta Àr valfritt, men vi skriver den för fullstÀndighetens skull).
Nu mÄste vi skapa en resurs för bilden, dÀr resultaten av s2i-web-app-uppgiften kommer att sparas, det görs sÄ hÀr:
# This resource is the result of running "npm run build", the resulting built files will be located in /opt/app-root/output
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
name: built-web-application-image
spec:
type: image
params:
- name: url
value: image-registry.openshift-image-registry.svc:5000/webapp-pipeline/built-web-application:latest
HÀr har PipelineResource typen image, och vÀrdet för parametern url pekar pÄ den interna OpenShift Image Registry, specifikt den som finns i namnomrÄdet webapp-pipeline. Glöm inte att Àndra denna parameter om du anvÀnder ett annat namnomrÄde.
Och slutligen, den sista resursen vi behöver kommer ocksÄ att ha typen image och detta blir den slutliga bilden av NGINX, som sedan kommer att anvÀndas vid distribution:
# This resource is the image that will be just the static html, css, js files being run with nginx
apiVersion: tekton.dev/v1alpha1
kind: PipelineResource
metadata:
name: runtime-web-application-image
spec:
type: image
params:
- name: url
value: image-registry.openshift-image-registry.svc:5000/webapp-pipeline/runtime-web-application:latest
Och igen, observera att denna resurs sparar bilden i OpenShift:s interna register i namnomrÄdet webapp-pipeline.
För att skapa alla dessa resurser pÄ en gÄng, anvÀnder vi kommandot create:
$ oc create -f https://raw.githubusercontent.com/nodeshift/webapp-pipeline-tutorial/master/resources/resource.yaml
För att sÀkerstÀlla att resurserna har skapats kan man göra sÄ hÀr:
$ tkn resource ls
Pipeline-conveyern
Nu nÀr vi har alla nödvÀndiga delar, ska vi bygga en pipeline av dem genom att köra följande kommando:
$ oc create -f https://raw.githubusercontent.com/nodeshift/webapp-pipeline-tutorial/master/pipelines/build-and-deploy-react.yaml
Men innan vi kör detta kommando, lÄt oss gÄ igenom dessa delar. Den första Àr namnet:
apiVersion: tekton.dev/v1alpha1
kind: Pipeline
metadata:
name: build-and-deploy-react
Sedan ser vi i sektionen spec en angivelse av resurserna som vi skapade tidigare:
spec:
resources:
- name: web-application-repo
type: git
- name: built-web-application-image
type: image
- name: runtime-web-application-image
type: image
Sedan skapar vi uppgifter som vÄr pipeline ska utföra. Först och frÀmst mÄste den utföra den uppgift vi redan har skapat, s2i-web-app:
tasks:
- name: build-web-application
taskRef:
name: s2i-web-app
kind: ClusterTask
Denna uppgift tar indata (gir-resurs) och utdata (resurs built-web-application-image) parametrar. Vi skickar ocksÄ en speciell parameter sÄ att den inte verifierar TLS, eftersom vi anvÀnder sjÀlvsignerade certifikat:
resurser:
ingÄngar:
- namn: kÀlla
resurs: web-application-repo
utgÄngar:
- namn: bild
resurs: built-web-application-image
parametrar:
- namn: TLSVERIFY
vÀrde: "false"
Den nÀsta uppgiften Àr nÀstan densamma, men hÀr anropas redan den klustertask som vi har skapat, webapp-build-runtime:
namn: build-runtime-image
taskRef:
namn: webapp-build-runtime
typ: ClusterTask
Som med den föregÄende uppgiften överför vi en resurs, men nu Àr det built-web-application-image (utgÄngen frÄn vÄr tidigare uppgift). Och som utgÄng sÀtter vi Äterigen en bild. Eftersom denna uppgift ska utföras efter den föregÄende, lÀgger vi till fÀltet runAfter:
resurser:
ingÄngar:
- namn: bild
resurs: built-web-application-image
utgÄngar:
- namn: bild
resurs: runtime-web-application-image
parametrar:
- namn: TLSVERIFY
vÀrde: "false"
runAfter:
- build-web-application
De nÀsta tvÄ uppgifterna ansvarar för tillÀmpningen av YAML-filerna för tjÀnsten, routen och distributionen som ligger i k8s-katalogen av vÄr webbapplikation, samt för att uppdatera denna distribution vid skapandet av nya bilder. Dessa tvÄ klustertasks angav vi redan i början av artikeln.
Starta pipelinen
SÄ, alla delar av vÄr pipeline Àr skapade, och vi startar den med följande kommando:
$ tkn pipeline start build-and-deploy-react
I detta skede anvĂ€nds kommandoraden i interaktivt lĂ€ge och man mĂ„ste vĂ€lja lĂ€mpliga resurser som svar pĂ„ varje frĂ„ga: för git-resursen vĂ€ljer vi web-application-repo, sedan för den första bildresursen â built-web-application-image, och slutligen för den andra bildresursen â runtime-web-application-image:
? Choose the git resource to use for web-application-repo: web-application-repo (https://github.com/nodeshift-starters/react-pipeline-example)
? 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-
application:latest)
? 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
e-web-application:latest)
Pipelinerun started: build-and-deploy-react-run-4xwsr
Nu kontrollerar vi statusen för pipelinen med följande kommando:
$ tkn pipeline logs -f
Efter att pipelinen har startat och applikationen har distribuerats, begÀr vi den publicerade routen med följande kommando:
$ oc get route react-pipeline-example --template='http://{{.spec.host}}'
För bÀttre visuell översikt kan vi se vÄr pipeline i Developer-lÀget i webbkonsolen i avsnittet Pipeline, som visas i Fig. 1.

Fig. 1. Ăversikt över körda pipelines.
Ett klick pÄ den körda pipelinen visar ytterligare information, som visas i Fig. 2.

Fig. 2. Ytterligare information om pipelinen.
Efter den ytterligare informationen kan man se de körda applikationerna i visningen Topologi, som visas i Fig. 3.

Fig. 3. Körd pod.
Ett klick pÄ cirkeln i övre högra hörnet av ikonen öppnar vÄr applikation, som visas i Fig. 4.

Fig. 4. Körd React-applikation.
Slutsats
SÄ vi har visat hur man startar en utvecklingsserver för sin applikation pÄ OpenShift och synkroniserar den med det lokala filsystemet. Vi har ocksÄ gÄtt igenom hur man simulerar en chained-build mall med hjÀlp av OpenShift Pipelines. All kod i exemplen frÄn denna artikel gÄr att hitta .
Ytterligare resurser (EN)
- Gratis e-bok
- Andra artiklar om pÄ Red Hats webbplats
TillkÀnnagivanden om kommande webbinarier
Vi startar en serie fredagswebbinarier om den inhemska upplevelsen av Red Hat OpenShift Container Platform och Kubernetes:
KĂ€lla: habr.com
