{"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\/nl\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines","title":{"rendered":"Moderne toepassingen op OpenShift, deel 3: OpenShift als ontwikkelomgeving en OpenShift Pipelines","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hallo allemaal op deze blog! Dit is de derde post in de serie waarin we laten zien hoe je moderne webapplicaties kunt implementeren op Red Hat OpenShift.<\/p>\n<p><img decoding=\"async\" alt=\"Moderne toepassingen op OpenShift, deel 3: OpenShift als ontwikkelomgeving en OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/9c3337b13a3f045d36343308ce6154cc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn de vorige twee berichten hebben we verteld hoe je moderne webapplicaties in slechts een paar stappen kunt implementeren en hoe je de nieuwe S2I-image kunt gebruiken samen met een vooraf gebouwde HTTP-serverimage, zoals NGINX, met behulp van chained builds voor productie-implementatie.<\/p>\n<p>Vandaag laten we zien hoe je een ontwikkelserver voor je applicatie op het OpenShift-platform kunt draaien en deze kunt synchroniseren met het lokale bestandssysteem, en we zullen ook bespreken wat OpenShift Pipelines zijn en hoe je deze kunt gebruiken als alternatief voor chained builds.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>OpenShift als ontwikkelomgeving<\/h3>\n<p><\/p>\n<h4>Ontwikkelworkflow<\/h4>\n<p>\nZoals eerder genoemd in <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/511954\/\">de eerste post<\/a><\/noindex>, is het typische ontwikkelproces voor moderne webapplicaties simpelweg een soort 'ontwikkelserver' die wijzigingen in lokale bestanden volgt. Wanneer deze wijzigingen plaatsvinden, wordt de applicatie gebouwd en vervolgens wordt deze bijgewerkt in de browser.<\/p>\n<p>In de meeste moderne frameworks is zo'n 'ontwikkelserver' ingebouwd in de bijbehorende command-line tools.<\/p>\n<h4>Lokaal voorbeeld<\/h4>\n<p>\nLaten we eerst kijken hoe dit werkt in het geval van lokaal draaien van applicaties. Als voorbeeld nemen we de applicatie <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lholmquist\/react-web-app\">React<\/a><\/noindex> uit eerdere artikelen, hoewel vrijwel dezelfde concepten voor de workflow ook in andere moderne frameworks van toepassing zijn.<br \/>\nDus om de 'ontwikkelserver' in ons React-voorbeeld te draaien, voeren we het volgende commando in:<\/p>\n<pre><code class=\"plaintext\">$ npm run start\n<\/code><\/pre>\n<p>\nDan zien we ongeveer het volgende in het terminalvenster:<\/p>\n<p><img decoding=\"async\" alt=\"Moderne toepassingen op OpenShift, deel 3: OpenShift als ontwikkelomgeving en OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/06f84ffb4c9a6a5868b8b47b8ad1d9ec.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>En onze applicatie opent in de standaardbrowser:<\/p>\n<p><img decoding=\"async\" alt=\"Moderne toepassingen op OpenShift, deel 3: OpenShift als ontwikkelomgeving en OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/72341bb0796352e7343bf31ceb8233cd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Nu, als we wijzigingen aanbrengen in het bestand, zou de applicatie in de browser moeten vernieuwen.<\/p>\n<p>Ok\u00e9, dat is duidelijk voor de lokale ontwikkelingsmodus, maar hoe bereiken we hetzelfde op OpenShift?<\/p>\n<h4>Ontwikkelserver op OpenShift<\/h4>\n<p>\nAls je het je herinnert, hebben we in <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/513948\/\">de vorige post<\/a><\/noindex>het zogenaamde opstartfase (run phase) van de S2I-image besproken en gezien dat standaard het module serve onze webapplicatie bedient.<\/p>\n<p>Als we echter beter kijken <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/ubi8-s2i-web-app\/blob\/master\/s2i\/run#L10\">run script<\/a><\/noindex> In dit voorbeeld is er een omgevingsvariabele $NPM_RUN die het mogelijk maakt om je eigen commando uit te voeren.<\/p>\n<p>Je kunt bijvoorbeeld de nodeshift-module gebruiken om onze applicatie te implementeren:<\/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>Opmerking: het bovenstaande voorbeeld is verkort weergegeven om de algemene idee te illustreren.<\/i><\/p>\n<p>Hier hebben we de omgevingsvariabele NPM_RUN toegevoegd aan onze implementatie, die de uitvoeringsfase vertelt dat het het commando yarn start moet uitvoeren, wat de React-ontwikkelserver binnen onze OpenShift-pod start.<\/p>\n<p>Als we naar de log van de draaiende pod kijken, zal het er ongeveer zo uitzien:<\/p>\n<p><img decoding=\"async\" alt=\"Moderne toepassingen op OpenShift, deel 3: OpenShift als ontwikkelomgeving en OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/5b090223e08e32a3356608881068ce1a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Natuurlijk is dit allemaal niet veel waard totdat we onze lokale code kunnen synchroniseren met de code die ook gecontroleerd wordt op wijzigingen, maar op een externe server leeft.<\/p>\n<h4>Synchronisatie van externe en lokale code<\/h4>\n<p>\nGelukkig helpt nodeshift eenvoudig bij de synchronisatie, en voor het volgen van wijzigingen kun je de watch-opdracht gebruiken.<\/p>\n<p>Dus nadat we het commando hebben uitgevoerd om de ontwikkelserver voor onze applicatie te implementeren, kunnen we gerust het volgende commando gebruiken:<\/p>\n<pre><code class=\"plaintext\">$ npx nodeshift watch\n<\/code><\/pre>\n<p>\nHet resultaat is dat er verbinding wordt gemaakt met de eerder gemaakte pod, waardoor de synchronisatie van onze lokale bestanden met het externe cluster wordt geactiveerd, en de bestanden op ons lokale systeem beginnen te worden gevolgd op wijzigingen.<\/p>\n<p>Daarom, als we nu het bestand src\/App.js bijwerken, zal het systeem reageren op deze wijzigingen, ze naar het externe cluster kopi\u00ebren en de ontwikkelserver starten, die vervolgens onze applicatie in de browser bijwerkt.<\/p>\n<p>Om het geheel compleet te maken, laten we zien hoe deze opdrachten er in hun geheel uitzien:<\/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>\nHet watch-commando is een abstractie bovenop het oc rsync-commando, meer informatie over hoe dit werkt is beschikbaar. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.okd.io\/latest\/dev_guide\/copy_files_to_container.html\">hier<\/a><\/noindex>.<\/p>\n<p>Dit was een voorbeeld voor React, maar dezelfde methode kan ook worden gebruikt met andere frameworks; schrijf gewoon de omgevingsvariabele NPM_RUN op de juiste manier.<br \/>\n\u2003<\/p>\n<h3>OpenShift Pipelines<\/h3>\n<p><img decoding=\"async\" alt=\"Moderne toepassingen op OpenShift, deel 3: OpenShift als ontwikkelomgeving en OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/33b932d3591b22dd00d82509b352d489.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Verder gaan we het hebben over een tool genaamd OpenShift Pipelines, en hoe deze kan worden gebruikt als een alternatief voor gekoppelde builds.<\/p>\n<h4>Wat zijn OpenShift Pipelines?<\/h4>\n<p>\nOpenShift Pipelines is a cloud-oriented CI\/CD system for continuous integration and delivery, designed for organizing pipelines using Tekton. Tekton is a flexible Kubernetes-native CI\/CD framework with open source that allows automation of deployment across various platforms (Kubernetes, serverless, virtual machines, etc.) by abstracting from the underlying layer.<\/p>\n<p>To understand this article, certain knowledge of Pipelines is required, so we strongly recommend familiarizing yourself with the <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openshift\/pipelines-tutorial\">official tutorial<\/a><\/noindex>.<\/p>\n<h4>Setting Up the Working Environment<\/h4>\n<p>\nTo experiment with the examples in this article, you first need to prepare the working environment:<\/p>\n<ol>\n<li>Install and configure an OpenShift 4 cluster. In our examples, we use CodeReady Containers (CRD), installation instructions for which can be found <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.redhat.com\/openshift\/install\/crc\/installer-provisioned\">hier<\/a><\/noindex>.<\/li>\n<li>Once the cluster is ready, you need to install the Pipeline Operator on it. Don't worry, it's easy; installation instructions are available <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openshift\/pipelines-tutorial\/blob\/master\/install-operator.md\">hier<\/a><\/noindex>.<\/li>\n<li>Download <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\">hier<\/a><\/noindex>.<\/li>\n<li>Run the create-react-app command-line tool to create an application that will be deployed later (this is a simple application <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift-starters\/react-pipeline-example\">React<\/a><\/noindex>).<\/li>\n<li>(Optional) Clone the repository to run the application locally with the command npm install and then npm start.<\/li>\n<\/ol>\n<p>\nThe application repository will also contain a k8s folder, where the YAML files for Kubernetes\/OpenShift used for deploying the application will be located. There will be Tasks, ClusterTasks, Resources, and Pipelines that we will create in this <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/webapp-pipeline-tutorial\">de repository<\/a><\/noindex>.<\/p>\n<h4>Let's get started<\/h4>\n<p>\nFirst, for our example, you need to create a new project in the OpenShift cluster. Let's name this project webapp-pipeline and create it with the following command:<\/p>\n<pre><code class=\"plaintext\">$ oc new-project webapp-pipeline\n<\/code><\/pre>\n<p>\nThe project name will be referenced in the code, so if you decide to name it differently, remember to update the code in the examples accordingly. From this point, we will go from the bottom up: that is, we will first create all the components of the pipeline and only then the pipeline itself.<\/p>\n<p>So, first things first...<\/p>\n<h4>Tasks<\/h4>\n<p>\nLaten we een paar taken (tasks) cre\u00ebren die vervolgens helpen bij het implementeren van de applicatie binnen onze pipeline. De eerste taak \u2013 apply_manifests_task \u2013 is verantwoordelijk voor het toepassen van de YAML-configuraties van de Kubernetes-resources (service, deployment en route) die zich in de k8s-map van onze applicatie bevinden. De tweede taak \u2013 update_deployment_task \u2013 is verantwoordelijk voor het bijwerken van het al ge\u00efmplementeerde image naar het image dat door onze pipeline wordt aangemaakt.<\/p>\n<p>Maak je geen zorgen als het nu nog niet helemaal duidelijk is. Eigenlijk zijn deze taken een soort hulpprogramma's, en we zullen ze later in meer detail bespreken. Laten we ze voorlopig gewoon cre\u00ebren:<\/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>\nVervolgens controleren we met de tkn CLI-commando of de taken zijn aangemaakt:<\/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>Opmerking: dit zijn lokale taken van je huidige project.<\/i><\/p>\n<h4>Cluster taken<\/h4>\n<p>\nCluster taken zijn in feite hetzelfde als gewone taken. Dit zijn herbruikbare verzamelingen stappen die op verschillende manieren gecombineerd worden bij het uitvoeren van een specifieke taak. Het verschil is dat een clustertaak overal binnen het cluster beschikbaar is. Om de lijst van clustertaken te zien die automatisch worden aangemaakt bij het toevoegen van de Pipeline Operator, gebruiken we opnieuw het tkn CLI-commando:<\/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>\nLaten we nu twee clustertaken cre\u00ebren. De eerste zal een S2I-image genereren en deze naar de interne OpenShift-register sturen; de tweede zal onze image bouwen op basis van NGINX, waarbij we de al door ons gebouwde applicatie als inhoud gebruiken.<\/p>\n<h4>We cre\u00ebren en verzenden het image<\/h4>\n<p>\nBij het aanmaken van de eerste taak herhalen we wat we al hebben gedaan in het vorige artikel over gekoppelde builds. We herinneren ons dat we het S2I (ubi8-s2i-web-app) afbeelding hebben gebruikt om onze applicatie te 'bouwen', en uiteindelijk hadden we een afbeelding die werd opgeslagen in de interne registry van OpenShift. Nu zullen we deze S2I-afbeelding van de webapplicatie gebruiken om een DockerFile voor onze applicatie te maken, en vervolgens gebruiken we Buildah om de daadwerkelijke build uit te voeren en de verkregen afbeelding naar de interne registry van OpenShift te sturen, aangezien dit precies is wat OpenShift doet wanneer je je applicaties implementeert met NodeShift.<\/p>\n<p>Vraag je je af waar we dit allemaal vandaan hebben? Uit <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>, we hebben het gewoon gekopieerd en aangepast naar onze wensen.<\/p>\n<p>Laten we nu een cluster taak s2i-web-app aanmaken:<\/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>\nWe zullen dit niet in detail bespreken, maar alleen stilstaan bij de parameter OUTPUT_DIR:<\/p>\n<pre><code class=\"plaintext\">params:\n      - name: OUTPUT_DIR\n        description: De locatie van de build output directory\n        default: build\n<\/code><\/pre>\n<p>\nStandaard is deze parameter ingesteld op build, daar plaatst React de samengestelde inhoud. In andere frameworks worden andere paden gebruikt, bijvoorbeeld in Ember is dit dist. De output van onze eerste cluster taak zal een afbeelding zijn die de door ons samengestelde HTML, JavaScript en CSS bevat.<\/p>\n<h4>We bouwen een afbeelding op basis van NGINX<\/h4>\n<p>\nWat betreft onze tweede cluster taak, deze moet een afbeelding op basis van NGINX voor ons bouwen, gebruikmakend van de inhoud van onze reeds samengestelde applicatie. Dit is in feite dat deel van de vorige sectie waarin we de gekoppelde builds bespraken.<\/p>\n<p>Hiervoor zullen we - net als hiervoor - een cluster taak webapp-build-runtime aanmaken:<\/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>\nAls we naar de code van deze cluster taken kijken, zien we dat er geen specifiek Git-repository wordt genoemd waar we mee werken, of de namen van de afbeeldingen die we maken. We geven alleen aan wat we naar Git sturen, of een bepaalde afbeelding waar we de uiteindelijke afbeelding moeten afgeven. Daarom kunnen deze cluster taken hergebruikt worden en ook gebruikt worden bij andere applicaties.<\/p>\n<p>En hier gaan we elegant over naar het volgende punt...<\/p>\n<h4>Hulpmiddelen<\/h4>\n<p>\nDus, aangezien, zoals we net zeiden, cluster taken zo algemeen mogelijk moeten zijn, moeten we bronnen cre\u00ebren die als invoer (Git-repository) en uitvoer (eindafbeeldingen) worden gebruikt. De eerste bron die we nodig hebben, is Git, waar onze applicatie zich bevindt, iets als dit:<\/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>\nHier heeft PipelineResource het type git. De sleutel url in de params sectie wijst op de specifieke repository en stelt de master-tak in (dit is optioneel, maar we schrijven het voor de volledigheid).<\/p>\n<p>Nu moeten we een bron aanmaken voor de afbeelding waarin de resultaten van het uitvoeren van de s2i-web-app taak worden opgeslagen, dit doen we als volgt:<\/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>\nHier heeft PipelineResource het type image, en de waarde van de parameter url verwijst naar de interne OpenShift Image Registry, specifiek die in de namespace webapp-pipeline. Vergeet niet deze parameter te wijzigen als je een andere namespace gebruikt.<\/p>\n<p>En tenslotte, de laatste bron die we nodig hebben, zal ook het type image hebben en dit zal de eindafbeelding van NGINX zijn, die vervolgens zal worden gebruikt bij de implementatie:<\/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>\nLet opnieuw op dat deze bron de afbeelding opslaat in de interne registry van OpenShift in de namespace webapp-pipeline.<\/p>\n<p>Om al deze bronnen in \u00e9\u00e9n keer te cre\u00ebren, maken we gebruik van de create-opdracht:<\/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>\nOm te controleren of de bronnen zijn aangemaakt, kan dat als volgt:<\/p>\n<pre><code class=\"plaintext\">$ tkn resource ls\n<\/code><\/pre>\n<p><\/p>\n<h4>Pipeline<\/h4>\n<p>\nNu we alle benodigde onderdelen hebben, zullen we de pipeline samenstellen door de volgende opdracht te geven:<\/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>\nMaar voordat we deze opdracht uitvoeren, laten we deze onderdelen eens goed bekijken. Ten eerste: de naam:<\/p>\n<pre><code class=\"plaintext\">apiVersion: tekton.dev\/v1alpha1\nkind: Pipeline\nmetadata:\n  name: build-and-deploy-react\n<\/code><\/pre>\n<p>\nVervolgens in de sectie spec zien we de vermelding van de bronnen die we eerder hebben aangemaakt:<\/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>\nDaarna cre\u00ebren we de taken die onze pipeline moet uitvoeren. Allereerst moet hij de taak s2i-web-app uitvoeren die we eerder hebben aangemaakt:<\/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>\nDeze taak neemt de invoer (git-bron) en uitvoer (bron built-web-application-image) parameters. We geven ook een speciale parameter door, zodat deze TLS niet verifieert, omdat we zelfondertekende certificaten gebruiken:<\/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>\nDe volgende taak is bijna hetzelfde, alleen wordt hier de eerder door ons gemaakte cluster-taak webapp-build-runtime aangeroepen:<\/p>\n<pre><code class=\"plaintext\">name: build-runtime-image\n    taskRef:\n      name: webapp-build-runtime\n      kind: ClusterTask\n<\/code><\/pre>\n<p>\nNet als bij de vorige taak, geven we een resource door, maar nu is dat de built-web-application-image (de output van onze vorige taak). En als output geven we opnieuw een afbeelding op. Aangezien deze taak na de vorige moet worden uitgevoerd, voegen we de runAfter-parameter toe:<\/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 volgende twee taken zijn verantwoordelijk voor het toepassen van de YAML-bestanden van de service, de route en de deployment, die zich in de k8s-directory van onze webapp bevinden, evenals voor het updaten van deze deployment bij het maken van nieuwe afbeeldingen. Deze twee cluster-taken hebben we aan het begin van het artikel gedefinieerd.<\/p>\n<h4>Pipeline starten<\/h4>\n<p>\nAlle onderdelen van onze pipeline zijn dus gemaakt, en we zullen deze starten met de volgende opdracht:<\/p>\n<pre><code class=\"plaintext\">$ tkn pipeline start build-and-deploy-react\n<\/code><\/pre>\n<p>\nIn deze fase wordt de commandoregel interactief gebruikt en moeten de juiste resources worden gekozen als reactie op elke aanvraag: voor de git-resource kiezen we web-application-repo, vervolgens voor de eerste afbeelding \u2013 built-web-application-image, en tenslotte voor de tweede afbeelding \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>\nLaten we nu de status van de pipeline controleren met de volgende opdracht:<\/p>\n<pre><code class=\"plaintext\">$ tkn pipeline logs -f\n<\/code><\/pre>\n<p>\nNadat de pipeline is gestart en de applicatie is uitgevoerd, vragen we de gepubliceerde route op met de volgende opdracht:<\/p>\n<pre><code class=\"plaintext\">$ oc get route react-pipeline-example --template='http:\/\/{{.spec.host}}'\n<\/code><\/pre>\n<p>\nVoor een betere visualisatie kunnen we onze pipeline bekijken in de Developer-modus van de webconsole, in de sectie <b>Pipelines<\/b>, zoals weergegeven in Figuur 1.<\/p>\n<p><img decoding=\"async\" alt=\"Moderne toepassingen op OpenShift, deel 3: OpenShift als ontwikkelomgeving en OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/ede9b076414e389c2cd212adeda08956.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Figuur 1. Overzicht van de draaiende pipelines.<\/i><\/p>\n<p>Klikken op de draaiende pipeline toont extra details, zoals weergegeven in Figuur 2.<\/p>\n<p><img decoding=\"async\" alt=\"Moderne toepassingen op OpenShift, deel 3: OpenShift als ontwikkelomgeving en OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/64581b1f6d8ff91aedd963019ef29be5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Figuur 2. Extra details over de pipeline.<\/i><\/p>\n<p>Na de extra details kunnen we de draaiende applicaties bekijken in de weergave <b>Topologie<\/b>, zoals weergegeven in Figuur 3.<\/p>\n<p><img decoding=\"async\" alt=\"Moderne toepassingen op OpenShift, deel 3: OpenShift als ontwikkelomgeving en OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/d23f723e14514ff60ecfddd8eb9bf752.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Figuur 3. Draaiende pod.<\/i><\/p>\n<p>Klikken op de cirkel in de rechterbovenhoek van het pictogram opent onze applicatie, zoals weergegeven in Figuur 4.<\/p>\n<p><img decoding=\"async\" alt=\"Moderne toepassingen op OpenShift, deel 3: OpenShift als ontwikkelomgeving en OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/aa8e09d9fd9f33d5faffc7f661d84ca4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Figuur 4. Draaiende React-applicatie.<\/i><\/p>\n<h3>Conclusie<\/h3>\n<p>\nWe have shown how to launch a development server for your application on OpenShift and synchronize it with the local file system. We also discussed how to simulate a chained-build template using OpenShift Pipelines. All example codes from this article can be found <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/webapp-pipeline-tutorial\">hier<\/a><\/noindex>.<\/p>\n<h3>Aanvullende bronnen (EN)<\/h3>\n<p><\/p>\n<ul>\n<li>Gratis e-boek <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/books\/deploying-openshift\/\">\u2018Ontwikkelen op OpenShift: een gids voor ongeduldigen\u2019<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/06\/11\/container-native-nodejs-istio-rhoar\/\">Container-geori\u00ebnteerde Node.js apps bouwen met Red Hat OpenShift Application Runtimes en 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\/\">Node.js-apps debuggen op OpenShift met 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\/\">Drie commando's om Express vanaf nul te leren op OpenShift<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/03\/12\/rhoar-nodejs-annoucement\/\">Aankondiging van de openbare versie van Node.js in Red Hat OpenShift Application Runtimes<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/12\/21\/monitoring-node-js-applications-on-openshift-with-prometheus\/\">Monitoring van Node.js-apps op OpenShift met Prometheus<\/a><\/noindex><\/li>\n<li>Andere artikelen over <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/kubernetes\/\">OpenShift en Kubernetes<\/a><\/noindex> op de website van Red Hat<\/li>\n<\/ul>\n<h3>Aankondigingen van aankomende webinars<\/h3>\n<p>\nWe beginnen een serie vrijdagwebinars over de native ervaring van het gebruik van de Red Hat OpenShift Container Platform en 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 augustus, webinar Imperator \u2018Operator\u2019: Operators in OpenShift en 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-specifieke toverwoorden voor het bouwen en uitrollen van applicaties<\/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 en 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, Hoe om te gaan met plotselinge pieken in de belasting<\/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, Ingebouwde Jenkins, Pipeline-builds, Tekton in Red Hat OpenShift Container Platform<\/b><\/a><\/noindex><\/li>\n<\/ul>\n<p>Bron: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/515988\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041f\u0440\u0438\u0432\u0435\u0442 \u0432\u0441\u0435\u043c \u0432 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u0433\u0435! \u0421 \u0432\u0430\u043c\u0438 \u0442\u0440\u0435\u0442\u0438\u0439 \u043f\u043e\u0441\u0442 \u0438\u0437 \u0441\u0435\u0440\u0438\u0438, \u0432 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043c\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u043c, \u043a\u0430\u043a \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u043d\u0430 Red Hat OpenShift. \u0412 \u0434\u0432\u0443\u0445 \u043f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0445 \u043f\u043e\u0441\u0442\u0430\u0445 \u043c\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430\u043b\u0438, \u043a\u0430\u043a \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u0442\u044c \u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0432\u0435\u0431-\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0432\u0441\u0435\u0433\u043e \u0437\u0430 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0448\u0430\u0433\u043e\u0432 \u0438 \u043a\u0430\u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043e\u0431\u0440\u0430\u0437 S2I \u0432\u043c\u0435\u0441\u0442\u0435 \u0441 \u0433\u043e\u0442\u043e\u0432\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c HTTP-\u0441\u0435\u0440\u0432\u0435\u0440\u0430, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, NGINX \u0441 \u043f\u043e\u043c\u043e\u0449\u044c \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441\u0431\u043e\u0440\u043e\u043a chained [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":92049,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-92048","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u041f\u0440\u0438\u0432\u0435\u0442 \u0432\u0441\u0435\u043c \u0432 \u044d\u0442\u043e\u043c \u0431\u043b\u043e\u0433\u0435!\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/nl\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"nl_NL\" \/>\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\/nl\/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\udd47 moderne applicaties op OpenShift, deel 3: OpenShift als ontwikkelomgeving en OpenShift Pipelines | ProHoster","description":"Hallo allemaal op deze blog!","canonical_url":"https:\/\/prohoster.info\/nl\/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":"nl_NL","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\/nl\/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\/nl\/wp-json\/wp\/v2\/posts\/92048","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/comments?post=92048"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/posts\/92048\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media\/92049"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/media?parent=92048"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/categories?post=92048"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/nl\/wp-json\/wp\/v2\/tags?post=92048"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}