{"id":31377,"date":"2019-10-31T21:40:57","date_gmt":"2019-10-31T18:40:57","guid":{"rendered":"https:\/\/prohoster.info\/blog\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika\/"},"modified":"2019-10-31T21:40:57","modified_gmt":"2019-10-31T18:40:57","slug":"nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","status":"publish","type":"post","link":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","title":{"rendered":"Nuestra implementaci\u00f3n de Continuous Deployment en la plataforma del cliente","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>En True Engineering hemos configurado el proceso de entrega continua de actualizaciones en los servidores del cliente y queremos compartir esta experiencia.<\/p>\n<p>Para empezar, desarrollamos un sistema en l\u00ednea para el cliente y lo desplegamos en nuestro propio cl\u00faster de Kubernetes. Ahora nuestra soluci\u00f3n de alta carga se ha trasladado a la plataforma del cliente, para lo cual hemos configurado un proceso completamente autom\u00e1tico de Continuous Deployment. Gracias a esto, hemos acelerado el time-to-market, llevando los cambios al entorno de producci\u00f3n. <\/p>\n<p>En este art\u00edculo, compartiremos todas las etapas del proceso de Continuous Deployment (CD) o entrega de actualizaciones en la plataforma del cliente: <\/p>\n<ol>\n<li>c\u00f3mo comienza este proceso, <\/li>\n<li>sincronizaci\u00f3n con el repositorio Git del cliente,<\/li>\n<li>compilaci\u00f3n del backend y frontend,<\/li>\n<li>despliegue autom\u00e1tico de la aplicaci\u00f3n en el entorno de pruebas, <\/li>\n<li>despliegue autom\u00e1tico en producci\u00f3n. <\/li>\n<\/ol>\n<p>\nDurante el proceso compartiremos los detalles de la configuraci\u00f3n.<\/p>\n<p><img decoding=\"async\" alt=\"Nuestra implementaci\u00f3n de Continuous Deployment en la plataforma del cliente\" src=\"\/wp-content\/uploads\/2019\/04\/54be580319906344a6e2f091395ea7a7.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>1. Inicio del CD<\/h3>\n<p>\nEl Continuous Deployment comienza cuando el desarrollador sube los cambios a la rama de release de nuestro repositorio Git. <\/p>\n<p>Nuestra aplicaci\u00f3n se basa en una arquitectura de microservicios, y todos sus componentes se almacenan en un solo repositorio. Gracias a esto, todos los microservicios se compilan e instalan, incluso si solo uno de ellos ha cambiado. <\/p>\n<p>Hemos organizado el trabajo a trav\u00e9s de un solo repositorio por varias razones: <\/p>\n<ul>\n<li>Conveniencia en el desarrollo: la aplicaci\u00f3n est\u00e1 en constante evoluci\u00f3n, por lo que se puede trabajar con todo el c\u00f3digo a la vez. <\/li>\n<li>Una \u00fanica pipeline CI\/CD que garantiza que la aplicaci\u00f3n, como un sistema \u00fanico, pase todas las pruebas y se entregue en el entorno de producci\u00f3n del cliente. <\/li>\n<li>Eliminamos la confusi\u00f3n en las versiones: no tenemos que mantener un mapa de versiones de microservicios y describir la configuraci\u00f3n de cada microservicio en scripts de Helm.<\/li>\n<\/ul>\n<h3>2. Sincronizaci\u00f3n con el repositorio Git del c\u00f3digo fuente del cliente<\/h3>\n<p>\nLos cambios realizados se sincronizan autom\u00e1ticamente con el repositorio Git del cliente. All\u00ed se ha configurado la compilaci\u00f3n de la aplicaci\u00f3n, que se inicia despu\u00e9s de la actualizaci\u00f3n de la rama, y el despliegue en producci\u00f3n. Ambos procesos ocurren en su entorno desde el repositorio Git. <\/p>\n<p>No podemos trabajar directamente con el repositorio del cliente, ya que necesitamos nuestros propios entornos para desarrollo y pruebas. Utilizamos para estos fines nuestro repositorio de Git, que est\u00e1 sincronizado con su repositorio de Git. Tan pronto como el desarrollador sube cambios a la rama correspondiente de nuestro repositorio, GitLab env\u00eda inmediatamente esos cambios al cliente.<\/p>\n<p><img decoding=\"async\" alt=\"Nuestra implementaci\u00f3n de Continuous Deployment en la plataforma del cliente\" src=\"\/wp-content\/uploads\/2019\/04\/9e704f112649b77f0522fa60cfcfc2bb.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nDespu\u00e9s de eso, es necesario realizar la construcci\u00f3n. Esta consta de varias etapas: la construcci\u00f3n del backend y frontend, pruebas y despliegue en producci\u00f3n.<\/p>\n<h3>3. Construcci\u00f3n del backend y frontend<\/h3>\n<p>\nLa construcci\u00f3n del backend y frontend son dos tareas paralelas que se realizan en el sistema GitLab Runner. La configuraci\u00f3n de la construcci\u00f3n inicial se encuentra en este mismo repositorio.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/docs.gitlab.com\/ce\/ci\/yaml\/\">Tutorial para escribir un script YAML para la construcci\u00f3n en GitLab<\/a><\/noindex>.<\/p>\n<p>GitLab Runner toma el c\u00f3digo del repositorio correspondiente, construye la aplicaci\u00f3n Java usando el comando de construcci\u00f3n y la env\u00eda al registro de Docker. Aqu\u00ed construimos el backend y el frontend, obtenemos im\u00e1genes de Docker que almacenamos en el repositorio del lado del cliente. Para gestionar las im\u00e1genes de Docker usamos <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/palantir\/gradle-docker\">el plugin Gradle.<\/a><\/noindex>.<\/p>\n<p>Sincronizamos las versiones de nuestras im\u00e1genes con la versi\u00f3n de lanzamiento que ser\u00e1 publicada en Docker. Para un funcionamiento fluido, hemos implementado algunas configuraciones:<\/p>\n<p>1. Entre el entorno de prueba y el entorno de producci\u00f3n, los contenedores no se reconstruyen. Hicimos parametrizaciones para que el mismo contenedor pueda funcionar sin reconstrucci\u00f3n con todas las configuraciones, variables de entorno y servicios tanto en el entorno de prueba como en producci\u00f3n. <\/p>\n<p>2. Para actualizar la aplicaci\u00f3n a trav\u00e9s de Helm, es necesario indicar su versi\u00f3n. Nuestra construcci\u00f3n del backend, frontend y la actualizaci\u00f3n de la aplicaci\u00f3n son tres tareas diferentes, por lo que es importante usar la misma versi\u00f3n de la aplicaci\u00f3n en todas partes. Para esta tarea, utilizamos datos del historial de Git, ya que tenemos la configuraci\u00f3n del cl\u00faster de K8S y la aplicaci\u00f3n en el mismo repositorio de Git.<\/p>\n<p>Obtenemos la versi\u00f3n de la aplicaci\u00f3n a partir de los resultados de la ejecuci\u00f3n del comando<br \/>\n<code>git describe --tags --abbrev=7<\/code>.<\/p>\n<h3>4. Despliegue autom\u00e1tico de todos los cambios en el entorno de prueba (UAT) <\/h3>\n<p>\nLa siguiente etapa en este script de construcci\u00f3n implica la actualizaci\u00f3n autom\u00e1tica del cl\u00faster de K8S. Esto ocurre siempre que toda la aplicaci\u00f3n se haya construido y todos los artefactos se hayan publicado en Docker Registry. Despu\u00e9s de esto, se inicia la actualizaci\u00f3n del entorno de prueba.<\/p>\n<p>La actualizaci\u00f3n del cl\u00faster se inicia utilizando <noindex><a rel=\"nofollow\" href=\"https:\/\/helm.sh\/docs\/helm\/#helm-upgrade\">Actualizaci\u00f3n de Helm<\/a><\/noindex>. Si algo no sale como se plane\u00f3, Helm autom\u00e1ticamente revertir\u00e1 todos sus cambios. No es necesario monitorear su funcionamiento. <\/p>\n<p>Proporcionamos junto con la compilaci\u00f3n la configuraci\u00f3n del cl\u00faster K8S. Por lo tanto, el siguiente paso es actualizarlo: configMaps, despliegues, servicios, secretos y cualquier otra configuraci\u00f3n K8S que hayamos modificado. <\/p>\n<p>Despu\u00e9s de esto, Helm inicia la actualizaci\u00f3n RollOut de la propia aplicaci\u00f3n en el entorno de pruebas. Esto se hace antes de que la aplicaci\u00f3n se despliegue en producci\u00f3n, para que los usuarios puedan verificar manualmente las caracter\u00edsticas comerciales que hemos implementado en el entorno de pruebas.<\/p>\n<h3>5. Despliegue autom\u00e1tico de todos los cambios en Prod <\/h3>\n<p>\nPara desplegar la actualizaci\u00f3n en el entorno de producci\u00f3n, solo queda presionar un bot\u00f3n en GitLab, y los contenedores se entregan directamente al entorno de producci\u00f3n.<\/p>\n<p>La misma aplicaci\u00f3n puede funcionar sin recompilaci\u00f3n en diferentes entornos: pruebas y producci\u00f3n. Utilizamos los mismos artefactos sin cambiar nada en la aplicaci\u00f3n, y los par\u00e1metros se definen externamente. <\/p>\n<p>La flexible parametrizaci\u00f3n de la configuraci\u00f3n de la aplicaci\u00f3n depende del entorno en el que se ejecute. Hemos extra\u00eddo todas las configuraciones del entorno externas: todo se parametriza a trav\u00e9s de la configuraci\u00f3n de K8S y los par\u00e1metros de Helm. Cuando Helm despliega la compilaci\u00f3n en el entorno de pruebas, se aplican par\u00e1metros de prueba, y en el entorno de producci\u00f3n, se aplican par\u00e1metros de producci\u00f3n.<\/p>\n<p>Lo m\u00e1s complicado fue parametrizar todos los servicios y variables utilizadas que dependen del entorno, y trasladarlas a variables de entorno y descripci\u00f3n-configuraci\u00f3n de par\u00e1metros del entorno para Helm. <\/p>\n<p>En los par\u00e1metros de la aplicaci\u00f3n se utilizan variables de entorno. Sus valores se asignan en los contenedores mediante K8S configmap, que se plantilla utilizando plantillas de Go. Por ejemplo, se puede establecer una variable de entorno para el nombre de dominio de la siguiente manera:<\/p>\n<p><code>APP_EXTERNAL_DOMAIN: {{ (pluck .Values.global.env .Values.app.properties.app_external_domain | first) }}<\/code><\/p>\n<p><b>.Values.global.env <\/b>\u2013 en esta variable se almacena el nombre del entorno (prod, stage, UAT).<br \/>\n<b>.Values.app.properties.app_external_domain<\/b> \u2013 en esta variable definimos el dominio deseado en el archivo .Values.yaml <\/p>\n<p>Al actualizar la aplicaci\u00f3n, Helm crea a partir de las plantillas el archivo configmap.yaml y rellena el valor APP_EXTERNAL_DOMAIN con el valor necesario seg\u00fan el entorno en el que se inicia la actualizaci\u00f3n de la aplicaci\u00f3n. Esta variable se establece ya en el contenedor. El acceso a ella est\u00e1 disponible desde la aplicaci\u00f3n, por lo tanto, en cada entorno de la aplicaci\u00f3n tendr\u00e1 un valor diferente esta variable. <\/p>\n<p>Recientemente en Spring Cloud se ha a\u00f1adido soporte para K8S, incluyendo la gesti\u00f3n de configMaps: <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/spring-cloud\/spring-cloud-kubernetes\">Spring Cloud Kubernetes<\/a><\/noindex>. Mientras el proyecto se desarrolla activamente y cambia dr\u00e1sticamente, no podemos usarlo en producci\u00f3n. Pero lo monitorizamos activamente y lo utilizamos en configuraciones de DEV. Una vez que se estabilice, comenzaremos a cambiar de usar variables de entorno a \u00e9l.<\/p>\n<h3>Total<\/h3>\n<p>\nAs\u00ed que, Continuous Deployment est\u00e1 configurado y funcionando. Todas las actualizaciones se realizan con solo presionar un bot\u00f3n. La entrega de cambios al entorno de producci\u00f3n es autom\u00e1tica. Y, lo que es importante, las actualizaciones no detienen el funcionamiento del sistema. <\/p>\n<p><img decoding=\"async\" alt=\"Nuestra implementaci\u00f3n de Continuous Deployment en la plataforma del cliente\" src=\"\/wp-content\/uploads\/2019\/04\/07d609d9a40f644cfdad2bdb88652af2.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n <\/p>\n<h3>Planes futuros: migraci\u00f3n autom\u00e1tica de la base<\/h3>\n<p>\nHemos estado considerando actualizar la base y la posibilidad de revertir estos cambios. Dado que actualmente est\u00e1n funcionando dos versiones diferentes de la aplicaci\u00f3n: la antigua est\u00e1 activa y la nueva se est\u00e1 levantando. Solo apagaremos la antigua cuando estemos seguros de que la nueva versi\u00f3n funciona. La migraci\u00f3n de la base debe permitir operar con ambas versiones de la aplicaci\u00f3n. <\/p>\n<p>Por lo tanto, no podemos simplemente cambiar el nombre de la columna u otros datos. Pero podemos crear una nueva columna, copiar los datos de la columna antigua en ella y escribir disparadores que, al actualizar los datos, tambi\u00e9n los copiar\u00e1n y actualizar\u00e1n en la otra columna. Y despu\u00e9s del despliegue exitoso de la nueva versi\u00f3n de la aplicaci\u00f3n, tras el per\u00edodo de soporte posterior al lanzamiento, podremos eliminar la columna antigua y el disparador que ya no es necesario. <\/p>\n<p>Si la nueva versi\u00f3n de la aplicaci\u00f3n no funciona correctamente, podemos revertir a la versi\u00f3n anterior, incluyendo la versi\u00f3n anterior de la base. En resumen, nuestros cambios permitir\u00e1n trabajar simult\u00e1neamente con varias versiones de la aplicaci\u00f3n. <\/p>\n<p>Planeamos automatizar la migraci\u00f3n de la base a trav\u00e9s de K8S job, integr\u00e1ndola en el proceso de CD. Y compartiremos esta experiencia en Habr.<br \/>\n<br \/>Fuente: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/true_engineering\/blog\/447812\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u041c\u044b \u0432 True Engineering \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u043d\u043b\u0430\u0439\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0435\u0451 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 Kubernetes. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0435 \u0432\u044b\u0441\u043e\u043a\u043e\u043d\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043d\u043e\u0435 \u0440\u0435\u0448\u0435\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u0435\u0445\u0430\u043b\u043e \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430, \u0434\u043b\u044f \u0447\u0435\u0433\u043e \u043c\u044b \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u043e\u043b\u043d\u043e\u0441\u0442\u044c\u044e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 Continuous Deployment. \u0411\u043b\u0430\u0433\u043e\u0434\u0430\u0440\u044f \u044d\u0442\u043e\u043c\u0443, \u043c\u044b \u0443\u0441\u043a\u043e\u0440\u0438\u043b\u0438 time-to-market \u2013 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":23342,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-31377","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=\"\u041c\u044b \u0432 True Engineering \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u043d\u043b\u0430\u0439\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0435\u0451 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c.\" \/>\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\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika\" \/>\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\u041d\u0430\u0448\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Continuous Deployment \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u041c\u044b \u0432 True Engineering \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u043d\u043b\u0430\u0439\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0435\u0451 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika\" \/>\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=\"2019-10-31T18:40:57+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:40: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\udd47Nuestra implementaci\u00f3n de Continuous Deployment en la plataforma del cliente | ProHoster","description":"En True Engineering hemos configurado un proceso de entrega continua de actualizaciones en los servidores del cliente y queremos compartir esta experiencia. Para empezar, desarrollamos un sistema en l\u00ednea para el cliente y lo desplegamos en su propio entorno.","canonical_url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","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\u041d\u0430\u0448\u0430 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u044f Continuous Deployment \u043d\u0430 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0443 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 | ProHoster","og:description":"\u041c\u044b \u0432 True Engineering \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u043b\u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043d\u0435\u043f\u0440\u0435\u0440\u044b\u0432\u043d\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0445\u043e\u0442\u0438\u043c \u043f\u043e\u0434\u0435\u043b\u0438\u0442\u044c\u0441\u044f \u044d\u0442\u0438\u043c \u043e\u043f\u044b\u0442\u043e\u043c. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043c\u044b \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043e\u043d\u043b\u0430\u0439\u043d \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0434\u043b\u044f \u0437\u0430\u043a\u0430\u0437\u0447\u0438\u043a\u0430 \u0438 \u0440\u0430\u0437\u0432\u0435\u0440\u043d\u0443\u043b\u0438 \u0435\u0451 \u0432 \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u043c.","og:url":"https:\/\/prohoster.info\/es\/blog\/administrirovanie\/nasha-realizatsiya-continuous-deployment-na-platformu-zakazchika","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":"2019-10-31T18:40:57+00:00","article:modified_time":"2019-10-31T18:40:57+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"31377","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":"2026-01-21 05:52:19","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:18:39","updated":"2026-01-21 05:52:19","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\/31377","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=31377"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/posts\/31377\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media\/23342"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/media?parent=31377"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/categories?post=31377"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/es\/wp-json\/wp\/v2\/tags?post=31377"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}