Moderna applikationer pÄ OpenShift, del 3: OpenShift som utvecklingsmiljö och OpenShift Pipelines.

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.

Moderna applikationer pÄ OpenShift, del 3: OpenShift som utvecklingsmiljö och OpenShift Pipelines.

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 det första inlÀgget, À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 React 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:

Moderna applikationer pÄ OpenShift, del 3: OpenShift som utvecklingsmiljö och OpenShift Pipelines.

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

Moderna applikationer pÄ OpenShift, del 3: OpenShift som utvecklingsmiljö och OpenShift Pipelines.

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 i det föregÄende inlÀgget, 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 kör skript 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:

Moderna applikationer pÄ OpenShift, del 3: OpenShift som utvecklingsmiljö och OpenShift Pipelines.

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Ä. hÀr.

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

Moderna applikationer pÄ OpenShift, del 3: OpenShift som utvecklingsmiljö och 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 den officiella handboken.

Konfigurera arbetsmiljö

För att leka med exemplen i denna artikel mÄste du först förbereda din arbetsmiljö:

  1. Installera och konfigurera en OpenShift 4-kluster. I vÄra exempel anvÀnder vi CodeReady Containers (CRD), installationsanvisningar för detta kan du hitta hÀr.
  2. NÀr klustret Àr klart mÄste Pipeline Operator installeras pÄ det. Oroa dig inte, det Àr enkelt, installationsanvisningar hÀr.
  3. Ladda ner Tekton CLI (tkn) hÀr.
  4. Kör kommandoradsverktyget create-react-app för att skapa en applikation som sedan kommer att distribueras (detta Àr en enkel applikation React).
  5. (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 förrÄdet.

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 ĐŸŃ„ĐžŃ†ĐžĐ°Đ»ŃŒĐœĐŸĐč ĐČДрсОО official Node.js, 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.

Moderna applikationer pÄ OpenShift, del 3: OpenShift som utvecklingsmiljö och OpenShift Pipelines.

Fig. 1. Översikt över körda pipelines.

Ett klick pÄ den körda pipelinen visar ytterligare information, som visas i Fig. 2.

Moderna applikationer pÄ OpenShift, del 3: OpenShift som utvecklingsmiljö och OpenShift Pipelines.

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.

Moderna applikationer pÄ OpenShift, del 3: OpenShift som utvecklingsmiljö och OpenShift Pipelines.

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.

Moderna applikationer pÄ OpenShift, del 3: OpenShift som utvecklingsmiljö och OpenShift Pipelines.

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 hÀr.

Ytterligare resurser (EN)

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

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster