{"id":430,"date":"2022-02-12T12:48:17","date_gmt":"2022-02-12T11:48:17","guid":{"rendered":"https:\/\/ubiqware.net\/?p=430"},"modified":"2022-02-14T14:05:16","modified_gmt":"2022-02-14T13:05:16","slug":"nuestro-enfoque-devops","status":"publish","type":"post","link":"https:\/\/ubiqware.net\/es\/nuestro-enfoque-devops\/","title":{"rendered":"Nuestro enfoque de DevOps"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"430\" class=\"elementor elementor-430\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-79a3236e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"79a3236e\" data-element_type=\"section\" data-e-type=\"section\" data-settings=\"{&quot;_ob_glider_is_slider&quot;:&quot;no&quot;}\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3c374f68\" data-id=\"3c374f68\" data-element_type=\"column\" data-e-type=\"column\" data-settings=\"{&quot;_ob_column_hoveranimator&quot;:&quot;no&quot;,&quot;_ob_column_has_pseudo&quot;:&quot;no&quot;}\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-71cfa584 ob-harakiri-inherit ob-has-background-overlay elementor-widget elementor-widget-text-editor\" data-id=\"71cfa584\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;_ob_use_harakiri&quot;:&quot;yes&quot;,&quot;_ob_harakiri_writing_mode&quot;:&quot;inherit&quot;,&quot;_ob_postman_use&quot;:&quot;no&quot;,&quot;_ob_widget_stalker_use&quot;:&quot;no&quot;,&quot;_ob_poopart_use&quot;:&quot;yes&quot;,&quot;_ob_shadough_use&quot;:&quot;no&quot;,&quot;_ob_allow_hoveranimator&quot;:&quot;no&quot;}\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p><\/p>\n<p>En UbiqWare, nos centramos en ayudar a otras organizaciones a que su actividad en torno a la fabricaci\u00f3n de software y su operaci\u00f3n sea lo m\u00e1s eficiente posible. Para ello, utilizamos DevOps como modelo de referencia.<\/p>\n<p><\/p>\n<p><\/p>\n<p>DevOps es una filosof\u00eda, inicialmente acu\u00f1ada por <a href=\"https:\/\/devopsdays.org\/events\/2019-ghent\/speakers\/patrick-debois\/\">Patrick Debois<\/a> al dar el nombre <em><a href=\"https:\/\/devopsdays.org\/\">devopsdays<\/a><\/em> a una conferencia sobre agilidad, desarrollo y operaciones, tras el \u00e9xito de una presentaci\u00f3n sobre el tema en la conferencia Agile Toronto 2008. Dicha filosof\u00eda organiza el ciclo de vida del software en ocho fases, como ilustra la siguiente imagen.<\/p>\n<p><\/p>\n<p><\/p>\n<figure class=\"wp-block-image size-large\"><img fetchpriority=\"high\" decoding=\"async\" width=\"1024\" height=\"509\" class=\"wp-image-431\" src=\"https:\/\/ubiqware.net\/wp-content\/uploads\/2022\/02\/devops-on-white-2-1024x509.png\" alt=\"\" srcset=\"https:\/\/ubiqware.net\/wp-content\/uploads\/2022\/02\/devops-on-white-2-1024x509.png 1024w, https:\/\/ubiqware.net\/wp-content\/uploads\/2022\/02\/devops-on-white-2-300x149.png 300w, https:\/\/ubiqware.net\/wp-content\/uploads\/2022\/02\/devops-on-white-2-768x382.png 768w, https:\/\/ubiqware.net\/wp-content\/uploads\/2022\/02\/devops-on-white-2-1536x764.png 1536w, https:\/\/ubiqware.net\/wp-content\/uploads\/2022\/02\/devops-on-white-2-2048x1018.png 2048w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n<p><\/p>\n<p><\/p>\n<p>En las pr\u00f3ximas publicaciones en este blog, contaremos c\u00f3mo desde UbiqWare contribuimos a la mejora en la gesti\u00f3n del ciclo de vida del software de nuestros clientes y socios, indicando en detalle nuestra aproximaci\u00f3n a cada una de las ocho fases. Por ello, os brindamos a continuaci\u00f3n un resumen muy breve de las tareas que ayudamos a llevar a cabo en cada una de ellas.<\/p>\n<p><\/p>\n<p><\/p>\n<ul>\n<li><strong>PLAN<\/strong>: La planificaci\u00f3n de un proyecto consiste en trasladar los requisitos proporcionados por el cliente a tareas de proyecto (\u00edtems de la pila de producto, en t\u00e9rminos de Agilidad), comprobando el cumplimiento de los requisitos a partir de la completitud de las tareas de proyecto definidas para satisfacer cada uno de \u00e9stos. Si, adem\u00e1s, definimos los criterios de aceptaci\u00f3n de las tareas a trav\u00e9s de pruebas de software (si se pueden ejecutar de forma automatizada, mejor), estaremos haciendo Desarrollo Guiado por Pruebas. Un ejemplo de herramienta de planificaci\u00f3n \u00e1gil de proyecto ser\u00eda <a href=\"https:\/\/www.atlassian.com\/software\/jira\">Jira<\/a>, que se ve muy bien complementada por <a href=\"https:\/\/www.atlassian.com\/software\/confluence\">Confluence<\/a>, la soluci\u00f3n de gesti\u00f3n documental basada en wiki del mismo fabricante.<\/li>\n<\/ul>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<ul>\n<li><strong>CODE<\/strong>: Una vez tenemos definida una tarea, es necesario implementarla. En el caso de software, esto implica \u201ccodificarla\u201d o trasladarla a c\u00f3digo fuente. El c\u00f3digo fuente de nuestro proyecto software (o de un componente de nuestro proyecto, si est\u00e1 organizado por ejemplo en frontend y backend) lo entregaremos a un repositorio de c\u00f3digo. Generalmente, utilizaremos <a href=\"mailto:https:\/\/git-scm.com\/book\/es\">Git<\/a> como tecnolog\u00eda de referencia para mantener repositorios de c\u00f3digo. Aplicaremos tambi\u00e9n alg\u00fan flujo de trabajo, como <a href=\"mailto:https:\/\/nvie.com\/posts\/a-successful-git-branching-model\/\">Git Flow<\/a>, para organizar las contribuciones de los miembros del equipo y para desencadenar ciclos de integraci\u00f3n continua. Obviamente, debemos asegurarnos de que el c\u00f3digo sea implementado con sentido. Por ello, observaremos todas las buenas pr\u00e1cticas propias de la <strong>Ingenier\u00eda del Software<\/strong>, con el pertinente <strong>an\u00e1lisis del c\u00f3digo<\/strong> por parte de expertos humanos y la ayuda siempre bienvenida de herramientas autom\u00e1ticas de an\u00e1lisis de calidad del c\u00f3digo (por ejemplo, <a href=\"https:\/\/sonarqube.org\/\">SonarQube<\/a>). Un ejemplo de proveedor de repositorios Git es <a href=\"https:\/\/gitlab.org\/\">GitLab<\/a> (y algo m\u00e1s que eso, pues es una soluci\u00f3n integral para la gesti\u00f3n de proyectos software basada en DevOps).<\/li>\n<\/ul>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<ul>\n<li><strong>BUILD<\/strong>: Una vez tenemos c\u00f3digo fuente en un repositorio, deber\u00edamos ser capaces en cualquier momento de construirlo para poder ser ejecutado. Para ello, se utilizar\u00e1 un servidor de construcci\u00f3n (build server), que permitir\u00e1 construir software en las mismas condiciones (usando siempre la misma versi\u00f3n de sistema operativo, de compilador -en el caso de utilizar un lenguaje de programaci\u00f3n de alto nivel que debe ser traducido a un lenguaje ejecutable de m\u00e1s bajo nivel- o de las herramientas de asistencia a la construcci\u00f3n necesarias -preprocesadores, ofuscadores, etc.-). De esta forma, evitaremos las consecuencias que alguna vez hemos sufrido al \u201cgenerar el software cada uno en su equipo\u201d. El uso de un build server va a permitir automatizar ciclos de integraci\u00f3n continua (BUILD-TEST), de entrega continua (BUILD-TEST-RELEASE) y de despliegue continuo (BUILD-TEST-RELEASE-DEPLOY). <a href=\"https:\/\/jenkins.io\/\">Jenkins<\/a>, <a href=\"https:\/\/cloudbees.com\/\">CloudBees<\/a>, <a href=\"https:\/\/docs.gitlab.com\/ee\/ci\/\">GitLab CI\/CD<\/a>, <a href=\"https:\/\/azure.microsoft.com\/services\/devops\/pipelines\/\">Azure Pipelines<\/a> o <a href=\"https:\/\/aws.amazon.com\/codepipeline\/\">AWS CodePipeline<\/a> son ejemplos de tecnolog\u00edas de CI (integraci\u00f3n continua) y CD (entrega y despliegue continuos).<\/li>\n<\/ul>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<ul>\n<li><strong>TEST<\/strong>: Una vez nuestro software ha sido construido, debemos ejecutar todas las pruebas del software razonablemente posibles, recomendando especialmente la inversi\u00f3n en pruebas autom\u00e1ticas, siendo conscientes de que hay pruebas que s\u00f3lo un humano puede resolver (de momento J ). Las pruebas del software son un aspecto de la ingenier\u00eda de software que da para muchos art\u00edculos, y as\u00ed esperamos hacerlo pr\u00f3ximamente. <a href=\"https:\/\/selenium.dev\/\">Selenium<\/a>, <a href=\"https:\/\/jasmine.github.io\/\">Jasmine<\/a>, <a href=\"https:\/\/junit.org\/\">JUnit<\/a> or <a href=\"https:\/\/nunit.org\/\">NUnit<\/a> son algunos frameworks de automatizaci\u00f3n de pruebas para distintas tecnolog\u00edas de desarrollo.<\/li>\n<\/ul>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<ul>\n<li><strong>RELEASE<\/strong>: Una vez nuestro software ha sido probado, es \u201cdigno\u201d de ser registrado en un repositorio de artefactos, en el que se almacenan las sucesivas versiones del software que se van generando. Un artefacto es un entregable binario a partir del cual podemos instalar o desplegar software. Algunos ejemplos son archivos .jar o .war (Java), .msi o .exe de instalaci\u00f3n de software en Windows, paquetes NPM de aplicaciones web o bibliotecas JavaScript, ficheros .zip, etc. . <a href=\"https:\/\/www.sonatype.com\/products\/repository-oss\">Nexus<\/a>, <a href=\"https:\/\/jfrog.com\/artifactory\/\">Artifactory<\/a>, <a href=\"https:\/\/aws.amazon.com\/codeartifact\/\">AWS CodeArtifact<\/a>, <a href=\"https:\/\/azure.microsoft.com\/services\/devops\/artifacts\/\">Azure Artifacts<\/a> or a Docker registry, such as <a href=\"https:\/\/hub.docker.com\/\">Docker Hub<\/a>, are examples of artifact repositories.<\/li>\n<\/ul>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<ul>\n<li><strong>DEPLOY<\/strong>: A partir de un artefacto, podemos copiar el mismo a un entorno de ejecuci\u00f3n e instalar o desplegar la aplicaci\u00f3n en el mismo, para que comience a funcionar. Este tipo de proceso suele estar automatizado en un paso al efecto en un ciclo de despliegue continuo en cualquiera de las tecnolog\u00edas listadas en la fase BUILD, o cualquier otra similar.<\/li>\n<\/ul>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<ul>\n<li><strong>OPERATE<\/strong>: Los entornos de ejecuci\u00f3n deben estar correctamente dimensionados y configurados para garantizar un funcionamiento correcto del software. Generalmente, se trabaja al menos con cuatro:\n<ul>\n<li>Entorno de <strong>desarrollo<\/strong> (los equipos inform\u00e1ticos de cada miembro del equipo de desarrollo).<\/li>\n<\/ul>\n<ul>\n<li>Entorno de <strong>pruebas<\/strong> (p.e., ejecutando en \u00e9l la \u00faltima versi\u00f3n del software disponible en las ramas develop de los repositorios de c\u00f3digo involucrados en nuestro proyecto).<\/li>\n<\/ul>\n<ul>\n<li>Entorno de <strong>pre-producci\u00f3n<\/strong> (que replica el entorno de producci\u00f3n tan fielmente como se pueda, ejecutando la \u00faltima versi\u00f3n del software en la rama main\/master en los repositorios del proyecto).<\/li>\n<\/ul>\n<ul>\n<li>Entorno de <strong>producci\u00f3n<\/strong> (con la \u00faltima versi\u00f3n en main\/master).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><\/p>\n<p>\u00a0<\/p>\n<p>Las aproximaciones basadas en una gesti\u00f3n \u00e1gil de la infraestructura TI, con la gesti\u00f3n de la infraestructura como c\u00f3digo a la cabeza (IaC, Infrastructure-as-Code), van a facilitar adaptar la misma a contextos cambiantes del negocio y de la propia tecnolog\u00eda, ya sea en proveedores cloud como en entornos on-premise. Cualquier sistema operativo (Linux, Windows, MacOS, etc.) ejecutado de forma nativa o bien dentro de cualquier tecnolog\u00eda de virtualizaci\u00f3n, entornos de ejecuci\u00f3n de contenedores como <a href=\"https:\/\/docker.com\/\">Docker<\/a>, tecnolog\u00edas de gesti\u00f3n de clusters de contenedores como <a href=\"https:\/\/kubernetes.io\/\">Kubernetes<\/a>, o proveedores cloud (que a\u00f1aden servicios serverless a sus servicios de virtualizaci\u00f3n), como <a href=\"http:\/\/aws.amazon.com\/\">AWS<\/a> o <a href=\"http:\/\/azure.microsoft.com\/\">Azure<\/a>, son ejemplos de tecnolog\u00edas y proveedores de infraestructura.<\/p>\n<p>\u00a0<\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<p><\/p>\n<ul>\n<li><strong>MONITOR<\/strong>: Esta es una de las fases a las que desgraciadamente se le presta menos atenci\u00f3n, siendo vital medir c\u00f3mo estamos rindiendo para determinar cuellos de botella en cuya resoluci\u00f3n centrarnos y en comprobar que nuestra gesti\u00f3n del ciclo de vida del software es cada vez mejor, a trav\u00e9s de la adopci\u00f3n incremental de DevOps. En futuros art\u00edculos veremos c\u00f3mo monitorizar el rendimiento (funcional y no funcional) del software que fabricamos, el rendimiento de la infraestructura TI sobre la que nuestro software se ejecuta, y lo bien (y mal) que estamos rindiendo como equipo en torno a la metodolog\u00eda de gesti\u00f3n de proyecto y a la filosof\u00eda DevOps, examinando los indicadores de todas las herramientas de asistencia a la gesti\u00f3n del ciclo de vida del software.<\/li>\n<\/ul>\n<p><\/p>\n<p><\/p>\n<p>\u00a0<\/p>\n<p>Nuestros pr\u00f3ximos art\u00edculos ir\u00e1n comentando en detalle acerca de cada una de las fases, de herramientas utilizadas en algunas de ellas, de casos de \u00e9xito y tambi\u00e9n, como no, de algunos casos de fracaso (que a veces aportan incluso m\u00e1s).<\/p>\n<p><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>En UbiqWare, nos centramos en ayudar a otras organizaciones a que su actividad en torno a la fabricaci\u00f3n de software y su operaci\u00f3n sea lo m\u00e1s eficiente posible. Para ello, utilizamos DevOps como modelo de referencia. DevOps es una filosof\u00eda, inicialmente acu\u00f1ada por Patrick Debois al dar el nombre devopsdays a una conferencia sobre agilidad, [&hellip;]<\/p>\n","protected":false},"author":5,"featured_media":459,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[26,25,29,23,30,24,28,27],"tags":[],"class_list":["post-430","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-build","category-code","category-deploy","category-devops","category-operate","category-plan","category-release","category-test"],"_links":{"self":[{"href":"https:\/\/ubiqware.net\/es\/wp-json\/wp\/v2\/posts\/430","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ubiqware.net\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/ubiqware.net\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/ubiqware.net\/es\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/ubiqware.net\/es\/wp-json\/wp\/v2\/comments?post=430"}],"version-history":[{"count":0,"href":"https:\/\/ubiqware.net\/es\/wp-json\/wp\/v2\/posts\/430\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/ubiqware.net\/es\/wp-json\/wp\/v2\/media\/459"}],"wp:attachment":[{"href":"https:\/\/ubiqware.net\/es\/wp-json\/wp\/v2\/media?parent=430"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/ubiqware.net\/es\/wp-json\/wp\/v2\/categories?post=430"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/ubiqware.net\/es\/wp-json\/wp\/v2\/tags?post=430"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}