Modern Uwendungen op OpenShift, Deel 3: OpenShift als Entwécklungsëmfeld an OpenShift Pipelines

Hallo jiddereen op dësem Blog! Dëst ass den drëtte Post an enger Serie an där mir weisen wéi modern Webapplikatiounen op Red Hat OpenShift ofgebaut ginn.

Modern Uwendungen op OpenShift, Deel 3: OpenShift als Entwécklungsëmfeld an OpenShift Pipelines

An de fréieren zwee Posts hu mir gewisen wéi modern Webapplikatiounen a just e puer Schrëtt z'installéieren a wéi een en neit S2I Bild benotzt zesumme mat engem off-the-shelf HTTP Server Image, wéi NGINX, mat gekettende Builds fir Produktiounsdeployementer ze orchestréieren .

Haut wäerte mir weisen wéi Dir en Entwécklungsserver fir Är Applikatioun op der OpenShift Plattform leeft an et mat dem lokalen Dateiesystem synchroniséiert, an och iwwer wat OpenShift Pipelines sinn a wéi se als Alternativ zu verlinkte Versammlungen benotzt kënne ginn.

OpenShift als Entwécklungsëmfeld

Entwécklung Workflow

Wéi schonn uginn an éischte Post, den typeschen Entwécklungsprozess fir modern Webapplikatiounen ass einfach eng Zort "Entwécklungsserver", deen Ännerungen op lokalen Dateien verfolgt. Wann se optrieden, gëtt d'Applikatioun Build ausgeléist an da gëtt se an de Browser aktualiséiert.

An de meeschte modernen Kaderen ass sou en "Entwécklungsserver" an déi entspriechend Kommandozeil-Tools gebaut.

Lokal Beispill

Als éischt, loosst eis kucken wéi dëst funktionnéiert wann Dir Uwendungen lokal leeft. Loosst eis d'Applikatioun als Beispill huelen reagéieren vu fréieren Artikelen, obwuel bal déiselwecht Workflowkonzepter an all anere modernen Kaderen gëllen.
Also, fir den "Dev Server" an eisem React Beispill ze starten, gi mir de folgende Kommando aginn:

$ npm run start

Dann an der Terminalfenster gesi mir eppes wéi dat:

Modern Uwendungen op OpenShift, Deel 3: OpenShift als Entwécklungsëmfeld an OpenShift Pipelines

An eis Applikatioun wäert am Standardbrowser opmaachen:

Modern Uwendungen op OpenShift, Deel 3: OpenShift als Entwécklungsëmfeld an OpenShift Pipelines

Elo, wa mir Ännerungen un der Datei maachen, soll d'Applikatioun am Browser aktualiséieren.

OK, alles ass kloer mat der Entwécklung am lokalen Modus, awer wéi kënnt Dir datselwecht op OpenShift erreechen?

Entwécklung Server op OpenShift

Wann Dir Iech erënnert, an virdrun Post, mir hunn d'sougenannte Runphase vum S2I-Bild gekuckt a gesinn datt de Servemodul par défaut verantwortlech ass fir eis Webapplikatioun ze servéieren.

Wéi och ëmmer, wann Dir méi no kuckt lafen Skript aus deem Beispill enthält et d'$NPM_RUN Ëmfeld Variabel, déi Iech erlaabt Äre Kommando auszeféieren.

Zum Beispill kënne mir den Nodeshift Modul benotzen fir eis Applikatioun z'installéieren:

$ npx nodeshift --deploy.env NPM_RUN="yarn start" --dockerImage=nodeshift/ubi8-s2i-web-app

Notiz: Dat Beispill hei uewen ass verkierzt fir déi allgemeng Iddi ze illustréieren.

Hei hu mir d'NPM_RUN Ëmfeld Variabel fir eis Deployment bäigefüügt, déi d'Runtime seet fir de Garnstart Kommando auszeféieren, wat de React Entwécklungsserver an eisem OpenShift Pod ufänkt.

Wann Dir de Logbuch vun engem lafende Pod kuckt, gesäit et esou aus:

Modern Uwendungen op OpenShift, Deel 3: OpenShift als Entwécklungsëmfeld an OpenShift Pipelines

Natierlech wäert dat alles näischt sinn, bis mir de lokalen Code mam Code synchroniséiere kënnen, deen och fir Ännerungen iwwerwaacht gëtt, awer op engem Fernserver lieft.

