{"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\/fr\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines","title":{"rendered":"Applications modernes sur OpenShift, partie 3 : OpenShift en tant qu'environnement de d\u00e9veloppement et pipelines OpenShift Pipelines","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Bonjour \u00e0 tous sur ce blog ! Voici la troisi\u00e8me publication d'une s\u00e9rie o\u00f9 nous montrons comment d\u00e9ployer des applications web modernes sur Red Hat OpenShift.<\/p>\n<p><img decoding=\"async\" alt=\"Applications modernes sur OpenShift, partie 3 : OpenShift en tant qu&#039;environnement de d\u00e9veloppement et pipelines OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/9c3337b13a3f045d36343308ce6154cc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDans les deux pr\u00e9c\u00e9dentes publications, nous avons expliqu\u00e9 comment d\u00e9ployer des applications web modernes en quelques \u00e9tapes et comment utiliser une nouvelle image S2I accompagn\u00e9e d'une image de serveur HTTP pr\u00eate \u00e0 l'emploi, comme NGINX, gr\u00e2ce aux builds li\u00e9s pour organiser un d\u00e9ploiement en production.<\/p>\n<p>Aujourd'hui, nous allons vous montrer comment lancer un serveur de d\u00e9veloppement pour votre application sur la plateforme OpenShift et le synchroniser avec le syst\u00e8me de fichiers local, ainsi que discuter de ce que sont les OpenShift Pipelines et comment les utiliser comme alternative aux builds li\u00e9s.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>OpenShift en tant qu'environnement de d\u00e9veloppement<\/h3>\n<p><\/p>\n<h4>Flux de travail de d\u00e9veloppement<\/h4>\n<p>\nComme d\u00e9j\u00e0 mentionn\u00e9 dans <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/511954\/\">la premi\u00e8re publication<\/a><\/noindex>, un processus de d\u00e9veloppement typique pour les applications web modernes consiste simplement en un \u00ab serveur de d\u00e9veloppement \u00bb qui surveille les modifications des fichiers locaux. Lorsqu'une modification est d\u00e9tect\u00e9e, une compilation de l'application est lanc\u00e9e, puis celle-ci est mise \u00e0 jour dans le navigateur.<\/p>\n<p>Dans la plupart des frameworks modernes, un tel \u00ab serveur de d\u00e9veloppement \u00bb est int\u00e9gr\u00e9 dans les outils de ligne de commande appropri\u00e9s.<\/p>\n<h4>Exemple local<\/h4>\n<p>\nPour commencer, voyons comment cela fonctionne dans le cas d'un lancement local d'applications. Prenons par exemple l'application <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lholmquist\/react-web-app\">React<\/a><\/noindex> des articles pr\u00e9c\u00e9dents, bien que les m\u00eames concepts de flux de travail s'appliquent \u00e9galement \u00e0 tous les autres frameworks modernes.<br \/>\nDonc, pour lancer un \u00ab serveur de d\u00e9veloppement \u00bb dans notre exemple avec React, nous allons entrer la commande suivante :<\/p>\n<pre><code class=\"plaintext\">$ npm run start\n<\/code><\/pre>\n<p>\nDans la fen\u00eatre du terminal, nous devrions voir quelque chose comme ceci :<\/p>\n<p><img decoding=\"async\" alt=\"Applications modernes sur OpenShift, partie 3 : OpenShift en tant qu&#039;environnement de d\u00e9veloppement et pipelines OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/06f84ffb4c9a6a5868b8b47b8ad1d9ec.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Et notre application s'ouvrira dans le navigateur par d\u00e9faut :<\/p>\n<p><img decoding=\"async\" alt=\"Applications modernes sur OpenShift, partie 3 : OpenShift en tant qu&#039;environnement de d\u00e9veloppement et pipelines OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/72341bb0796352e7343bf31ceb8233cd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Maintenant, si nous apportons des modifications au fichier, l'application devrait se mettre \u00e0 jour dans le navigateur.<\/p>\n<p>D'accord, le d\u00e9veloppement en mode local est clair, mais comment obtenir la m\u00eame chose sur OpenShift ?<\/p>\n<h4>Serveur de d\u00e9veloppement sur OpenShift<\/h4>\n<p>\nSi vous vous souvenez, dans <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/513948\/\">dans le pr\u00e9c\u00e9dent article<\/a><\/noindex>, nous avons examin\u00e9 ce qu'on appelle la phase de lancement (run phase) de l'image S2I et avons vu que par d\u00e9faut, le module serve se charge de notre application web.<\/p>\n<p>Cependant, si vous regardez de plus pr\u00e8s <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/ubi8-s2i-web-app\/blob\/master\/s2i\/run#L10\">script d'ex\u00e9cution<\/a><\/noindex> de cet exemple, il y a une variable d'environnement $NPM_RUN, qui permet d'ex\u00e9cuter votre propre commande.<\/p>\n<p>Par exemple, vous pouvez utiliser le module nodeshift pour d\u00e9ployer notre 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>Remarque : l'exemple ci-dessus est pr\u00e9sent\u00e9 sous forme abr\u00e9g\u00e9e pour illustrer l'id\u00e9e g\u00e9n\u00e9rale.<\/i><\/p>\n<p>Ici, nous avons ajout\u00e9 \u00e0 notre d\u00e9ploiement la variable d'environnement NPM_RUN, qui indique \u00e0 l'\u00e9tape d'ex\u00e9cution qu'elle doit lancer la commande yarn start, d\u00e9marrant ainsi le serveur de d\u00e9veloppement React \u00e0 l'int\u00e9rieur de notre pod OpenShift.<\/p>\n<p>Si l'on consulte les journaux du pod en cours d'ex\u00e9cution, on obtiendra quelque chose de similaire :<\/p>\n<p><img decoding=\"async\" alt=\"Applications modernes sur OpenShift, partie 3 : OpenShift en tant qu&#039;environnement de d\u00e9veloppement et pipelines OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/5b090223e08e32a3356608881068ce1a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Bien s\u00fbr, tout cela n'aura pas d'importance tant que nous ne pourrons pas synchroniser le code local avec le code qui est \u00e9galement contr\u00f4l\u00e9 pour des changements, mais qui vit sur un serveur distant.<\/p>\n<h4>Synchronisation du code distant et local<\/h4>\n<p>\nHeureusement, la synchronisation est facilement facilit\u00e9e par nodeshift, et pour suivre les changements, on peut utiliser la commande watch.<\/p>\n<p>Ainsi, apr\u00e8s avoir ex\u00e9cut\u00e9 la commande pour d\u00e9ployer le serveur de d\u00e9veloppement de notre application, nous pouvons utiliser la commande suivante :<\/p>\n<pre><code class=\"plaintext\">$ npx nodeshift watch\n<\/code><\/pre>\n<p>\nCela \u00e9tablira une connexion avec le pod en cours d'ex\u00e9cution que nous avons cr\u00e9\u00e9 un peu plus t\u00f4t, activera la synchronisation de nos fichiers locaux avec le cluster distant, et les fichiers de notre syst\u00e8me local commenceront \u00e0 \u00eatre surveill\u00e9s pour des changements.<\/p>\n<p>Par cons\u00e9quent, si nous mettons \u00e0 jour le fichier src\/App.js, le syst\u00e8me r\u00e9agira \u00e0 ces changements, les copiera sur le cluster distant et lancera le serveur de d\u00e9veloppement, qui mettra ensuite \u00e0 jour notre application dans le navigateur.<\/p>\n<p>Pour compl\u00e9ter le tableau, montrons comment ces commandes se pr\u00e9sentent dans leur int\u00e9gralit\u00e9 :<\/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>\nLa commande watch est une abstraction au-dessus de la commande oc rsync, vous pouvez en apprendre davantage sur son fonctionnement. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.okd.io\/latest\/dev_guide\/copy_files_to_container.html\">ici<\/a><\/noindex>.<\/p>\n<p>C'\u00e9tait un exemple pour React, mais la m\u00eame m\u00e9thode peut \u00eatre utilis\u00e9e avec d'autres frameworks, il suffit d'\u00e9crire la variable d'environnement NPM_RUN de la mani\u00e8re appropri\u00e9e.<br \/>\n\u2003<\/p>\n<h3>Pipelines OpenShift<\/h3>\n<p><img decoding=\"async\" alt=\"Applications modernes sur OpenShift, partie 3 : OpenShift en tant qu&#039;environnement de d\u00e9veloppement et pipelines OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/33b932d3591b22dd00d82509b352d489.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ensuite, nous parlerons d'un outil appel\u00e9 OpenShift Pipelines et de la fa\u00e7on dont il peut \u00eatre utilis\u00e9 comme alternative aux builds li\u00e9s (chained builds).<\/p>\n<h4>Qu'est-ce qu'OpenShift Pipelines ?<\/h4>\n<p>\nOpenShift Pipelines est un syst\u00e8me CI\/CD bas\u00e9 sur le cloud, con\u00e7u pour organiser des pipelines en utilisant Tekton. Tekton est un framework CI\/CD natif Kubernetes flexible et open source, permettant d'automatiser le d\u00e9ploiement sur diverses plateformes (Kubernetes, sans serveur, machines virtuelles, etc.) en abstrahant le niveau sous-jacent.<\/p>\n<p>Pour comprendre cet article, certaines connaissances sur les Pipelines sont n\u00e9cessaires, nous vous conseillons donc de consulter d'abord le <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openshift\/pipelines-tutorial\">manuel officiel<\/a><\/noindex>.<\/p>\n<h4>Configuration de l'environnement de travail<\/h4>\n<p>\nPour exp\u00e9rimenter avec les exemples de cet article, vous devez d'abord pr\u00e9parer l'environnement de travail :<\/p>\n<ol>\n<li>Installer et configurer un cluster OpenShift 4. Dans nos exemples, nous utilisons CodeReady Containers (CRD), les instructions d'installation peuvent \u00eatre trouv\u00e9es <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.redhat.com\/openshift\/install\/crc\/installer-provisioned\">ici<\/a><\/noindex>.<\/li>\n<li>Apr\u00e8s que le cluster soit pr\u00eat, vous devez installer le Pipeline Operator. Ne vous inqui\u00e9tez pas, c'est facile, les instructions d'installation <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openshift\/pipelines-tutorial\/blob\/master\/install-operator.md\">ici<\/a><\/noindex>.<\/li>\n<li>T\u00e9l\u00e9charger <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\">ici<\/a><\/noindex>.<\/li>\n<li>Lancer l'outil en ligne de commande create-react-app pour cr\u00e9er une application qui sera ensuite d\u00e9ploy\u00e9e (c'est une application simple <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift-starters\/react-pipeline-example\">React<\/a><\/noindex>).<\/li>\n<li>(Optionnel) Cloner le d\u00e9p\u00f4t pour ex\u00e9cuter localement l'exemple d'application avec la commande npm install puis npm start.<\/li>\n<\/ol>\n<p>\nDans le d\u00e9p\u00f4t de l'application, il y aura \u00e9galement un dossier k8s, o\u00f9 se trouveront les YAML de Kubernetes\/OpenShift utilis\u00e9s pour le d\u00e9ploiement de l'application. Il y aura des Tasks, ClusterTasks, Resources et Pipelines que nous cr\u00e9erons dans ce <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/webapp-pipeline-tutorial\">d\u00e9p\u00f4ts<\/a><\/noindex>.<\/p>\n<h4>Nous nous y mettons<\/h4>\n<p>\nTout d'abord, pour notre exemple, nous devons cr\u00e9er un nouveau projet dans le cluster OpenShift. Nommez ce projet webapp-pipeline et cr\u00e9ez-le avec la commande suivante :<\/p>\n<pre><code class=\"plaintext\">$ oc new-project webapp-pipeline\n<\/code><\/pre>\n<p>\nPar la suite, ce nom de projet appara\u00eetra dans le code, donc si vous d\u00e9cidez de l'appeler diff\u00e9remment, n'oubliez pas d'ajuster le code des exemples en cons\u00e9quence. \u00c0 partir de ce point, nous allons proc\u00e9der de bas en haut : c'est-\u00e0-dire, d'abord cr\u00e9er tous les composants du pipeline, puis le pipeline lui-m\u00eame.<\/p>\n<p>Donc, tout d'abord\u2026<\/p>\n<h4>T\u00e2ches Tasks<\/h4>\n<p>\nCr\u00e9ons deux t\u00e2ches (tasks) qui aideront ensuite \u00e0 d\u00e9ployer l'application dans notre pipeline. La premi\u00e8re t\u00e2che \u2013 apply_manifests_task \u2013 est responsable de l'application des ressources Kubernetes YAML (service, deployment et route) qui se trouvent dans le dossier k8s de notre application. La deuxi\u00e8me t\u00e2che \u2013 update_deployment_task \u2013 est responsable de la mise \u00e0 jour de l'image d\u00e9j\u00e0 d\u00e9ploy\u00e9e vers celle qui est cr\u00e9\u00e9e par notre pipeline.<\/p>\n<p>Ne vous inqui\u00e9tez pas si ce n'est pas tr\u00e8s clair pour l'instant. En fait, ces t\u00e2ches sont quelque chose comme des utilitaires, et nous les examinerons plus en d\u00e9tail un peu plus tard. Pour l\u2019instant, cr\u00e9ons-les simplement :<\/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>\nEnsuite, v\u00e9rifions que les t\u00e2ches ont \u00e9t\u00e9 cr\u00e9\u00e9es avec la commande tkn CLI :<\/p>\n<pre><code class=\"plaintext\">$ tkn task ls\n\nNOM                     \u00c2GE\napply-manifests        il y a 1 minute\nupdate-deployment      il y a 1 minute\n<\/code><\/pre>\n<p>\n<i>Remarque : ce sont des t\u00e2ches locales pour votre projet actuel.<\/i><\/p>\n<h4>T\u00e2ches de cluster (Cluster tasks)<\/h4>\n<p>\nLes t\u00e2ches de cluster sont en fait les m\u00eames que les simples t\u00e2ches. C'est-\u00e0-dire, une collection r\u00e9utilisable d'\u00e9tapes qui sont combin\u00e9es d'une mani\u00e8re ou d'une autre lors de l'ex\u00e9cution d'une t\u00e2che sp\u00e9cifique. La diff\u00e9rence est qu'une t\u00e2che de cluster est accessible partout dans le cluster. Pour voir la liste des t\u00e2ches de cluster qui sont automatiquement cr\u00e9\u00e9es lorsque l'on ajoute le Pipeline Operator, utilisons \u00e0 nouveau la commande tkn CLI :<\/p>\n<pre><code class=\"plaintext\">$ tkn clustertask ls\n\nNOM                           \u00c2GE\nbuildah                        il y a 1 jour\nbuildah-v0-10-0               il y a 1 jour\njib-maven                      il y a 1 jour\nkn                             il y a 1 jour\nmaven                          il y a 1 jour\nopenshift-client               il y a 1 jour\nopenshift-client-v0-10-0      il y a 1 jour\ns2i                            il y a 1 jour\ns2i-go                         il y a 1 jour\ns2i-go-v0-10-0                 il y a 1 jour\ns2i-java-11                    il y a 1 jour\ns2i-java-11-v0-10-0            il y a 1 jour\ns2i-java-8                     il y a 1 jour\ns2i-java-8-v0-10-0             il y a 1 jour\ns2i-nodejs                     il y a 1 jour\ns2i-nodejs-v0-10-0             il y a 1 jour\ns2i-perl                       il y a 1 jour\ns2i-perl-v0-10-0               il y a 1 jour\ns2i-php                        il y a 1 jour\ns2i-php-v0-10-0                il y a 1 jour\ns2i-python-3                   il y a 1 jour\ns2i-python-3-v0-10-0           il y a 1 jour\ns2i-ruby                       il y a 1 jour\ns2i-ruby-v0-10-0               il y a 1 jour\ns2i-v0-10-0                    il y a 1 jour\n<\/code><\/pre>\n<p>\nEt maintenant, cr\u00e9ons deux t\u00e2ches de cluster. La premi\u00e8re g\u00e9n\u00e9rera une image S2I et l'enverra dans le registre interne d'OpenShift ; la deuxi\u00e8me ex\u00e9cutera la construction de notre image bas\u00e9e sur NGINX, en utilisant comme contenu l'application que nous avons d\u00e9j\u00e0 construite.<\/p>\n<h4>Cr\u00e9ons et envoyons l'image<\/h4>\n<p>\nLors de la cr\u00e9ation de la premi\u00e8re t\u00e2che, nous allons r\u00e9p\u00e9ter ce que nous avons d\u00e9j\u00e0 fait dans l'article pr\u00e9c\u00e9dent sur les builds li\u00e9s. Rappelons que nous avons utilis\u00e9 une image S2I (ubi8-s2i-web-app) pour \u00ab construire \u00bb notre application, et au final, nous obtenions une image stock\u00e9e dans le registre interne d'OpenShift. Maintenant, nous allons utiliser cette image S2I de l'application web pour cr\u00e9er un DockerFile pour notre application, puis nous allons utiliser Buildah pour effectuer la v\u00e9ritable construction et envoyer l'image obtenue dans le registre interne d'OpenShift, car c'est exactement ce qu'OpenShift fait lorsque vous d\u00e9ployez vos applications avec NodeShift.<\/p>\n<p>Vous vous demandez d'o\u00f9 nous avons tir\u00e9 tout cela ? De <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>, nous avons simplement copi\u00e9 cela et l'avons adapt\u00e9 pour nous.<\/p>\n<p>Donc, maintenant, cr\u00e9ons la t\u00e2che de cluster 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>\nNous ne d\u00e9taillerons pas cela, mais nous nous attarderons sur le param\u00e8tre OUTPUT_DIR :<\/p>\n<pre><code class=\"plaintext\">params:\n      - name: OUTPUT_DIR\n        description: L'emplacement du r\u00e9pertoire de sortie de la construction\n        default: build\n<\/code><\/pre>\n<p>\nPar d\u00e9faut, ce param\u00e8tre est \u00e9gal \u00e0 build, c'est l\u00e0 que React stocke le contenu construit. D'autres frameworks utilisent d'autres chemins, par exemple, dans Ember, c'est dist. La sortie de notre premi\u00e8re t\u00e2che de cluster sera une image contenant le HTML, JavaScript et CSS que nous avons construits.<\/p>\n<h4>Construire une image bas\u00e9e sur NGINX<\/h4>\n<p>\nEn ce qui concerne notre deuxi\u00e8me t\u00e2che de cluster, elle doit nous construire une image bas\u00e9e sur NGINX, en utilisant le contenu de notre application d\u00e9j\u00e0 construite. En essence, c'est la partie de la section pr\u00e9c\u00e9dente o\u00f9 nous avons examin\u00e9 les builds li\u00e9s.<\/p>\n<p>Pour cela, nous allons \u2013 tout comme ci-dessus \u2013 cr\u00e9er la t\u00e2che de cluster 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>\nSi nous regardons le code de ces t\u00e2ches de cluster, nous voyons qu'il n'y a pas de sp\u00e9cification du d\u00e9p\u00f4t Git avec lequel nous travaillons, ni des noms des images que nous cr\u00e9ons. Nous ne faisons qu'indiquer ce que nous transmettons \u00e0 Git, ou bien une image dans laquelle il faut exporter l'image finale. C'est pourquoi ces t\u00e2ches de cluster peuvent \u00eatre r\u00e9utilis\u00e9es lorsque nous travaillons avec d'autres applications.<\/p>\n<p>Et ici, nous passons \u00e9l\u00e9gamment au point suivant\u2026<\/p>\n<h4>Ressources<\/h4>\n<p>\nAinsi, comme nous venons de le dire, les t\u00e2ches de cluster doivent \u00eatre aussi g\u00e9n\u00e9ralis\u00e9es que possible, nous devons cr\u00e9er des ressources qui seront utilis\u00e9es en entr\u00e9e (d\u00e9p\u00f4t Git) et en sortie (images finales). La premi\u00e8re ressource dont nous avons besoin est Git, o\u00f9 se trouve notre application, quelque chose comme cela :<\/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>\nIci, PipelineResource est de type git. La cl\u00e9 url dans la section params indique le d\u00e9p\u00f4t sp\u00e9cifique et d\u00e9finit la branche master (c'est optionnel, mais nous l'\u00e9crivons pour la compl\u00e9tude).<\/p>\n<p>Maintenant, nous devons cr\u00e9er une ressource pour l'image, o\u00f9 seront enregistr\u00e9s les r\u00e9sultats de l'ex\u00e9cution de la t\u00e2che s2i-web-app, cela se fait comme suit :<\/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>\nIci, PipelineResource est de type image, et la valeur du param\u00e8tre url pointe vers le registre d'images OpenShift interne, plus pr\u00e9cis\u00e9ment celui qui se trouve dans l'espace de noms webapp-pipeline. N'oubliez pas de changer ce param\u00e8tre si vous utilisez un autre espace de noms.<\/p>\n<p>Et enfin, la derni\u00e8re ressource dont nous aurons besoin aura \u00e9galement le type image et ce sera l'image finale NGINX, qui sera ensuite utilis\u00e9e lors du d\u00e9ploiement :<\/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>\nEt encore une fois, notez que cette ressource enregistre l'image dans le registre interne d'OpenShift dans l'espace de noms webapp-pipeline.<\/p>\n<p>Pour cr\u00e9er toutes ces ressources en une seule fois, utilisons la commande 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>\nVous pouvez v\u00e9rifier que les ressources ont \u00e9t\u00e9 cr\u00e9\u00e9es comme cela :<\/p>\n<pre><code class=\"plaintext\">$ tkn resource ls\n<\/code><\/pre>\n<p><\/p>\n<h4>Pipeline<\/h4>\n<p>\nMaintenant que nous avons tous les \u00e9l\u00e9ments n\u00e9cessaires, construisons le pipeline \u00e0 partir de ceux-ci en ex\u00e9cutant la commande suivante :<\/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>\nMais avant d'ex\u00e9cuter cette commande, examinons ces \u00e9l\u00e9ments. Le premier est le nom :<\/p>\n<pre><code class=\"plaintext\">apiVersion: tekton.dev\/v1alpha1\nkind: Pipeline\nmetadata:\n  name: build-and-deploy-react\n<\/code><\/pre>\n<p>\nEnsuite, dans la section spec, nous voyons la r\u00e9f\u00e9rence aux ressources que nous avons cr\u00e9\u00e9es pr\u00e9c\u00e9demment :<\/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>\nEnsuite, nous cr\u00e9ons les t\u00e2ches que notre pipeline doit ex\u00e9cuter. Premi\u00e8rement, il doit ex\u00e9cuter la t\u00e2che s2i-web-app que nous avons d\u00e9j\u00e0 cr\u00e9\u00e9e :<\/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>\nCette t\u00e2che prend les param\u00e8tres d'entr\u00e9e (ressource gir) et de sortie (ressource built-web-application-image). Nous lui passons \u00e9galement un param\u00e8tre sp\u00e9cial pour qu'elle ne v\u00e9rifie pas le TLS, car nous utilisons des certificats auto-sign\u00e9s :<\/p>\n<pre><code class=\"plaintext\">ressources:\n        entr\u00e9es:\n          - nom: source\n            ressource: web-application-repo\n        sorties:\n          - nom: image\n            ressource: built-web-application-image\n      params:\n        - nom: TLSVERIFY\n          valeur: &quot;false&quot;\n<\/code><\/pre>\n<p>\nLa t\u00e2che suivante est presque identique, seulement ici nous appelons d\u00e9j\u00e0 la t\u00e2che de cluster que nous avons cr\u00e9\u00e9e, webapp-build-runtime :<\/p>\n<pre><code class=\"plaintext\">nom: build-runtime-image\n    taskRef:\n      nom: webapp-build-runtime\n      type: ClusterTask\n<\/code><\/pre>\n<p>\nComme pour la t\u00e2che pr\u00e9c\u00e9dente, nous transf\u00e9rons la ressource, mais maintenant il s'agit de built-web-application-image (la sortie de notre t\u00e2che pr\u00e9c\u00e9dente). Et en tant que sortie, nous demandons \u00e0 nouveau l'image. Comme cette t\u00e2che doit \u00eatre ex\u00e9cut\u00e9e apr\u00e8s la pr\u00e9c\u00e9dente, nous ajoutons le champ runAfter :<\/p>\n<pre><code class=\"plaintext\">ressources:\n        entr\u00e9es:\n          - nom: image\n            ressource: built-web-application-image\n        sorties:\n          - nom: image\n            ressource: runtime-web-application-image\n        params:\n        - nom: TLSVERIFY\n          valeur: &quot;false&quot;\n      runAfter:\n        - build-web-application\n<\/code><\/pre>\n<p>\nLes deux t\u00e2ches suivantes sont responsables de l'application des fichiers YAML du service, du routage et du d\u00e9ploiement, qui se trouvent dans le r\u00e9pertoire k8s de notre application Web, ainsi que de la mise \u00e0 jour de ce d\u00e9ploiement lors de la cr\u00e9ation de nouvelles images. Ces deux t\u00e2ches de cluster ont \u00e9t\u00e9 d\u00e9finies au d\u00e9but de l'article.<\/p>\n<h4>D\u00e9marrer le pipeline<\/h4>\n<p>\nAinsi, toutes les parties de notre pipeline sont cr\u00e9\u00e9es, et nous allons le lancer avec la commande suivante :<\/p>\n<pre><code class=\"plaintext\">$ tkn pipeline start build-and-deploy-react\n<\/code><\/pre>\n<p>\n\u00c0 ce stade, la ligne de commande est utilis\u00e9e en mode interactif et il faut s\u00e9lectionner les ressources appropri\u00e9es en r\u00e9ponse \u00e0 chacune de ses demandes : pour la ressource git, nous choisissons web-application-repo, ensuite pour la premi\u00e8re image \u2013 built-web-application-image, et enfin pour la deuxi\u00e8me image \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>\nMaintenant, v\u00e9rifions l'\u00e9tat du pipeline avec la commande suivante :<\/p>\n<pre><code class=\"plaintext\">$ tkn pipeline logs -f\n<\/code><\/pre>\n<p>\nApr\u00e8s que le pipeline a d\u00e9marr\u00e9 et que l'application est d\u00e9ploy\u00e9e, interrogeons le route publi\u00e9 avec la commande suivante :<\/p>\n<pre><code class=\"plaintext\">$ oc get route react-pipeline-example --template='http:\/\/{{.spec.host}}'\n<\/code><\/pre>\n<p>\nPour plus de visibilit\u00e9, nous pouvons voir notre pipeline en mode Developer dans la console Web dans la section <b>Pipelines<\/b>, comme indiqu\u00e9 \u00e0 la Fig. 1.<\/p>\n<p><img decoding=\"async\" alt=\"Applications modernes sur OpenShift, partie 3 : OpenShift en tant qu&#039;environnement de d\u00e9veloppement et pipelines OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/ede9b076414e389c2cd212adeda08956.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Fig. 1. Vue d'ensemble des pipelines en cours d'ex\u00e9cution.<\/i><\/p>\n<p>Cliquer sur le pipeline en cours d'ex\u00e9cution affiche des informations suppl\u00e9mentaires, comme indiqu\u00e9 \u00e0 la Fig. 2.<\/p>\n<p><img decoding=\"async\" alt=\"Applications modernes sur OpenShift, partie 3 : OpenShift en tant qu&#039;environnement de d\u00e9veloppement et pipelines OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/64581b1f6d8ff91aedd963019ef29be5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Fig. 2. Informations suppl\u00e9mentaires sur le pipeline.<\/i><\/p>\n<p>Apr\u00e8s les informations suppl\u00e9mentaires, nous pouvons voir les applications en cours d'ex\u00e9cution dans la vue <b>Topology<\/b>, comme indiqu\u00e9 \u00e0 la Fig. 3.<\/p>\n<p><img decoding=\"async\" alt=\"Applications modernes sur OpenShift, partie 3 : OpenShift en tant qu&#039;environnement de d\u00e9veloppement et pipelines OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/d23f723e14514ff60ecfddd8eb9bf752.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Fig 3. Pod en cours d'ex\u00e9cution.<\/i><\/p>\n<p>Cliquer sur le cercle en haut \u00e0 droite de l'ic\u00f4ne ouvre notre application, comme indiqu\u00e9 \u00e0 la Fig. 4.<\/p>\n<p><img decoding=\"async\" alt=\"Applications modernes sur OpenShift, partie 3 : OpenShift en tant qu&#039;environnement de d\u00e9veloppement et pipelines OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/aa8e09d9fd9f33d5faffc7f661d84ca4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Fig. 4. Application React en cours d'ex\u00e9cution.<\/i><\/p>\n<h3>Conclusion<\/h3>\n<p>\nNous avons donc montr\u00e9 comment d\u00e9ployer un serveur de d\u00e9veloppement pour votre application sur OpenShift et le synchroniser avec le syst\u00e8me de fichiers local. Nous avons \u00e9galement examin\u00e9 comment simuler un mod\u00e8le de chained-build \u00e0 l'aide des OpenShift Pipelines. Tous les codes d'exemple de cet article peuvent \u00eatre trouv\u00e9s <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/webapp-pipeline-tutorial\">ici<\/a><\/noindex>.<\/p>\n<h3>Ressources suppl\u00e9mentaires (EN)<\/h3>\n<p><\/p>\n<ul>\n<li>E-book gratuit <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/books\/deploying-openshift\/\">\u00ab D\u00e9veloppement sur OpenShift : guide pour les impatients \u00bb<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/06\/11\/container-native-nodejs-istio-rhoar\/\">Construction d'applications Node.js orient\u00e9es conteneurs avec Red Hat OpenShift Application Runtimes et 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\/\">D\u00e9bogage d'applications Node.js sur OpenShift avec 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\/\">Trois commandes pour ma\u00eetriser Express sur OpenShift depuis z\u00e9ro<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/03\/12\/rhoar-nodejs-annoucement\/\">Annonce de la version publique de Node.js dans 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\/\">Surveillance des applications Node.js sur OpenShift avec Prometheus<\/a><\/noindex><\/li>\n<li>D'autres articles sur <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/kubernetes\/\">OpenShift et Kubernetes<\/a><\/noindex> le site de Red Hat<\/li>\n<\/ul>\n<h3>Annonces des prochains webinaires<\/h3>\n<p>\nNous lan\u00e7ons une s\u00e9rie de webinaires vendredi sur l'exp\u00e9rience native avec Red Hat OpenShift Container Platform et 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 ao\u00fbt, webinaire \u2018L'Op\u00e9rateur\u2019 : Op\u00e9rateurs dans OpenShift et 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 septembre, DeploymentConfig contre Deployment \u2013 choses magiques sp\u00e9cifiques \u00e0 OpenShift pour la cr\u00e9ation et le d\u00e9ploiement d'applications<\/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 septembre, Red Hat OpenShift et 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 octobre, Comment g\u00e9rer une augmentation soudaine de la charge<\/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 octobre, Jenkins int\u00e9gr\u00e9, Pipeline-builds, Tekton dans Red Hat OpenShift Container Platform<\/b><\/a><\/noindex><\/li>\n<\/ul>\n<p>Source : <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.2 - 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\/fr\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"fr_FR\" \/>\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\/fr\/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\udd47Applications modernes sur OpenShift, partie 3 : OpenShift comme environnement de d\u00e9veloppement et pipelines OpenShift Pipelines | ProHoster","description":"Bonjour \u00e0 tous dans ce blog !","canonical_url":"https:\/\/prohoster.info\/fr\/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":"fr_FR","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\/fr\/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\/fr\/wp-json\/wp\/v2\/posts\/92048","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/comments?post=92048"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/posts\/92048\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media\/92049"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/media?parent=92048"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/categories?post=92048"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/fr\/wp-json\/wp\/v2\/tags?post=92048"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}