{"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\/da\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines","title":{"rendered":"Moderne applikationer p\u00e5 OpenShift, del 3: OpenShift som udviklingsmilj\u00f8 og OpenShift Pipelines","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hej alle sammen i denne blog! Her er det tredje indl\u00e6g i serien, hvor vi viser, hvordan man implementerer moderne webapplikationer p\u00e5 Red Hat OpenShift.<\/p>\n<p><img decoding=\"async\" alt=\"Moderne applikationer p\u00e5 OpenShift, del 3: OpenShift som udviklingsmilj\u00f8 og OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/9c3337b13a3f045d36343308ce6154cc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nI de to foreg\u00e5ende indl\u00e6g har vi forklaret, hvordan man implementerer moderne webapplikationer p\u00e5 f\u00e5 trin, og hvordan man bruger det nye S2I-billede sammen med et f\u00e6rdigt HTTP-serverbillede, som NGINX, ved hj\u00e6lp af k\u00e6dede builds til at organisere produktionsimplementeringen.<\/p>\n<p>I dag viser vi, hvordan man starter en udviklingsserver for sin applikation p\u00e5 OpenShift-platformen og synkroniserer den med det lokale filsystem, samt taler om, hvad OpenShift Pipelines er, og hvordan de kan anvendes som et alternativ til k\u00e6dede builds.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>OpenShift som udviklingsmilj\u00f8<\/h3>\n<p><\/p>\n<h4>Udviklingsarbejdsgang<\/h4>\n<p>\nSom n\u00e6vnt i <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/511954\/\">det f\u00f8rste indl\u00e6g<\/a><\/noindex>, er den typiske udviklingsproces for moderne webapplikationer blot en slags \"udviklingsserver\", der overv\u00e5ger \u00e6ndringer i de lokale filer. N\u00e5r de opst\u00e5r, starter applikationen en bygning, og derefter opdateres den i browseren.<\/p>\n<p>I de fleste moderne rammer er en s\u00e5dan \"udviklingsserver\" indbygget i de relevante kommandolinjev\u00e6rkt\u00f8jer.<\/p>\n<h4>Lokalt eksempel<\/h4>\n<p>\nFor at begynde, lad os se, hvordan det fungerer i tilf\u00e6lde af lokal k\u00f8rsel af applikationer. Som eksempel vil vi tage applikationen <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lholmquist\/react-web-app\">React<\/a><\/noindex> fra de tidligere artikler, selvom n\u00e6sten de samme arbejdsgangskoncept bruges i alle andre moderne rammer.<br \/>\nS\u00e5 for at starte \"udviklingsserveren\" i vores eksempel med React, indtaster vi f\u00f8lgende kommando:<\/p>\n<pre><code class=\"plaintext\">$ npm run start\n<\/code><\/pre>\n<p>\nS\u00e5 vil vi se noget lignende i terminalvinduet:<\/p>\n<p><img decoding=\"async\" alt=\"Moderne applikationer p\u00e5 OpenShift, del 3: OpenShift som udviklingsmilj\u00f8 og OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/06f84ffb4c9a6a5868b8b47b8ad1d9ec.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Og vores applikation \u00e5bner i standardbrowseren:<\/p>\n<p><img decoding=\"async\" alt=\"Moderne applikationer p\u00e5 OpenShift, del 3: OpenShift som udviklingsmilj\u00f8 og OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/72341bb0796352e7343bf31ceb8233cd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Nu, hvis vi foretager \u00e6ndringer i filen, skal applikationen opdateres i browseren.<\/p>\n<p>OK, udviklingen i lokal tilstand er klar, men hvordan f\u00e5r vi det til at fungere p\u00e5 OpenShift?<\/p>\n<h4>Udviklingsserver p\u00e5 OpenShift<\/h4>\n<p>\nHvis du kan huske, i <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/513948\/\">i det tidligere indl\u00e6g<\/a><\/noindex>, gennemgik vi den s\u00e5kaldte k\u00f8rselfase (run phase) af S2I-billedet og s\u00e5, at standardm\u00e6ssigt bliver vores webapplikation betjent af modulet serve.<\/p>\n<p>Men hvis vi ser n\u00e6rmere p\u00e5 <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/ubi8-s2i-web-app\/blob\/master\/s2i\/run#L10\">k\u00f8rselskriptet<\/a><\/noindex> fra det eksempel, s\u00e5 er der en milj\u00f8variabel $NPM_RUN, der giver mulighed for at k\u00f8re sin egen kommando.<\/p>\n<p>For example, you can use the nodeshift module to deploy our application:<\/p>\n<pre><code class=\"plaintext\">$ npx nodeshift --deploy.env NPM_RUN=&quot;yarn start&quot; --dockerImage=nodeshift\/ubi8-s2i-web-app\n<\/code><\/pre>\n<p>\n<i>Note: the example above is presented in a shortened form to illustrate the general idea.<\/i><\/p>\n<p>Here we added the environment variable NPM_RUN to our deployment, which tells the execution phase to run the command yarn start, which starts the React development server inside our OpenShift pod.<\/p>\n<p>If you look at the logs of the running pod, it will look something like this:<\/p>\n<p><img decoding=\"async\" alt=\"Moderne applikationer p\u00e5 OpenShift, del 3: OpenShift som udviklingsmilj\u00f8 og OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/5b090223e08e32a3356608881068ce1a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Of course, this will be meaningless until we can synchronize our local code with the code that is also monitored for changes but lives on a remote server.<\/p>\n<h4>Synchronization of remote and local code<\/h4>\n<p>\nFortunately, nodeshift makes synchronization easy, and to track changes, you can use the watch command.<\/p>\n<p>So after we execute the command to deploy the development server for our application, we can confidently use this command:<\/p>\n<pre><code class=\"plaintext\">$ npx nodeshift watch\n<\/code><\/pre>\n<p>\nAs a result, it will connect to the running pod we created earlier, activate the synchronization of our local files with the remote cluster, and local system files will start to be monitored for changes.<\/p>\n<p>Therefore, if you now update the file src\/App.js, the system will react to these changes, copy them to the remote cluster, and start the development server, which will then update our application in the browser.<\/p>\n<p>To complete the picture, let\u2019s show how these commands look in full:<\/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=&quot;yarn start&quot; --deploy.port 3000\n\n$ npx nodeshift watch --strictSSL=false\n<\/code><\/pre>\n<p>\nThe watch command is an abstraction over the oc rsync command, you can learn more about how it works. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.okd.io\/latest\/dev_guide\/copy_files_to_container.html\">her<\/a><\/noindex>.<\/p>\n<p>This was an example for React, but the same method can be used with other frameworks; just write the environment variable NPM_RUN appropriately.<br \/>\n\u2003<\/p>\n<h3>OpenShift Pipelines<\/h3>\n<p><img decoding=\"async\" alt=\"Moderne applikationer p\u00e5 OpenShift, del 3: OpenShift som udviklingsmilj\u00f8 og OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/33b932d3591b22dd00d82509b352d489.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Next, we will discuss a tool called OpenShift Pipelines and how it can be used as an alternative to related chained builds.<\/p>\n<h4>What are OpenShift Pipelines?<\/h4>\n<p>\nOpenShift Pipelines er et cloudbaseret CI\/CD-system til kontinuerlig integration og levering, designet til at organisere pipelines ved hj\u00e6lp af Tekton. Tekton er et fleksibelt Kubernetes-nativt CI\/CD-rammev\u00e6rk med \u00e5bent kildekode, der g\u00f8r det muligt at automatisere implementering p\u00e5 forskellige platforme (Kubernetes, serverless, virtuelle maskiner osv.) ved at abstrahere fra det underliggende niveau.<\/p>\n<p>For at forst\u00e5 denne artikel kr\u00e6ves der visse kendskaber til Pipelines, s\u00e5 vi anbefaler st\u00e6rkt at begynde med at g\u00f8re dig bekendt med <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openshift\/pipelines-tutorial\">den officielle vejledning<\/a><\/noindex>.<\/p>\n<h4>Ops\u00e6tning af arbejdsomr\u00e5de<\/h4>\n<p>\nFor at lege med eksemplerne fra denne artikel skal du f\u00f8rst forberede dit arbejdsomr\u00e5de:<\/p>\n<ol>\n<li>Installere og konfigurere et OpenShift 4-klynge. I vores eksempler bruger vi CodeReady Containers (CRD), installationsvejledningen til hvilket kan findes <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.redhat.com\/openshift\/install\/crc\/installer-provisioned\">her<\/a><\/noindex>.<\/li>\n<li>N\u00e5r klyngen er klar, skal du installere Pipeline Operator. Frygt ikke, det er let, installationsvejledningen findes <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openshift\/pipelines-tutorial\/blob\/master\/install-operator.md\">her<\/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\">her<\/a><\/noindex>.<\/li>\n<li>Starte kommandolinjev\u00e6rkt\u00f8jet create-react-app for at oprette en applikation, som derefter skal implementeres (det er en simpel applikation <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift-starters\/react-pipeline-example\">React<\/a><\/noindex>).<\/li>\n<li>(Valgfrit) Klon repositoryet for lokalt at k\u00f8re applikationseksemplet ved hj\u00e6lp af npm install og derefter npm start.<\/li>\n<\/ol>\n<p>\nI applikationsrepositoryet vil der ogs\u00e5 v\u00e6re en mappe k8s, hvor YAML-filerne til Kubernetes\/OpenShift, der bruges til implementeringen af applikationen, vil v\u00e6re. Der vil v\u00e6re Tasks, ClusterTasks, Resources og Pipelines, som vi vil oprette i dette <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/webapp-pipeline-tutorial\">repository<\/a><\/noindex>.<\/p>\n<h4>Lad os komme i gang<\/h4>\n<p>\nF\u00f8rst skal vi for vores eksempel oprette et nyt projekt i OpenShift-klyngen. Vi kalder dette projekt webapp-pipeline og opretter det med f\u00f8lgende kommando:<\/p>\n<pre><code class=\"plaintext\">$ oc new-project webapp-pipeline\n<\/code><\/pre>\n<p>\nDerefter vil dette projektnavn optr\u00e6de i koden, s\u00e5 husk at \u00e6ndre koden i eksemplerne, hvis du v\u00e6lger at kalde det noget andet. Fra dette punkt vil vi g\u00e5 oppefra og ned, men begynde med at oprette alle elementerne i pipelinen og derefter selve pipelinen.<\/p>\n<p>S\u00e5, f\u00f8rst og fremmest\u2026<\/p>\n<h4>Opgaver Tasks<\/h4>\n<p>\nLad os oprette et par opgaver (tasks), som derefter vil hj\u00e6lpe med at implementere applikationen i vores pipeline. Den f\u00f8rste opgave \u2013 apply_manifests_task \u2013 er ansvarlig for anvendelsen af YAML for de Kubernetes-ressourcer (service, deployment og route), som findes i k8s-mappen i vores applikation. Den anden opgave \u2013 update_deployment_task \u2013 er ansvarlig for at opdatere det allerede implementerede billede til det, som vores pipeline skaber.<\/p>\n<p>Bare rolig, hvis det ikke er helt klart endnu. Faktisk er disse opgaver noget som v\u00e6rkt\u00f8jer, og vi vil se n\u00e6rmere p\u00e5 dem lidt senere. Men lad os f\u00f8rst oprette dem:<\/p>\n<pre><code class=\"plaintext\">$ oc create -f https:\/\/raw.githubusercontent.com\/nodeshift\/webapp-pipeline-tutorial\/master\/tasks\/update_deployment_task.yaml\n$ oc create -f https:\/\/raw.githubusercontent.com\/nodeshift\/webapp-pipeline-tutorial\/master\/tasks\/apply_manifests_task.yaml\n<\/code><\/pre>\n<p>\nDerefter vil vi ved hj\u00e6lp af tkn CLI kommandoen kontrollere, at opgaverne blev oprettet:<\/p>\n<pre><code class=\"plaintext\">$ tkn task ls\n\nNAVN                ALDER\napply-manifests     1 minut siden\nupdate-deployment   1 minut siden\n<\/code><\/pre>\n<p>\n<i>Bem\u00e6rk: dette er lokale opgaver i dit nuv\u00e6rende projekt.<\/i><\/p>\n<h4>Klyngeopgaver Cluster tasks<\/h4>\n<p>\nKlyngeopgaver er i bund og grund det samme som blot opgaver. Det vil sige, det er en genanvendelig samling af trin, der kombineres p\u00e5 forskellige m\u00e5der ved udf\u00f8relsen af en bestemt opgave. Forskellen er, at klyngeopgaven er tilg\u00e6ngelig overalt i klyngen. For at se listen over klyngeopgaver, der automatisk oprettes ved tilf\u00f8jelse af Pipeline Operator, vil vi igen bruge tkn CLI kommandoen:<\/p>\n<pre><code class=\"plaintext\">$ tkn clustertask ls\n\nNAVN                       ALDER\nbuildah                    1 dag siden\nbuildah-v0-10-0            1 dag siden\njib-maven                  1 dag siden\nkn                         1 dag siden\nmaven                      1 dag siden\nopenshift-client           1 dag siden\nopenshift-client-v0-10-0   1 dag siden\ns2i                        1 dag siden\ns2i-go                     1 dag siden\ns2i-go-v0-10-0             1 dag siden\ns2i-java-11                1 dag siden\ns2i-java-11-v0-10-0        1 dag siden\ns2i-java-8                 1 dag siden\ns2i-java-8-v0-10-0         1 dag siden\ns2i-nodejs                 1 dag siden\ns2i-nodejs-v0-10-0         1 dag siden\ns2i-perl                   1 dag siden\ns2i-perl-v0-10-0           1 dag siden\ns2i-php                    1 dag siden\ns2i-php-v0-10-0            1 dag siden\ns2i-python-3               1 dag siden\ns2i-python-3-v0-10-0       1 dag siden\ns2i-ruby                   1 dag siden\ns2i-ruby-v0-10-0           1 dag siden\ns2i-v0-10-0                1 dag siden\n<\/code><\/pre>\n<p>\nLad os nu oprette to klyngeopgaver. Den f\u00f8rste vil generere et S2I-billede og uploade det til den interne OpenShift-register; den anden vil bygge vores billede baseret p\u00e5 NGINX, ved at bruge det applikation, som vi allerede har samlet, som indhold.<\/p>\n<h4>Opretter og sender billede<\/h4>\n<p>\nN\u00e5r vi opretter den f\u00f8rste opgave, gentager vi det, vi allerede har gjort i den tidligere artikel om sammenkoblede builds. Vi minder om, at vi brugte S2I-imaget (ubi8-s2i-web-app) til at 'bygge' vores applikation, og resultatet var et image, der gemmes i den interne OpenShift-registre. Nu vil vi bruge dette S2I-image af webapplikationen til at oprette et DockerFile til vores applikation, og derefter anvende Buildah til at udf\u00f8re den faktiske bygning og sende det genererede image til den interne OpenShift-registre, da det netop er det, OpenShift g\u00f8r, n\u00e5r du implementerer dine applikationer ved hj\u00e6lp af NodeShift.<\/p>\n<p>Sp\u00f8rger du, hvor vi har f\u00e5et det hele fra? Fra <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openshift\/pipelines-catalog\/blob\/master\/s2i-nodejs\/s2i-nodejs-task.yaml\">\u043e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 official Node.js<\/a><\/noindex>, vi har blot kopieret det og tilpasset det til vores behov.<\/p>\n<p>S\u00e5, lad os nu oprette en klyngeopgave s2i-web-app:<\/p>\n<pre><code class=\"plaintext\">$ oc create -f https:\/\/raw.githubusercontent.com\/nodeshift\/webapp-pipeline-tutorial\/master\/clustertasks\/s2i-web-app-task.yaml\n<\/code><\/pre>\n<p>\nVi vil ikke gennemg\u00e5 dette i detaljer, men blot stoppe ved parameteren OUTPUT_DIR:<\/p>\n<pre><code class=\"plaintext\">params:\n      - name: OUTPUT_DIR\n        description: Placeringen af byggets output-mappe\n        default: build\n<\/code><\/pre>\n<p>\nSom standard er denne parameter lig med build, og det er her, React gemmer det samlede indhold. I andre rammer anvendes der andre stier, for eksempel i Ember er det dist. Outputtet fra vores f\u00f8rste klyngeopgave vil v\u00e6re et image, der indeholder den HTML, JavaScript og CSS, vi har samlet.<\/p>\n<h4>Vi bygger et image baseret p\u00e5 NGINX<\/h4>\n<p>\nN\u00e5r det g\u00e6lder vores anden klyngeopgave, skal den samle et image baseret p\u00e5 NGINX ved hj\u00e6lp af indholdet fra vores allerede samlede applikation. Grundl\u00e6ggende set er dette den del af det forrige afsnit, hvor vi betragtede sammenkoblede builds.<\/p>\n<p>Til dette form\u00e5l \u2013 pr\u00e6cis som f\u00f8r \u2013 opretter vi en klyngeopgave webapp-build-runtime:<\/p>\n<pre><code class=\"plaintext\">$ oc create -f https:\/\/raw.githubusercontent.com\/nodeshift\/webapp-pipeline-tutorial\/master\/clustertasks\/webapp-build-runtime-task.yaml\n<\/code><\/pre>\n<p>\nHvis vi ser koden for disse klyngeopgaver, kan vi se, at der ikke specificeres noget Git-repositorium, som vi arbejder med, eller navne p\u00e5 de images, vi skaber. Vi angiver kun, hvad vi sender til Git, eller et image, hvortil det endelige image skal exporteres. Det er derfor, disse klyngeopgaver kan genbruges, ogs\u00e5 n\u00e5r vi arbejder med andre applikationer.<\/p>\n<p>Og her g\u00e5r vi elegant videre til n\u00e6ste punkt\u2026<\/p>\n<h4>Ressourcer<\/h4>\n<p>\nS\u00e5, som vi lige har sagt, skal klyngeopgaver v\u00e6re s\u00e5 generelle som muligt, vi skal oprette ressourcer, der skal bruges til indgangen (Git-arkiv) og udgangen (de endelige billeder). Den f\u00f8rste ressource, vi har brug for, er Git, hvor vores ans\u00f8gning befinder sig, noget i stil med dette:<\/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>\nHer har PipelineResource typen git. N\u00f8glen url i sektionen params angiver det specifikke arkiv og s\u00e6tter master-grenen (dette er valgfrit, men vi skriver det for fuldst\u00e6ndighedens skyld).<\/p>\n<p>Nu skal vi oprette en ressource til billedet, hvor resultaterne af opgaven s2i-web-app skal gemmes, det g\u00f8res s\u00e5ledes:<\/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>\nHer har PipelineResource typen image, og v\u00e6rdien af parameteren url henviser til den interne OpenShift Image Registry, specifikt den, der findes i navnerummet webapp-pipeline. Glem ikke at \u00e6ndre denne parameter, hvis du bruger et andet navnerum.<\/p>\n<p>Og endelig, den sidste ressource, vi f\u00e5r brug for, vil ogs\u00e5 have typen image, og det vil v\u00e6re det endelige NGINX-billede, som derefter vil blive brugt ved implementeringen:<\/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>\nOg bem\u00e6rk igen, at denne ressource gemmer billedet i den interne OpenShift registry i navnerummet webapp-pipeline.<\/p>\n<p>For at oprette alle disse ressourcer p\u00e5 \u00e9n gang, bruger vi kommandoen create:<\/p>\n<pre><code class=\"plaintext\">$ oc create -f https:\/\/raw.githubusercontent.com\/nodeshift\/webapp-pipeline-tutorial\/master\/resources\/resource.yaml\n<\/code><\/pre>\n<p>\nFor at bekr\u00e6fte, at ressourcerne er oprettet, kan du g\u00f8re det s\u00e5dan:<\/p>\n<pre><code class=\"plaintext\">$ tkn resource ls\n<\/code><\/pre>\n<p><\/p>\n<h4>Pipeline-k\u00e6den<\/h4>\n<p>\nNu hvor vi har alle de n\u00f8dvendige komponenter, samler vi dem i en pipeline ved at k\u00f8re f\u00f8lgende kommando:<\/p>\n<pre><code class=\"plaintext\">$ oc create -f https:\/\/raw.githubusercontent.com\/nodeshift\/webapp-pipeline-tutorial\/master\/pipelines\/build-and-deploy-react.yaml\n<\/code><\/pre>\n<p>\nMen f\u00f8r vi k\u00f8rer denne kommando, lad os gennemg\u00e5 disse komponenter. Den f\u00f8rste er navnet:<\/p>\n<pre><code class=\"plaintext\">apiVersion: tekton.dev\/v1alpha1\nkind: Pipeline\nmetadata:\n  name: build-and-deploy-react\n<\/code><\/pre>\n<p>\nDerefter ser vi i sektionen spec angivelsen af de ressourcer, vi tidligere har oprettet:<\/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>\nDerefter opretter vi de opgaver, som vores pipeline skal udf\u00f8re. F\u00f8rst skal den udf\u00f8re den opgave, vi allerede har oprettet, s2i-web-app:<\/p>\n<pre><code class=\"plaintext\">tasks:\n    - name: build-web-application\n      taskRef:\n        name: s2i-web-app\n        kind: ClusterTask\n<\/code><\/pre>\n<p>\nDenne opgave tager indgangs (git-ressource) og udgangs (ressource built-web-application-image) parametre. Vi sender ogs\u00e5 et specielt parameter til den, s\u00e5 den ikke validerer TLS, da vi bruger selvsignerede certifikater:<\/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: &quot;false&quot;\n<\/code><\/pre>\n<p>\nDen n\u00e6ste opgave er n\u00e6sten den samme, men her kaldes allerede den klyngopgave, vi har oprettet, webapp-build-runtime:<\/p>\n<pre><code class=\"plaintext\">navn: build-runtime-image\n    taskRef:\n      navn: webapp-build-runtime\n      type: ClusterTask\n<\/code><\/pre>\n<p>\nSom med den forrige opgave, sender vi ressourcen, men nu er det built-web-application-image (udgangen fra vores forrige opgave). Og som udgang angiver vi igen billedet. Da denne opgave skal udf\u00f8res efter den forrige, tilf\u00f8jer vi feltet runAfter:<\/p>\n<pre><code class=\"plaintext\">resources:\n        inputs:\n          - name: image\n            resource: built-web-application-image\n        outputs:\n          - name: image\n            resource: runtime-web-application-image\n        params:\n        - name: TLSVERIFY\n          value: &quot;false&quot;\n      runAfter:\n        - build-web-application\n<\/code><\/pre>\n<p>\nDe n\u00e6ste to opgaver er ansvarlige for anvendelse af YAML-filerne til tjenesten, ruten og udrulningen, som findes i mappen k8s i vores webapplikation, samt for at opdatere denne udrulning, n\u00e5r der oprettes nye billeder. Disse to klyngopgaver blev vi enige om i starten af artiklen.<\/p>\n<h4>K\u00f8r pipeline<\/h4>\n<p>\nS\u00e5 alle dele af vores pipeline er skabt, og vi vil starte den med f\u00f8lgende kommando:<\/p>\n<pre><code class=\"plaintext\">$ tkn pipeline start build-and-deploy-react\n<\/code><\/pre>\n<p>\nP\u00e5 dette tidspunkt bruges kommandoprompten i interaktiv tilstand, og man skal v\u00e6lge de relevante ressourcer som svar p\u00e5 hver anmodning: for git-resourcen v\u00e6lger vi web-application-repo, derefter for den f\u00f8rste billedressource \u2013 built-web-application-image, og til sidst for den anden billedressource \u2013 runtime-web-application-image:<\/p>\n<pre><code class=\"plaintext\">? Choose the git resource to use for web-application-repo: web-application-repo (https:\/\/github.com\/nodeshift-starters\/react-pipeline-example)\n? Choose the image resource to use for built-web-application-image: built-web-application-image (image-registry.openshift-image-registry.svc:5000\/webapp-pipeline\/built-web-\napplication:latest)\n? Choose the image resource to use for runtime-web-application-image: runtime-web-application-image (image-registry.openshift-image-registry.svc:5000\/webapp-pipeline\/runtim\ne-web-application:latest)\nPipelinerun started: build-and-deploy-react-run-4xwsr\n<\/code><\/pre>\n<p>\nNu vil vi kontrollere status for pipeline med f\u00f8lgende kommando:<\/p>\n<pre><code class=\"plaintext\">$ tkn pipeline logs -f\n<\/code><\/pre>\n<p>\nN\u00e5r pipeline er startet, og applikationen er blevet udrullet, kan vi anmode om den offentliggjorte rute med f\u00f8lgende kommando:<\/p>\n<pre><code class=\"plaintext\">$ oc get route react-pipeline-example --template='http:\/\/{{.spec.host}}'\n<\/code><\/pre>\n<p>\nFor bedre visualisering kan vi se vores pipeline i udvikler-tilstand i webkonsollen i sektionen <b>Pipelines<\/b>, som vist p\u00e5 Figur 1.<\/p>\n<p><img decoding=\"async\" alt=\"Moderne applikationer p\u00e5 OpenShift, del 3: OpenShift som udviklingsmilj\u00f8 og OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/ede9b076414e389c2cd212adeda08956.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Figur 1. Oversigt over k\u00f8rende pipelines.<\/i><\/p>\n<p>Et klik p\u00e5 den k\u00f8rende pipeline viser yderligere oplysninger, som vist p\u00e5 Figur 2.<\/p>\n<p><img decoding=\"async\" alt=\"Moderne applikationer p\u00e5 OpenShift, del 3: OpenShift som udviklingsmilj\u00f8 og OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/64581b1f6d8ff91aedd963019ef29be5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Figur 2. Yderligere oplysninger om pipeline.<\/i><\/p>\n<p>Efter de yderligere oplysninger kan man se k\u00f8rende applikationer i visningen <b>Topologi<\/b>, som vist p\u00e5 Figur 3.<\/p>\n<p><img decoding=\"async\" alt=\"Moderne applikationer p\u00e5 OpenShift, del 3: OpenShift som udviklingsmilj\u00f8 og OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/d23f723e14514ff60ecfddd8eb9bf752.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Figur 3. K\u00f8rende pod.<\/i><\/p>\n<p>Et klik p\u00e5 cirklen i \u00f8verste h\u00f8jre hj\u00f8rne af ikonet \u00e5bner vores applikation, som vist p\u00e5 Figur 4.<\/p>\n<p><img decoding=\"async\" alt=\"Moderne applikationer p\u00e5 OpenShift, del 3: OpenShift som udviklingsmilj\u00f8 og OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/aa8e09d9fd9f33d5faffc7f661d84ca4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Figur 4. K\u00f8rende React-applikation.<\/i><\/p>\n<h3>Konklusion<\/h3>\n<p>\nS\u00e5dan k\u00f8rer du en udviklingsserver for din applikation p\u00e5 OpenShift og synkroniserer den med dit lokale filsystem. Vi har ogs\u00e5 set p\u00e5, hvordan man simulerer en chained-build skabelon ved hj\u00e6lp af OpenShift Pipelines. Alle koderne fra denne artikel kan findes <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/webapp-pipeline-tutorial\">her<\/a><\/noindex>.<\/p>\n<h3>Yderligere ressourcer (EN)<\/h3>\n<p><\/p>\n<ul>\n<li>Gratis e-bog <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/books\/deploying-openshift\/\">\u201eUdvikling p\u00e5 OpenShift: En guide til ut\u00e5lmodige\u201c<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/06\/11\/container-native-nodejs-istio-rhoar\/\">Bygning af containerorienterede Node.js-applikationer med Red Hat OpenShift Application Runtimes og 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\/\">Fejlfinding af Node.js-applikationer p\u00e5 OpenShift ved hj\u00e6lp af Chrome DevTools<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/04\/16\/zero-express-openshift-3-commands\/\">Tre kommandoer til at mestre Express p\u00e5 OpenShift fra bunden<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/03\/12\/rhoar-nodejs-annoucement\/\">Annoncering af den offentlige version af Node.js som en del af 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\/\">Overv\u00e5gning af Node.js-applikationer p\u00e5 OpenShift ved hj\u00e6lp af Prometheus<\/a><\/noindex><\/li>\n<li>Andre artikler om <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/kubernetes\/\">OpenShift og Kubernetes<\/a><\/noindex> p\u00e5 Red Hat-sitet<\/li>\n<\/ul>\n<h3>Annonceringer af kommende webinars<\/h3>\n<p>\nVi starter en serie af fredagswebinars om den native oplevelse af at bruge Red Hat OpenShift Container Platform og 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. august, webinar om 'Operator': Operat\u00f8rer i OpenShift og 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-specifikke magiske ting til opbygning og implementering af applikationer<\/b><\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/events.redhat.com\/profile\/form\/index.cfm?PKformID=0x232789abcd&amp;sc_cid=7013a000002gws7AAA\"><b>25. september, Red Hat OpenShift og 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, Hvordan man h\u00e5ndterer en pludselig stigning i belastningen<\/b><\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/events.redhat.com\/profile\/form\/index.cfm?PKformID=0x232979abcd&amp;sc_cid=7013a000002gwumAAA\"><b>23. oktober, Indbygget Jenkins, pipeline-builds, Tekton i Red Hat OpenShift Container Platform<\/b><\/a><\/noindex><\/li>\n<\/ul>\n<p>Kilde: <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\/da\/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=\"da_DK\" \/>\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\/da\/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\udd47Moderne applikationer p\u00e5 OpenShift, del 3: OpenShift som udviklingsmilj\u00f8 og OpenShift Pipelines | ProHoster","description":"Hej alle i denne blog!","canonical_url":"https:\/\/prohoster.info\/da\/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":"da_DK","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\/da\/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\/da\/wp-json\/wp\/v2\/posts\/92048","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/comments?post=92048"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/posts\/92048\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media\/92049"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/media?parent=92048"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/categories?post=92048"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/da\/wp-json\/wp\/v2\/tags?post=92048"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}