Synchroniséiert Fern- a Lokalcode

Glécklecherweis kann Nodeshift einfach mat Synchroniséierung hëllefen, an Dir kënnt d'Auerbefehl benotze fir Ännerungen ze verfolgen.

Also nodeems mir de Kommando ausgefouert hunn fir den Entwécklungsserver fir eis Applikatioun z'installéieren, kënne mir sécher de folgende Kommando benotzen:

$ npx nodeshift watch

Als Resultat gëtt eng Verbindung mam Lafen Pod gemaach, dee mir e bësse méi fréi erstallt hunn, d'Synchroniséierung vun eise lokalen Dateien mam Remote Cluster gëtt aktivéiert, an d'Dateien op eisem lokalen System fänken un fir Ännerungen ze iwwerwaachen.

Dofir, wa mir elo d'src/App.js Datei aktualiséieren, reagéiert de System op dës Ännerungen, kopéiert se op de Remote Cluster an start den Entwécklungsserver, deen dann eis Applikatioun am Browser aktualiséieren.

Fir d'Bild komplett ze maachen, loosst eis weisen wéi dës ganz Kommandoen ausgesinn:

$ 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

De Watch Kommando ass eng Abstraktioun uewen um oc rsync Kommando, Dir kënnt méi léieren wéi et funktionnéiert hei.

Dëst war e Beispill fir React, awer déi exakt selwecht Method kann mat anere Kaderen benotzt ginn, just d'NPM_RUN Ëmfeldvariabel setzen wéi néideg.

Openshift Pipelines

Modern Uwendungen op OpenShift, Deel 3: OpenShift als Entwécklungsëmfeld an OpenShift Pipelines

Als nächst wäerte mir iwwer e Tool wéi OpenShift Pipelines schwätzen a wéi et als Alternativ zu chained Builds benotzt ka ginn.

Wat ass OpenShift Pipelines

OpenShift Pipelines ass e Cloud-native CI / CD kontinuéierlech Integratioun a Liwwersystem entwéckelt fir Pipelines mat Tekton z'organiséieren. Tekton ass e flexibelen Open-Source Kubernetes-native CI / CD Kader deen Iech erlaabt d'Deployment op verschiddene Plattformen (Kubernetes, Serverlos, virtuelle Maschinnen, etc.) ze automatiséieren andeems Dir vun der Basisschicht abstrakéiert.

Dësen Artikel ze verstoen erfuerdert e puer Wëssen iwwer Pipelines, also empfeelen mir Iech fir d'éischt ze liesen offiziell Léierbuch.

Ariichten vun Ärem Aarbechtsëmfeld

Fir mat de Beispiller an dësem Artikel ze spillen, musst Dir als éischt Äert Aarbechtsëmfeld virbereeden:

  1. Installéieren a konfiguréieren en OpenShift 4 Cluster. Eis Beispiller benotzen CodeReady Containers (CRD) fir dëst, Installatiounsinstruktiounen fir déi kënne fonnt ginn hei.
  2. Nodeems de Cluster fäerdeg ass, musst Dir Pipeline Operator op et installéieren. Keng Angscht, et ass einfach, Installatiounsinstruktiounen hei.
  3. download Tekton CLI (tkn) hei.
  4. Run de Create-react-App Kommandozeil Tool fir eng Applikatioun ze kreéieren déi Dir dann ofsetzt (dëst ass eng einfach Applikatioun reagéieren).
  5. (Optional) Klon de Repository fir d'Beispillapplikatioun lokal mat npm installéieren ze lafen an dann npm Start.

D'Applikatiounsrepository wäert och e k8s-Ordner hunn, deen d'Kubernetes / OpenShift YAMLs enthält, déi benotzt gi fir d'Applikatioun z'installéieren. Et ginn Aufgaben, ClusterTasks, Ressourcen a Pipelines déi mir an dësem erstellen Repositories.

Géi erof

Den éischte Schrëtt fir eist Beispill ass en neie Projet am OpenShift Cluster ze kreéieren. Loosst eis dëse Projet Webapp-Pipeline nennen an et mat dem folgenden Kommando erstellen:

$ oc new-project webapp-pipeline

