{"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\/es\/blog\/administrirovanie\/sovremennye-prilozheniya-na-openshift-chast-3-openshift-kak-sreda-razrabotki-i-konvejery-openshift-pipelines","title":{"rendered":"Aplicaciones modernas en OpenShift, parte 3: OpenShift como entorno de desarrollo y pipelines de OpenShift Pipelines","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>\u00a1Hola a todos en este blog! Este es el tercer post de una serie en la que mostramos c\u00f3mo desplegar aplicaciones web modernas en Red Hat OpenShift.<\/p>\n<p><img decoding=\"async\" alt=\"Aplicaciones modernas en OpenShift, parte 3: OpenShift como entorno de desarrollo y pipelines de OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/9c3337b13a3f045d36343308ce6154cc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEn las dos publicaciones anteriores, hablamos sobre c\u00f3mo desplegar aplicaciones web modernas en solo unos pocos pasos y c\u00f3mo usar una nueva imagen S2I junto con una imagen de servidor HTTP lista, como NGINX, con la ayuda de builds enlazados para organizar el despliegue de producci\u00f3n.<\/p>\n<p>Hoy mostraremos c\u00f3mo ejecutar un servidor de desarrollo para su aplicaci\u00f3n en la plataforma OpenShift y sincronizarlo con el sistema de archivos local, adem\u00e1s de hablar sobre qu\u00e9 son las OpenShift Pipelines y c\u00f3mo se pueden utilizar como alternativa a los builds enlazados.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>OpenShift como entorno de desarrollo<\/h3>\n<p><\/p>\n<h4>Flujo de trabajo de desarrollo (development workflow)<\/h4>\n<p>\nComo se mencion\u00f3 en <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/511954\/\">el primer post<\/a><\/noindex>, el proceso t\u00edpico de desarrollo para aplicaciones web modernas es simplemente un \"servidor de desarrollo\" que monitorea cambios en los archivos locales. Cuando ocurren, se inicia la construcci\u00f3n de la aplicaci\u00f3n y luego se actualiza en el navegador.<\/p>\n<p>En la mayor\u00eda de los frameworks modernos, dicho \"servidor de desarrollo\" est\u00e1 integrado en las herramientas de l\u00ednea de comandos correspondientes.<\/p>\n<h4>Ejemplo local<\/h4>\n<p>\nPrimero, veamos c\u00f3mo funciona esto en el caso de ejecutar aplicaciones localmente. Tomemos como ejemplo la aplicaci\u00f3n <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/lholmquist\/react-web-app\">React<\/a><\/noindex> de los art\u00edculos anteriores, aunque pr\u00e1cticamente las mismas conceptos del flujo de trabajo se aplican en todos los dem\u00e1s frameworks modernos.<br \/>\nAs\u00ed que, para iniciar el \"servidor de desarrollo\" en nuestro ejemplo con React, ingresamos el siguiente comando:<\/p>\n<pre><code class=\"plaintext\">$ npm run start\n<\/code><\/pre>\n<p>\nEntonces, en la ventana de la terminal ver\u00edamos algo como esto:<\/p>\n<p><img decoding=\"async\" alt=\"Aplicaciones modernas en OpenShift, parte 3: OpenShift como entorno de desarrollo y pipelines de OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/06f84ffb4c9a6a5868b8b47b8ad1d9ec.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Y nuestra aplicaci\u00f3n se abrir\u00e1 en el navegador por defecto:<\/p>\n<p><img decoding=\"async\" alt=\"Aplicaciones modernas en OpenShift, parte 3: OpenShift como entorno de desarrollo y pipelines de OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/72341bb0796352e7343bf31ceb8233cd.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Ahora, si hacemos cambios en el archivo, la aplicaci\u00f3n deber\u00eda actualizarse en el navegador.<\/p>\n<p>Bien, con el desarrollo en modo local todo est\u00e1 claro, \u00bfy c\u00f3mo conseguimos lo mismo en OpenShift?<\/p>\n<h4>Servidor de desarrollo en OpenShift<\/h4>\n<p>\nSi recuerdas, en <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/redhatrussia\/blog\/513948\/\">en la publicaci\u00f3n anterior<\/a><\/noindex>, revisamos la llamada fase de ejecuci\u00f3n (run phase) de la imagen S2I y vimos que por defecto el m\u00f3dulo serve se encarga de manejar nuestra aplicaci\u00f3n web.<\/p>\n<p>Sin embargo, si miramos m\u00e1s de cerca <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/ubi8-s2i-web-app\/blob\/master\/s2i\/run#L10\">run script<\/a><\/noindex> de ese ejemplo, hay una variable de entorno $NPM_RUN que permite ejecutar su propio comando.<\/p>\n<p>Por ejemplo, se puede usar el m\u00f3dulo nodeshift para desplegar nuestra aplicaci\u00f3n:<\/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>Nota: el ejemplo anterior se presenta de manera condensada para ilustrar la idea general.<\/i><\/p>\n<p>Aqu\u00ed hemos agregado a nuestro despliegue la variable de entorno NPM_RUN, que le indica al paso de ejecuci\u00f3n que debe ejecutar el comando yarn start, que inicia el servidor de desarrollo de React dentro de nuestro pod de OpenShift.<\/p>\n<p>Si miramos el registro del pod en funcionamiento, deber\u00eda verse algo as\u00ed:<\/p>\n<p><img decoding=\"async\" alt=\"Aplicaciones modernas en OpenShift, parte 3: OpenShift como entorno de desarrollo y pipelines de OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/5b090223e08e32a3356608881068ce1a.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>Por supuesto, todo esto no tendr\u00e1 sentido hasta que podamos sincronizar el c\u00f3digo local con el c\u00f3digo que tambi\u00e9n se controla en cuanto a cambios, pero que reside en un servidor remoto.<\/p>\n<h4>Sincronizaci\u00f3n de c\u00f3digo remoto y local<\/h4>\n<p>\nAfortunadamente, nodeshift facilita la sincronizaci\u00f3n, y para rastrear cambios se puede utilizar el comando watch.<\/p>\n<p>As\u00ed que despu\u00e9s de ejecutar el comando para desplegar el servidor de desarrollo para nuestra aplicaci\u00f3n, podemos usar el siguiente comando:<\/p>\n<pre><code class=\"plaintext\">$ npx nodeshift watch\n<\/code><\/pre>\n<p>\nComo resultado, se conectar\u00e1 al pod en ejecuci\u00f3n que creamos un poco antes, se activar\u00e1 la sincronizaci\u00f3n de nuestros archivos locales con el cl\u00faster remoto, y los archivos en nuestro sistema local comenzar\u00e1n a ser monitoreados en busca de cambios.<\/p>\n<p>Por lo tanto, si ahora actualizamos el archivo src\/App.js, el sistema reaccionar\u00e1 ante esos cambios, los copiar\u00e1 en el cl\u00faster remoto y ejecutar\u00e1 el servidor de desarrollo, que luego actualizar\u00e1 nuestra aplicaci\u00f3n en el navegador.<\/p>\n<p>Para completar la imagen, mostraremos c\u00f3mo lucen estos comandos en su totalidad:<\/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>\nEl comando watch es una abstracci\u00f3n sobre el comando oc rsync, para obtener m\u00e1s informaci\u00f3n sobre c\u00f3mo funciona, puedes consultar. <noindex><a rel=\"nofollow\" href=\"https:\/\/docs.okd.io\/latest\/dev_guide\/copy_files_to_container.html\">aqu\u00ed<\/a><\/noindex>.<\/p>\n<p>Este fue un ejemplo para React, pero el mismo m\u00e9todo se puede utilizar con otros frameworks, solo debes definir la variable de entorno NPM_RUN de la manera adecuada.<br \/>\n\u2003<\/p>\n<h3>Pipelines de OpenShift<\/h3>\n<p><img decoding=\"async\" alt=\"Aplicaciones modernas en OpenShift, parte 3: OpenShift como entorno de desarrollo y pipelines de OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/33b932d3591b22dd00d82509b352d489.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p>A continuaci\u00f3n, hablaremos sobre la herramienta conocida como OpenShift Pipelines y c\u00f3mo se puede utilizar como una alternativa a las compilaciones encadenadas.<\/p>\n<h4>\u00bfQu\u00e9 son los OpenShift Pipelines?<\/h4>\n<p>\nOpenShift Pipelines es un sistema de CI\/CD orientado a la nube, dise\u00f1ado para organizar tuber\u00edas utilizando Tekton. Tekton es un marco de CI\/CD nativo de Kubernetes, flexible y de c\u00f3digo abierto, que permite automatizar el despliegue en diversas plataformas (Kubernetes, serverless, m\u00e1quinas virtuales, etc.) al abstraer el nivel subyacente.<\/p>\n<p>Para entender este art\u00edculo, se necesitan ciertos conocimientos sobre Pipelines, por lo que recomendamos encarecidamente que primero revises la <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openshift\/pipelines-tutorial\">documentaci\u00f3n oficial<\/a><\/noindex>.<\/p>\n<h4>Configuraci\u00f3n del entorno de trabajo<\/h4>\n<p>\nPara experimentar con los ejemplos de este art\u00edculo, primero debes preparar el entorno de trabajo:<\/p>\n<ol>\n<li>Instalar y configurar un cl\u00faster OpenShift 4. En nuestros ejemplos, utilizamos CodeReady Containers (CRD), cuyas instrucciones de instalaci\u00f3n puedes encontrar <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.redhat.com\/openshift\/install\/crc\/installer-provisioned\">aqu\u00ed<\/a><\/noindex>.<\/li>\n<li>Una vez que el cl\u00faster est\u00e9 listo, debes instalar el Operator de Pipeline. No te preocupes, es f\u00e1cil, las instrucciones para la instalaci\u00f3n <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/openshift\/pipelines-tutorial\/blob\/master\/install-operator.md\">aqu\u00ed<\/a><\/noindex>.<\/li>\n<li>Descargar <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\">aqu\u00ed<\/a><\/noindex>.<\/li>\n<li>Ejecutar la herramienta de l\u00ednea de comandos create-react-app para crear una aplicaci\u00f3n que luego ser\u00e1 desplegada (es una aplicaci\u00f3n simple <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift-starters\/react-pipeline-example\">React<\/a><\/noindex>).<\/li>\n<li>(Opcional) Clonar el repositorio para ejecutar localmente el ejemplo de la aplicaci\u00f3n con el comando npm install y luego npm start.<\/li>\n<\/ol>\n<p>\nEn el repositorio de la aplicaci\u00f3n tambi\u00e9n habr\u00e1 una carpeta k8s, donde estar\u00e1n los YAML de Kubernetes\/OpenShift utilizados para desplegar la aplicaci\u00f3n. All\u00ed habr\u00e1 Tasks, ClusterTasks, Resources y Pipelines que crearemos en este <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/webapp-pipeline-tutorial\">el repositorio<\/a><\/noindex>.<\/p>\n<h4>Comencemos<\/h4>\n<p>\nLo primero que necesitamos hacer para nuestro ejemplo es crear un nuevo proyecto en el cl\u00faster de OpenShift. Llamaremos a este proyecto webapp-pipeline y lo crearemos con el siguiente comando:<\/p>\n<pre><code class=\"plaintext\">$ oc new-project webapp-pipeline\n<\/code><\/pre>\n<p>\nA partir de aqu\u00ed, este nombre de proyecto se utilizar\u00e1 en el c\u00f3digo, as\u00ed que si decides nombrarlo de otra manera, no olvides ajustar el c\u00f3digo de los ejemplos en consecuencia. Desde este punto, procederemos de abajo hacia arriba: es decir, primero crearemos todos los componentes de la tuber\u00eda, y luego la propia tuber\u00eda.<\/p>\n<p>As\u00ed que, lo primero es...<\/p>\n<h4>Tareas Tasks<\/h4>\n<p>\nCrearemos un par de tareas (tasks) que luego ayudar\u00e1n a desplegar la aplicaci\u00f3n dentro de nuestro pipeline. La primera tarea, apply_manifests_task, se encarga de aplicar los recursos YAML de Kubernetes (service, deployment y route) que se encuentran en la carpeta k8s de nuestra aplicaci\u00f3n. La segunda tarea, update_deployment_task, se encarga de actualizar la imagen ya desplegada a la que se crea en nuestro pipeline.<\/p>\n<p>No te preocupes si a\u00fan no est\u00e1 muy claro. En realidad, estas tareas son algo as\u00ed como utilidades, y las exploraremos m\u00e1s en detalle un poco m\u00e1s adelante. Por ahora, simplemente las crearemos:<\/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>\nLuego, usaremos el comando tkn CLI para verificar que se hayan creado las tareas:<\/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>Nota: estas son tareas locales de tu proyecto actual.<\/i><\/p>\n<h4>Tareas de cl\u00faster Cluster tasks<\/h4>\n<p>\nLas tareas de cl\u00faster son, en general, lo mismo que las tareas normales. Es decir, son una colecci\u00f3n reutilizable de pasos que se combinan de diversas maneras al ejecutar una tarea espec\u00edfica. La diferencia es que las tareas de cl\u00faster est\u00e1n disponibles en todo el cl\u00faster. Para ver la lista de tareas de cl\u00faster que se crean autom\u00e1ticamente al agregar el Pipeline Operator, nuevamente usaremos el comando tkn CLI:<\/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>\nAhora crearemos dos tareas de cl\u00faster. La primera generar\u00e1 una imagen S2I y la enviar\u00e1 al registro interno de OpenShift; la segunda construir\u00e1 nuestra imagen basada en NGINX, utilizando como contenido la aplicaci\u00f3n que ya hemos compilado.<\/p>\n<h4>Creamos y enviamos la imagen<\/h4>\n<p>\nAl crear la primera tarea, repetiremos lo que ya hicimos en el art\u00edculo anterior sobre construcciones relacionadas. Recordemos que usamos la imagen S2I (ubi8-s2i-web-app) para \"compilar\" nuestra aplicaci\u00f3n, y al final obtuvimos una imagen almacenada en el registro interno de OpenShift. Ahora utilizaremos esta imagen S2I de la aplicaci\u00f3n web para crear un DockerFile para nuestra aplicaci\u00f3n, y luego emplearemos Buildah para realizar la construcci\u00f3n real y enviar la imagen resultante al registro interno de OpenShift, ya que esto es exactamente lo que hace OpenShift cuando despliega sus aplicaciones usando NodeShift.<\/p>\n<p>\u00bfSe preguntan de d\u00f3nde sacamos todo esto? 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>, solo la copiamos y la ajustamos a nuestras necesidades.<\/p>\n<p>Entonces, ahora creamos la tarea de cl\u00faster 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>\nNo vamos a revisar esto en detalle, solo nos detendremos en el par\u00e1metro OUTPUT_DIR:<\/p>\n<pre><code class=\"plaintext\">params:\n      - name: OUTPUT_DIR\n        description: La ubicaci\u00f3n del directorio de salida de la construcci\u00f3n\n        default: build\n<\/code><\/pre>\n<p>\nPor defecto, este par\u00e1metro es igual a build, exactamente donde React coloca el contenido construido. En otros frameworks se utilizan otras rutas, por ejemplo, en Ember es dist. La salida de nuestra primera tarea de cl\u00faster ser\u00e1 una imagen que contiene el HTML, JavaScript y CSS que hemos construido.<\/p>\n<h4>Construyendo la imagen basada en NGINX<\/h4>\n<p>\nEn cuanto a nuestra segunda tarea de cl\u00faster, debe construir una imagen basada en NGINX, utilizando el contenido de la aplicaci\u00f3n que ya hemos construido. De hecho, esta es la parte del segmento anterior donde tratamos las construcciones encadenadas.<\/p>\n<p>Para esto, \u2013exactamente como antes\u2013 crearemos la tarea de cl\u00faster 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 vemos el c\u00f3digo de estas tareas de cl\u00faster, podemos notar que no se especifica el repositorio Git con el que estamos trabajando, ni los nombres de las im\u00e1genes que estamos creando. Solo establecemos qu\u00e9 es lo que estamos pasando a Git, o alguna imagen que necesita recibir la imagen final. Por eso, estas tareas de cl\u00faster se pueden reutilizar al trabajar con otras aplicaciones.<\/p>\n<p>Y aqu\u00ed pasamos elegantemente al siguiente punto\u2026<\/p>\n<h4>Recursos<\/h4>\n<p>\nEntonces, como acabamos de decir, las tareas en cl\u00faster deben ser lo m\u00e1s generales posible, necesitamos crear recursos que se utilizar\u00e1n como entrada (repositorio Git) y salida (im\u00e1genes finales). El primer recurso que necesitamos es Git, donde se encuentra nuestra aplicaci\u00f3n, algo as\u00ed como esto:<\/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>\nAqu\u00ed, PipelineResource tiene el tipo git. La clave url en la secci\u00f3n params indica el repositorio espec\u00edfico y establece la rama master (esto es opcional, pero lo escribimos para que sea completo).<\/p>\n<p>Ahora necesitamos crear un recurso para la imagen, donde se guardar\u00e1n los resultados de la tarea s2i-web-app, esto se hace as\u00ed:<\/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>\nAqu\u00ed, PipelineResource tiene el tipo imagen, y el valor del par\u00e1metro url indica el Registro de Im\u00e1genes interno de OpenShift, espec\u00edficamente el que se encuentra en el espacio de nombres webapp-pipeline. No olvides cambiar este par\u00e1metro si usas otro espacio de nombres.<\/p>\n<p>Y, por \u00faltimo, el \u00faltimo recurso que necesitaremos tambi\u00e9n tendr\u00e1 el tipo imagen y ser\u00e1 la imagen final de NGINX, que luego se utilizar\u00e1 en el despliegue:<\/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>\nY de nuevo, tenga en cuenta que este recurso guarda la imagen en el registro interno de OpenShift en el espacio de nombres webapp-pipeline.<\/p>\n<p>Para crear estos recursos de una vez, usaremos el comando 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>\nPuedes asegurarte de que los recursos se han creado as\u00ed:<\/p>\n<pre><code class=\"plaintext\">$ tkn resource ls\n<\/code><\/pre>\n<p><\/p>\n<h4>Pipeline<\/h4>\n<p>\nAhora que tenemos todos los componentes necesarios, vamos a ensamblar el pipeline, cre\u00e1ndolo con el siguiente comando:<\/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>\nPero, antes de ejecutar este comando, analicemos estos componentes. Primero, este es el nombre:<\/p>\n<pre><code class=\"plaintext\">apiVersion: tekton.dev\/v1alpha1\nkind: Pipeline\nmetadata:\n  name: build-and-deploy-react\n<\/code><\/pre>\n<p>\nLuego, en la secci\u00f3n spec, vemos la declaraci\u00f3n de los recursos que creamos anteriormente:<\/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>\nLuego creamos las tareas que debe realizar nuestro pipeline. Primero debe ejecutar la tarea s2i-web-app que ya hemos creado:<\/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>\nEsta tarea toma los par\u00e1metros de entrada (recurso git) y salida (recurso built-web-application-image). Tambi\u00e9n le pasamos un par\u00e1metro especial para que no verifique TLS, ya que usamos certificados autofirmados:<\/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>\nLa siguiente tarea es casi la misma, solo que aqu\u00ed se llama a la tarea de cl\u00faster que ya hemos creado: webapp-build-runtime:<\/p>\n<pre><code class=\"plaintext\">nombre: imagen-runtime-de-construcci\u00f3n\n    referenciaTarea:\n      nombre: webapp-build-runtime\n      tipo: TareaDeCl\u00faster\n<\/code><\/pre>\n<p>\nAl igual que con la tarea anterior, pasamos el recurso, pero ahora es la imagen-de-aplicaci\u00f3n-web-construida (la salida de nuestra tarea anterior). Y como salida, nuevamente definimos la imagen. Dado que esta tarea debe ejecutarse despu\u00e9s de la anterior, agregamos el campo 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: \"false\"\n      runAfter:\n        - build-web-application\n<\/code><\/pre>\n<p>\nLas siguientes dos tareas son responsables de aplicar los archivos YAML del servicio, la ruta y el despliegue, que residen en el directorio k8s de nuestra aplicaci\u00f3n web, as\u00ed como de actualizar este despliegue al crear nuevas im\u00e1genes. Estas dos tareas de cl\u00faster las definimos al principio del art\u00edculo.<\/p>\n<h4>Ejecutar el canal<\/h4>\n<p>\nAs\u00ed que todas las partes de nuestro pipeline est\u00e1n creadas, y lo ejecutaremos con el siguiente comando:<\/p>\n<pre><code class=\"plaintext\">$ tkn pipeline start build-and-deploy-react\n<\/code><\/pre>\n<p>\nEn esta etapa, se utiliza la l\u00ednea de comandos en modo interactivo y hay que seleccionar los recursos adecuados en respuesta a cada solicitud: para el recurso git seleccionamos repositorio-de-aplicaciones-web, luego para el recurso de la primera imagen \u2013 imagen-de-aplicaci\u00f3n-web-construida, y finalmente, para el recurso de la segunda imagen \u2013 imagen-runtime-de-aplicaci\u00f3n-web:<\/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>\nAhora verifiquemos el estado del pipeline con el siguiente comando:<\/p>\n<pre><code class=\"plaintext\">$ tkn pipeline logs -f\n<\/code><\/pre>\n<p>\nUna vez que el pipeline se inicie y la aplicaci\u00f3n est\u00e9 desplegada, solicitaremos la ruta publicada con el siguiente comando:<\/p>\n<pre><code class=\"plaintext\">$ oc get route react-pipeline-example --template='http:\/\/{{.spec.host}}'\n<\/code><\/pre>\n<p>\nPara una mejor visualizaci\u00f3n, podemos ver nuestro pipeline en el modo Desarrollador de la consola web en la secci\u00f3n <b>Pipelines.<\/b>, como se muestra en la Fig. 1.<\/p>\n<p><img decoding=\"async\" alt=\"Aplicaciones modernas en OpenShift, parte 3: OpenShift como entorno de desarrollo y pipelines de OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/ede9b076414e389c2cd212adeda08956.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Fig.1. Visi\u00f3n general de los pipelines en ejecuci\u00f3n.<\/i><\/p>\n<p>Hacer clic en el pipeline en ejecuci\u00f3n muestra informaci\u00f3n adicional, como se muestra en la Fig.2.<\/p>\n<p><img decoding=\"async\" alt=\"Aplicaciones modernas en OpenShift, parte 3: OpenShift como entorno de desarrollo y pipelines de OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/64581b1f6d8ff91aedd963019ef29be5.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Fig. 2. Informaci\u00f3n adicional sobre el pipeline.<\/i><\/p>\n<p>Despu\u00e9s de la informaci\u00f3n adicional, se pueden ver las aplicaciones en ejecuci\u00f3n en la vista <b>Topolog\u00eda<\/b>, como se muestra en la Fig.3.<\/p>\n<p><img decoding=\"async\" alt=\"Aplicaciones modernas en OpenShift, parte 3: OpenShift como entorno de desarrollo y pipelines de OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/d23f723e14514ff60ecfddd8eb9bf752.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Fig 3. Pod en ejecuci\u00f3n.<\/i><\/p>\n<p>Hacer clic en el c\u00edrculo en la esquina superior derecha del \u00edcono abre nuestra aplicaci\u00f3n, como se muestra en la Fig.4.<\/p>\n<p><img decoding=\"async\" alt=\"Aplicaciones modernas en OpenShift, parte 3: OpenShift como entorno de desarrollo y pipelines de OpenShift Pipelines\" src=\"\/wp-content\/uploads\/2020\/08\/aa8e09d9fd9f33d5faffc7f661d84ca4.png\" style=\"display:block;margin: 0 auto;\" \/><\/p>\n<p><i>Fig. 4. Aplicaci\u00f3n React en ejecuci\u00f3n.<\/i><\/p>\n<h3>Conclusi\u00f3n<\/h3>\n<p>\nAs\u00ed que hemos mostrado c\u00f3mo iniciar un servidor de desarrollo en OpenShift para su aplicaci\u00f3n y sincronizarlo con el sistema de archivos local. Tambi\u00e9n hemos explorado c\u00f3mo simular una plantilla de construcci\u00f3n encadenada utilizando OpenShift Pipelines. Todo el c\u00f3digo de los ejemplos de este art\u00edculo se puede encontrar <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/nodeshift\/webapp-pipeline-tutorial\">aqu\u00ed<\/a><\/noindex>.<\/p>\n<h3>Recursos adicionales (EN)<\/h3>\n<p><\/p>\n<ul>\n<li>Libro electr\u00f3nico gratuito <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/books\/deploying-openshift\/\">\u00abDesarrollo en OpenShift: gu\u00eda para impacientes\u00bb<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/06\/11\/container-native-nodejs-istio-rhoar\/\">Construcci\u00f3n de aplicaciones orientadas a contenedores Node.js utilizando Red Hat OpenShift Application Runtimes e 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\/\">Depuraci\u00f3n de aplicaciones Node.js en OpenShift con 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\/\">Tres comandos para aprender Express desde cero en OpenShift<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/blog\/2018\/03\/12\/rhoar-nodejs-annoucement\/\">Anuncio de la versi\u00f3n p\u00fablica de Node.js en el marco de 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\/\">Monitoreo de aplicaciones Node.js en OpenShift usando Prometheus<\/a><\/noindex><\/li>\n<li>Otros art\u00edculos sobre <noindex><a rel=\"nofollow\" href=\"https:\/\/developers.redhat.com\/topics\/kubernetes\/\">OpenShift y Kubernetes<\/a><\/noindex> en el sitio de Red Hat<\/li>\n<\/ul>\n<h3>Anuncios de pr\u00f3ximos seminarios web<\/h3>\n<p>\nIniciamos una serie de seminarios web los viernes sobre la experiencia nativa de uso de Red Hat OpenShift Container Platform y 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 de agosto, seminario web Emperador \u201cOperador\u201d: Operadores en OpenShift y 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 de septiembre, DeploymentConfig vs Deployment \u2013 cosas m\u00e1gicas espec\u00edficas de OpenShift para construir y desplegar aplicaciones<\/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 de septiembre, Red Hat OpenShift y 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 de octubre, C\u00f3mo manejar un aumento repentino de carga<\/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 de octubre, Jenkins integrado, Pipeline-builds, Tekton en Red Hat OpenShift Container Platform<\/b><\/a><\/noindex><\/li>\n<\/ul>\n<p>Fuente: <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\/es\/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=\"es_ES\" \/>\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\/es\/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\udd47Aplicaciones modernas en OpenShift, parte 3: OpenShift como entorno de desarrollo y tuber\u00edas de OpenShift Pipelines | ProHoster","description":"\u00a1Hola a todos en este blog!","canonical_url":"https:\/\/prohoster.info\/es\/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":"es_ES","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\/es\/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\/es\/wp-json\/wp\/v2\/posts\/92048","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/comments?post=92048"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/92048\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/92049"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=92048"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=92048"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=92048"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}