Dëse Projet Numm wäert spéider am Code erschéngen, also wann Dir décidéiert et eppes anescht ze nennen, vergiesst net de Beispillcode deementspriechend z'änneren. Vun dësem Punkt un wäerte mir net vun uewen erof goen, mee ënnen no uewen: dat ass, mir wäerte fir d'éischt all d'Komponente vum Fërderband erstellen, an nëmmen dann de Fërderband selwer.

Also, éischtens ...

Aufgaben

Loosst eis e puer Aufgaben erstellen, déi dann hëllefen d'Applikatioun an eiser Pipeline z'installéieren. Déi éischt Aufgab - application_manifests_task - ass verantwortlech fir de YAML vun deene Kubernetes Ressourcen (Service, Deployment a Route) z'applizéieren, déi am k8s Dossier vun eiser Applikatioun sinn. Déi zweet Aufgab - update_deployment_task - ass verantwortlech fir d'Aktualiséierung vun engem scho ofgebauten Bild op deen vun eiser Pipeline erstallt gouf.

Maacht Iech keng Suergen, wann et nach net ganz kloer ass. Tatsächlech sinn dës Aufgaben eppes wéi Utilities, a mir wäerte se e bësse méi spéit méi detailléiert kucken. Fir elo, loosst eis se just erstellen:

$ 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

Dann, mat dem tkn CLI Kommando, wäerte mir kucken ob d'Aufgaben erstallt goufen:

$ tkn task ls

NAME                AGE
apply-manifests     1 minute ago
update-deployment   1 minute ago

Notiz: Dëst sinn lokal Aufgaben fir Ären aktuelle Projet.

Cluster Aufgaben

Cluster Aufgaben sinn am Fong d'selwecht wéi einfach Aufgaben. Dat ass, et ass eng weiderverwendbar Sammlung vu Schrëtt, déi op eng oder aner Manéier kombinéiert ginn wann Dir eng spezifesch Aufgab leeft. Den Ënnerscheed ass datt eng Cluster Aufgab iwwerall am Cluster verfügbar ass. Fir d'Lëscht vun de Cluster Aufgaben ze gesinn, déi automatesch erstallt ginn wann Dir Pipeline Operator bäidréit, benotze mir erëm den tkn CLI Kommando:

$ 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

Loosst eis elo zwee Cluster Aufgaben erstellen. Déi éischt wäert d'S2I Bild generéieren an et an d'intern OpenShift Registry schécken; déi zweet ass eist Bild op NGINX ze bauen, mat der Applikatioun déi mir scho als Inhalt gebaut hunn.

Erstellt a schéckt d'Bild

Wann Dir déi éischt Aufgab erstellt, widderhuelen mir dat wat mir schonn am virege Artikel iwwer verlinkte Versammlungen gemaach hunn. Denkt drun datt mir d'S2I Bild (ubi8-s2i-web-App) benotzt hunn fir eis Applikatioun ze "bauen", an op en Enn mat engem Bild gespäichert am OpenShift internen Registry. Elo benotze mir dëst S2I Web App Bild fir en DockerFile fir eis App ze kreéieren an dann Buildah ze benotzen fir déi aktuell Build ze maachen an dat resultéierend Bild an d'OpenShift intern Registry ze drécken, well dat ass genau dat wat OpenShift mécht wann Dir Är Uwendungen mat NodeShift benotzt .

Wéi wousste mir dat alles, frot Dir? Vun offiziell Versioun vum offiziellen Node.js, mir hunn et just kopéiert a fir eis selwer geännert.

Also, loosst eis elo d's2i-Web-App Cluster Aufgab erstellen:

$ oc create -f https://raw.githubusercontent.com/nodeshift/webapp-pipeline-tutorial/master/clustertasks/s2i-web-app-task.yaml

Mir wäerten dëst net am Detail analyséieren, awer nëmmen op den OUTPUT_DIR Parameter konzentréieren:

params:
      - name: OUTPUT_DIR
        description: The location of the build output directory
        default: build

Par défaut ass dëse Parameter gläich mam Bau, dat ass wou React de versammelten Inhalt setzt. Aner Kaderen benotzen verschidde Weeër, zum Beispill, am Ember ass et dist. D'Output vun eiser éischter Cluster Aufgab ass e Bild mat HTML, JavaScript an CSS déi mir gesammelt hunn.

Baut e Bild baséiert op NGINX

Wat eis zweet Cluster Aufgab ugeet, sollt et en NGINX-baséiert Bild fir eis bauen, mam Inhalt vun der Applikatioun déi mir scho gebaut hunn. Weesentlechen ass dëst den Deel vun der viregter Sektioun wou mir op chained Builds gekuckt hunn.

Fir dëst ze maachen, wäerte mir - genee d'selwecht wéi just uewen - eng Clustertask erstellen webapp-build-runtime:

$ oc create -f https://raw.githubusercontent.com/nodeshift/webapp-pipeline-tutorial/master/clustertasks/webapp-build-runtime-task.yaml

Wann Dir de Code fir dës Cluster Aufgaben kuckt, kënnt Dir gesinn datt et net de Git Repository spezifizéiert mat deem mir schaffen oder d'Nimm vun de Biller déi mir kreéieren. Mir spezifizéieren nëmmen wat genau mir op Git transferéieren, oder e bestëmmt Bild wou d'Finale Bild soll erausginn. Dofir kënnen dës Cluster Aufgaben erëmbenotzt ginn wann Dir mat aneren Uwendungen schafft.

An hei gi mer graziéis op den nächste Punkt...

Ressourcen

Also, well, wéi mir just gesot hunn, Cluster Aufgaben sou allgemeng wéi méiglech solle sinn, musse mir Ressourcen kreéieren déi als Input (de Git Repository) an als Output (déi endgülteg Biller) benotzt ginn. Déi éischt Ressource déi mir brauchen ass Git, wou eis Applikatioun wunnt, sou eppes:

# 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

Hei ass PipelineResource vum Typ git. Den URL-Schlëssel an der Params Sektioun weist op e spezifesche Repository a spezifizéiert d'Meeschterzweig (dëst ass fakultativ, awer mir schreiwen et fir Vollständegkeet).

Elo musse mir eng Ressource fir d'Bild erstellen wou d'Resultater vun der s2i-Web-App Aufgab gespäichert ginn, dëst gëtt esou gemaach:

# 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

Hei ass d'PipelineResource vum Typ Bild, an de Wäert vum URL Parameter weist op d'intern OpenShift Image Registry, speziell deen am Webapp-Pipeline Nummraum. Vergiesst net dës Astellung z'änneren wann Dir en anere Nummraum benotzt.

A schliisslech wäert déi lescht Ressource déi mir brauchen och vum Typ Bild sinn an dëst wäert dat lescht NGINX Bild sinn dat dann wärend der Deployment benotzt gëtt:

# 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

Nach eng Kéier, bemierkt datt dës Ressource d'Bild am internen OpenShift Registry am Webapp-Pipeline Nummraum späichert.

Fir all dës Ressourcen gläichzäiteg ze kreéieren, benotze mir de Kommando erstellen:

$ oc create -f https://raw.githubusercontent.com/nodeshift/webapp-pipeline-tutorial/master/resources/resource.yaml

Dir kënnt sécher sinn datt d'Ressourcen esou erstallt goufen:

$ tkn resource ls

Conveyor Pipeline

Elo datt mir all déi néideg Komponenten hunn, loosst eis eng Pipeline vun hinnen zesummestellen andeems Dir se mam folgendem Kommando erstellt:

$ oc create -f https://raw.githubusercontent.com/nodeshift/webapp-pipeline-tutorial/master/pipelines/build-and-deploy-react.yaml

Awer ier mer dëse Kommando ausféieren, kucke mer dës Komponenten. Déi éischt ass den Numm:

apiVersion: tekton.dev/v1alpha1
kind: Pipeline
metadata:
  name: build-and-deploy-react

Dann an der Spezifizéierungssektioun gesi mir eng Indikatioun vun de Ressourcen déi mir virdru erstallt hunn:

spec:
  resources:
    - name: web-application-repo
      type: git
    - name: built-web-application-image
      type: image
    - name: runtime-web-application-image
      type: image

Mir kreéieren dann d'Aufgaben déi eis Pipeline muss ofgeschloss hunn. Als éischt muss et d's2i-Web-App Aufgab ausféieren, déi mir scho erstallt hunn:

tasks:
    - name: build-web-application
      taskRef:
        name: s2i-web-app
        kind: ClusterTask

Dës Aufgab hëlt Input (gir Ressource) an Ausgang (gebaut-Web-Applikatioun-Bild Ressource) Parameteren. Mir ginn et och e spezielle Parameter sou datt et TLS net verifizéiert well mir selbst ënnerschriwwen Certificaten benotzen:

resources:
        inputs:
          - name: source
            resource: web-application-repo
        outputs:
          - name: image
            resource: built-web-application-image
      params:
        - name: TLSVERIFY
          value: "false"

Déi nächst Aufgab ass bal d'selwecht, nëmmen hei ass d'Webapp-Build-Runtime Cluster Task déi mir scho erstallt hunn genannt:

name: build-runtime-image
    taskRef:
      name: webapp-build-runtime
      kind: ClusterTask

Wéi mat der viregter Aufgab, passéiere mir eng Ressource, awer elo ass et gebaut-Web-Applikatioun-Bild (den Ausgang vun eiser viregter Aufgab). An als Ausgang setzen mir d'Bild erëm. Well dës Aufgab muss no der viregter ausgefouert ginn, addéiere mir de RunAfter Feld:

resources:
        inputs:
          - name: image
            resource: built-web-application-image
        outputs:
          - name: image
            resource: runtime-web-application-image
        params:
        - name: TLSVERIFY
          value: "false"
      runAfter:
        - build-web-application

Déi nächst zwou Aufgaben si verantwortlech fir de Service, de Wee an d'Deployment YAML Dateien ze benotzen déi am k8s Verzeechnes vun eiser Webapplikatioun liewen, an och fir dës Deployment ze aktualiséieren wann Dir nei Biller erstellt. Mir definéiert dës zwou Cluster Aufgaben am Ufank vum Artikel.

De Fërderband starten

Also, all Deeler vun eiser Pipeline ginn erstallt, a mir lafen et mam folgendem Kommando:

$ tkn pipeline start build-and-deploy-react

Op dëser Etapp gëtt d'Kommandozeil interaktiv benotzt an Dir musst déi entspriechend Ressourcen auswielen an Äntwert op all seng Ufroen: fir d'Git Ressource, wielt Web-Applikatioun-Repo, dann fir déi éischt Bildressource, Built-Web-Applikatioun -image, a schliisslech, fir zweet Bildressource -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

Loosst eis elo de Status vun der Pipeline iwwerpréiwen mat dem folgenden Kommando:

$ tkn pipeline logs -f

Wann d'Pipeline ugefaang huet an d'Applikatioun ofgebaut gouf, kënne mir de publizéierte Wee mat dem folgenden Kommando ufroen:

$ oc get route react-pipeline-example --template='http://{{.spec.host}}'

Fir méi grouss Visualiséierung, kënnt Dir eis Pipeline am Entwécklermodus vun der Webkonsole an der Sektioun kucken Pipelines, wéi an der Fig. 1.

Modern Uwendungen op OpenShift, Deel 3: OpenShift als Entwécklungsëmfeld an OpenShift Pipelines

Fig.1. Iwwerpréiwung vun Lafen Pipelines.

Klickt op eng lafend Pipeline weist zousätzlech Detailer, wéi an der Figur 2.

Modern Uwendungen op OpenShift, Deel 3: OpenShift als Entwécklungsëmfeld an OpenShift Pipelines

Reis. 2. Zousätzlech Informatiounen iwwert d'Pipeline.

No méi Informatioun, kënnt Dir Lafen Uwendungen an der Vue gesinn Topologie, wéi an Fig.3 gewisen.

Modern Uwendungen op OpenShift, Deel 3: OpenShift als Entwécklungsëmfeld an OpenShift Pipelines

Fig 3. Lancéiert Pod.

Klickt op de Krees an der oberer rechter Ecke vun der Ikon mécht eis Applikatioun op, wéi an der Fig.

Modern Uwendungen op OpenShift, Deel 3: OpenShift als Entwécklungsëmfeld an OpenShift Pipelines

Reis. 4. Lafen React Applikatioun.

Konklusioun

Also hu mir gewisen wéi Dir en Entwécklungsserver fir Är Applikatioun op OpenShift ausféiert an et mam lokalen Dateiesystem synchroniséiert. Mir hunn och gekuckt wéi een eng chained-build Schabloun simuléiert mat OpenShift Pipelines. All Beispill Coden aus dësem Artikel kann fonnt ginn hei.

Zousätzlech Ressourcen (EN)

Ukënnegung vun Upëff Webinars

Mir starten eng Serie vu Freideg Webinars iwwer gebierteg Erfahrung mat Red Hat OpenShift Container Plattform a Kubernetes:

Source: will.com

Setzt e Commentaire