{"id":9317,"date":"2022-01-06T11:32:37","date_gmt":"2022-01-06T16:32:37","guid":{"rendered":"https:\/\/blogs.pacasmayo.com\/felipe\/?p=9317"},"modified":"2022-03-16T09:04:23","modified_gmt":"2022-03-16T14:04:23","slug":"versionado-semantico-semver","status":"publish","type":"post","link":"https:\/\/blogs.pacasmayo.com\/felipe\/2022\/01\/06\/versionado-semantico-semver\/","title":{"rendered":"Versionado Sem\u00e1ntico &#8211; SemVer"},"content":{"rendered":"\n<p><a href=\"https:\/\/blogs.pacasmayo.com\/felipe\/2022\/01\/06\/semantic-versioning-semver\/\">English version<\/a><\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Descripci\u00f3n simple<\/h2>\n\n\n\n<p>Si necesitas saber todos los detalles de la especificaci\u00f3n SemVer, por favor visita el website de la <a href=\"https:\/\/semver.org\/lang\/es\/\">especificaci\u00f3n<\/a>, aqu\u00ed solamente discutiremos en forma breve los puntos principales y algunas aplicaciones pr\u00e1cticas.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>2.3.8-alpha3.1\n^ ^ ^   ^\n| | |   |\n| | |   --&gt; Prelanzamiento\n| | --&gt; Parche\n| --&gt; Menor\n--&gt; Mayor<\/code><\/pre>\n\n\n\n<ul class=\"wp-block-list\"><li>Usa Parche para correci\u00f3n de errores, 100% compatible con la versi\u00f3n anterior<\/li><li>Usa Menor para agregar nueva funcionalidad sin romper compatibilidad<\/li><li>Usa Mayor para introducir cambios importantes que tienen el potencial de romper compatibilidad con versiones anteriores<\/li><li>Usa Prelanzamiento durante el desarrollo de una nueva versi\u00f3n<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Mejores pr\u00e1cticas en el uso de Versionado Sem\u00e1ntico<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">\u00danica Fuente de Verdad<\/h3>\n\n\n\n<p>Es de suprema importancia en el desarrollo de software que hay una sola fuente de verdad para todo el proceso, y esto es especialmente importante con respecto a la versi\u00f3n.  No debe haber ninguna duda sobre qu\u00e9 versi\u00f3n del c\u00f3digo fuente fue usado para construir cada pieza de software. Escoja una fuente de verdad para la versi\u00f3n del paquete y aseg\u00farese que esa versi\u00f3n se refleje en todo el proceso.  <\/p>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/plantuml.com\/plantuml\/png\/VLAzRlCm3Dpr58I_sHw-TagA88_GgLCN9c8SeOgiwiTeKVZTIrEMWYnTHDxfSDGHEiQ48UMRLNXEKm1D4KEOh4ND22CJir8NOmcW2-IdQ5ZsFOmclRk4usx-FpmDpzqgPGx-URGq1YAtjyRHxjuE6kELz3xHLoeq_2W0iRvHGa40PmmQkfb2D9FRtSrdlbsg_fB99L8BAFMPAHDuusaT8YPYmIZL_fIDrGmugRbmpjPKGQBO-crqXJwVh8bNjMnRw5xn_84ZlnaTbo2FypSPtFoxjs92kd4bH4L_X9MSYz8qGzyVP3KLrDob22CnrmCOb9noocMBkUPxOAheKAABUqjUr7UyrKU3HXxQYhOABttVT9KKlqOUoMd-Sxy0\" alt=\"\" width=\"421\" height=\"313\"\/><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">Sincronizaci\u00f3n autom\u00e1tica<\/h3>\n\n\n\n<p>Una vez escogida la fuente \u00fanica de la versi\u00f3n, busca herramientas que te permitan automatizar la mayor parte de la sincronizaci\u00f3n de la versi\u00f3n en las diferentes etapas del proceso de desarrollo del software (SDLC).  Es inevitable que la versi\u00f3n est\u00e9 presente en diferentes formas y lugares del proceso, por eso es necesario que, en lo posible, el proceso por medio del cual la versi\u00f3n se propaga a estas diferentes etapas y lugares sea autom\u00e1tico para prevenir un desfase.<\/p>\n\n\n\n<p>Por ejemplo, la versi\u00f3n aparece en un archivo meta del paquete en forma de texto, tambi\u00e9n en un tag del repositorio y en la metadescripci\u00f3n del paquete, y potencialmente en varios otros lugares en el camino. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Versionado intencional<\/h3>\n\n\n\n<p>No caigas en la tentaci\u00f3n de la actualizaci\u00f3n autom\u00e1tica de la versi\u00f3n.  Es muy f\u00e1cil para los desarrolladores crear una utilidad simple que actualiza la versi\u00f3n cada vez que hacemos un cambio en el c\u00f3digo, o cada vez que compilamos la aplicaci\u00f3n.  Y, si bien es cierto, eso nos ahorra unos milisegundos, va en contra de las mejores pr\u00e1cticas de la versi\u00f3n sem\u00e1ntica, donde cada cambio a la versi\u00f3n es intencional y calculado de tal manera que la versi\u00f3n refleje los cambios en la aplicaci\u00f3n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Rechaza reescribir involuntariamente la versi\u00f3n<\/h3>\n\n\n\n<p>Para evitar confusiones, es preferible que una versi\u00f3n no pueda usarse dos veces, es mejor si hay alguna forma de impedirlo por defecto.  Sistemas como el administrador de paquetes de npm rechazan un segundo paquete con la misma versi\u00f3n, pero permiten borrar la versi\u00f3n actual para volverla a escribir en caso que sea absolutamente necesario usar una versi\u00f3n que se us\u00f3 por error.  Escoge herramientas que te permitan en alg\u00fan punto de la canalizaci\u00f3n detectar y rechazar dos diferentes paquetes con una misma versi\u00f3n.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">SemVer en herramientas espec\u00edficas<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">NPM<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Versionando tu paquete o aplicaci\u00f3n<\/h4>\n\n\n\n<p>NPM es el administrador de paquetes de NodeJS y tiene soporte nativo para SemVer, es decir, no se necesita instalar una herramienta aparte para todo el manejo de Versionado Sem\u00e1ntico en tu paquete, aunque, hay herramientas para uso avanzado en caso sea necesario.  Creo que bastar\u00e1 mostrar un ejemplo para documentar lo f\u00e1cil que es hacer versionado sem\u00e1ntico en NPM.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># empieza a crear un nuevo paquete \n# (tendr\u00e1s que contestar varias preguntas,\n# como nombre de la persona que mantendr\u00e1 el paquete, descripci\u00f3n, etc.)\nnpm init\n# ahora ver\u00e1s que el folder tiene un archivo llamado package.json\n# dentro podr\u00e1s ver que tienen un campo <span style=\"background-color: rgba(0, 0, 0, 0.2); font-size: inherit; color: initial;\">version.<\/span>\n# ahora incrementa la versi\u00f3n de paquete\nnpm version patch\n# verifica en package.json y ver\u00e1s que tu paquete ahora es versi\u00f3n 1.0.1\n# si est\u00e1s trabajando en una versi\u00f3n privada puedes incrementar la versi\u00f3n pre-release\nnpm version prerelease\n# version es ahora 1.0.2-0\n# digamos que continuas trabajando en esta version privada\nnpm version prerelease\n# version es ahora 1.0.2-1\n# cuando est\u00e1s listo para publicar esta version\nnpm version patch\n# version es ahora 1.0.2 (nota que ya estabas en 1.0.2, pero ha removido el prerelease)\n# ahora puedes publicar esta versi\u00f3n\n# debes usar los conceptos de SemVer, es decir \n# patch es para arreglar problemas\nnpm version minor\n# ahora version es 1.1.0, que quiere decir que has agregado nueva funcionalidad\nnpm version major\n# ahora version es 2.0.0, que quiere decir que has cambiado algo que podr\u00eda romper\n# la funcionalidad de instalaciones existentes\n<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">Versionando tus dependencias<\/h4>\n\n\n\n<p>Como viste, es facil\u00edsimo usar SemVer cuando las herramientas que usas lo soportan en forma nativa.  Pero, tambi\u00e9n es necesario usar los conceptos de SemVer cuando tu aplicaci\u00f3n o paquete depende de otros paquetes; NPM tambi\u00e9n maneja esto nativamente.  Por ejemplo,<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Digamos que en tu paquete necesitas analizar un archivo swagger\n# NO DEBES escribir tu propio analizador :) \n# Hay un analizador llamado swagger-parser,\n# quieres instalarlo no te importa la versi\u00f3n\nnpm install swagger-parser\n+ swagger-parser@10.0.3\n# instalar\u00e1 la versi\u00f3n m\u00e1s reciente 10.0.3\n# pero, la librer\u00eda ha cambiado desde la \u00faltima vez\n# que la usaste y prefieres usar la versi\u00f3n anterior\n# Si sabes la versi\u00f3n exacta, podr\u00e1s instalarla as\u00ed\nnpm install swagger-parser@2.0.0\n+ swagger-parser@2.0.0\n# si prefieres la version menor 2.0,\n# pero no sabes cu\u00e1l es la \u00faltima variaci\u00f3n \n# de esa versi\u00f3n, puedes usar la tilde ~\nnpm install swagger-parser@~2.0.0\n+ swagger-parser@2.0.1\n# si eres aventuraro(a) pero no quieres\n# que una nueva versi\u00f3n rompar compatibilidad\n# con tu paquete, entonces puedes\n# pedir la \u00faltima versi\u00f3n menor\n# usando la careta o sombrero ^\nnpm install swagger-parser@^2.0.0\n+ swagger-parser@2.5.0<\/code><\/pre>\n\n\n\n<p>Otro aspecto de un administrador de paquetes maduro es la creaci\u00f3n de un <code>lock.<\/code> Es decir, si bien es cierto el desarrollador quiere cierto nivel de flexibilidad en la versi\u00f3n del paquete que recibe, el operador de la aplicaci\u00f3n querr\u00e1 un gran nivel de estabilidad en la aplicaci\u00f3n que mantiene en producci\u00f3n.  Para lograr este balance, los administradores de paquetes como NPM crean un archivo paralelo a package.json en cual guardan la versi\u00f3n espec\u00edfica de cada una de las dependencias que fueron instaladas.  Esto es clave para que, al construir la versi\u00f3n que correr\u00e1 en producci\u00f3n, esta contenga las mismas versiones exactas que el desarrollador us\u00f3 durante el desarrollo y que fueron usadas durante la pruebas de unidad e integraci\u00f3n.  De lo contrario, los operadores no podr\u00edan tener confianza que lo que ponen en producci\u00f3n es id\u00e9ntico a lo que fue la intenci\u00f3n original.<\/p>\n\n\n\n<p>NPM tiene una ventaja adicional y es que cuando usas el administrador de npm para versionar tu paquete o aplicaci\u00f3n, autom\u00e1ticamente te agrega una etiqueta de git a tu repositorio, lo veremos en acci\u00f3n en la siguiente secci\u00f3n.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Git<\/h3>\n\n\n\n<p>Las etiquetas de git no son estrictamente compatibles con SemVer, es decir, uno puede asignar cualquier palabra como etiqueta (aunque hay <a href=\"https:\/\/git-scm.com\/docs\/git-check-ref-format\">reglas<\/a> muy estrictas con referencia a qu\u00e9 caract\u00e9res son v\u00e1lidos).  Entonces, aunque casi cualquier palabra es v\u00e1lida como una etiqueta de git, la mayor parte de los equipos de desarrollo de software usan convenciones para equiparar la etiqueta con la version.  La convenci\u00f3n m\u00e1s usada es prefijar la versi\u00f3n sem\u00e1ntica con la letra v; as\u00ed, la versi\u00f3n sem\u00e1ntica 2.3.8 ser\u00e1 etiquetada en git como &#8216;v2.3.8&#8217;.  Nuevamente, no hay reglas estrictas, pero es importante que todo el equipo acepte una nomenclatura est\u00e1ndar por convenci\u00f3n.<\/p>\n\n\n\n<p>Todos los sistemas modernos de desarrollo de software soportan versionado sem\u00e1ntico en el manejo de paquetes y es importante mantener la sincronizaci\u00f3n de etiquetas de git en paralelo con las del paquete mismo. Pero, debes recordar que las etiquetas de git no son reusables (a\u00fan cuando se pueden borrar y recrear, esto no es recomendable), y por lo tanto debes etiquetar cuando la versi\u00f3n est\u00e1 lista para ser promovida.<\/p>\n\n\n\n<p>Mi recomendaci\u00f3n es que la fuente de verdad sea la versi\u00f3n en el paquete y que se sincronize git manual o autom\u00e1ticamente.  Usa SemVer estricto en el versionado del paquete y la convenci\u00f3n actual es agregar la &#8216;v&#8217; a la etiqueta del git.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignright size-large\"><img decoding=\"async\" src=\"https:\/\/plantuml.com\/plantuml\/png\/ZT71RXGn30RWUvxYb_QmhRGPqKKzG2yz03UEF81dufsnS9AHa-mYteOZpz4NOzfbf7OHq5CiMx8_n_UbajKMrJq5xht7A1N3nCFNt2eYINBdtDnKtKNPzzZV-YW-DJwIFxGqI4wa4YZSEUEPgJfWwPhcY2DRMSgOZOsLgJ0sUDlTTE_ycztlu6ODzWxekWudayeOSc07dCTJ2F2ULDVCKevnUNp4baRZiJty1EcOjmvOzMM2RyWcewJ_gt6QH1bN1qbI9WxNa8AhbA_ltEKsL8S96z2KZL3O7dwSLt2NsZ-id-GR5spsj_3uB7ZYu0Ldwvxp_I6hvfElD9R5WOy5i_61JNhbnyQz939m0kkZv2WXsmupMyRSE731H0ERPcWUIDshhXtPHlxxZpqJBgOlYN3axoicv1twR4PGWb6a5uDxepHCy1_-TOzIy-pkEOKMzHS0\" alt=\"\"\/><\/figure><\/div>\n\n\n\n<pre class=\"wp-block-code\"><code># en cuanto vas a trabajar en algo nuevo, crea una rama\ngit checkout main\ngit pull\ngit checkout -b 25-mi-nueva-funcionalidad\n# tambi\u00e9n es recomendable crear el semver temporal del paquete al mismo tiempo\n# versi\u00f3n actual es 3.1.8\nnpm version prerelease\n# el output ser\u00e1 algo como v3.1.9-0\n# ahora puedes trabajar en arreglar o implementar\n# codificar...\n# lint\n# unit test\n# durante la implementaci\u00f3n se recomienda \n# agregar los archivos y hacer commit multiples veces diarias\n# tambi\u00e9n es recomendable que cada vez que se empuje el c\u00f3digo\n# al repositorio remoto, se actualize la versi\u00f3n prerelease\n# npm version prerelease\n# 3.1.9-1, 3.1.9-2, etc.\nnpm version prerelease\ngit add --all\ngit commit -m 'agregu\u00e9 algo'\n# la primera vez deber\u00e1s indicar a qu\u00e9 rama remota enviar\ngit push -u origin 25-mi-nueva-funcionalidad\n# una vez que el c\u00f3digo ha sido implementado, validado y probado\n# entonces se crea la versi\u00f3n apropiada (patch,minor or major)\nnpm version patch\n# ahora la versi\u00f3n ser\u00e1 3.1.9, n\u00f3tese que al crear el patch remueve el segmento de prerelease\n# tambi\u00e9n es importante notar que, en el caso de npm \n# y otros administradores de paquetes modernos, \n# si usas las herrramientas de versi\u00f3n, \n# autom\u00e1ticamente se crear\u00e1n las etiquetas en git\ngit add --all\ngit commit -m 'Fixes #25 - Mi nueva funcionalidad'\n# El argumento --follow-tags instruye a git de enviar todo, incluyendo las etiquetas al sistema remoto\ngit push --follow-tags\n# si tu empresa no usa alg\u00fan proceso para hacer revisi\u00f3n de c\u00f3digo por pares y la combinaci\u00f3n de las ramas\n# entonces las siguientes l\u00edneas se invocan localmente\ngit checkout main\ngit pull\ngit merge 25-mi-nueva-funcionalidad\ngit push\n# independientemente de si se combina en el sistema remoto o local\n# una vez combinado, por limpieza, debes borrar la rama local\ngit branch -D 25-mi-nueva-funcionalidad\n# NUNCA reuses una rama ya combinada\n# si est\u00e1s usando el GitLab flow que yo recomiendo\n# siempre empieza todo cambio de main y comb\u00ednalo de regreso a main\n# y si no, lee sobre el Git flow, el GitHub flow o el GitLab flow y escoge un flow\n# NO INVENTES tu propio flow, te traer\u00e1 muchas complicaciones tarde o temprano<\/code><\/pre>\n\n\n\n<p>Para asegurarte que las versiones sem\u00e1nticas del paquete no se contradigan con las etiquetas de git, puedes tomar dos caminos: automatizar las etiquetas de git cada vez que cambies la versi\u00f3n en el paquete, o automatizar la versi\u00f3n del paquete cada vez que etiquetes git.  Ambos caminos tienen sus ventajas y desventajas, pero es mucho mejor cuando la tecnolog\u00eda ya la ha implementado por ti.  Por ejemplo, en el caso anterior, podr\u00e1s notar que nunca se hizo un <code>git tag<\/code>, y la raz\u00f3n es porque el comando <code>npm version ...<\/code> se encarga de sincronizar la versi\u00f3n con una etiqueta en git.  Esta es una excelente evoluci\u00f3n de las herramientas de desarrollo, anteriormente, para mantener los dos sincronizados ten\u00edas que escribir c\u00f3digo en los ganchos de git, o de la herramienta (prerelease, postversion, etc.).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Docker<\/h3>\n\n\n\n<h4 class=\"wp-block-heading\">Versionando tus im\u00e1genes<\/h4>\n\n\n\n<p>Versionado con docker es un poquito m\u00e1s complicado, puesto que Dockerfile (el archivo meta en texto que describe a un contenedor) no tiene un campo espec\u00edfico de versi\u00f3n.  Las posibilidades son usar un &#8220;label&#8221; (campo soportado por Docker) para poner estampar una versi\u00f3n.  Pero, siendo que un campo espec\u00edfico de versi\u00f3n no es soportado nativamente por el ambiente docker, este es un caso en el que recomiendo que la \u00fanica fuente de verdad con respecto a la versi\u00f3n resida fuera del archivo, y qu\u00e9 mejor que en la etiqueta de git.  Sin embargo, como no hay una sincronizaci\u00f3n autom\u00e1tica de la versi\u00f3n con la etiqueta, debemos asegurarnos que nuestra canalizaci\u00f3n se encargue de imponer tal restricci\u00f3n.  Adem\u00e1s, Docker agrega un peque\u00f1o cambio al escricto Versionado Sem\u00e1ntico.<\/p>\n\n\n\n<p>Seg\u00fan SemVer, cada artefacto diferente debe tener una versi\u00f3n mayor, menor y parche diferente, as\u00ed, la primera versi\u00f3n en se publicada ser\u00e1 1.0.0, el siguiente parche 1.0.1 y cuando se agregue nueva funcionalidad ser\u00e1 1.1.0.  Simple, pero Docker agrega que al publicar 1.0.0, debe ser etiquetado como 1, 1.0, y 1.0.0, cuando el primer parche cree la versi\u00f3n 1.0.1, debe ser ahora tambi\u00e9n etiquetada como 1 y 1.0.  Esta pr\u00e1ctica, aunque aceptada en el ambiente docker no es 100% compatible con SemVer puesto que la versi\u00f3n 1.0 de ayer tiene la posibilidad de ser diferente de la versi\u00f3n 1.0 de hoy, a\u00fan as\u00ed, es la pr\u00e1ctica aceptada y hay que usarla.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table><tbody><tr><td>Fecha<\/td><td>Evento<\/td><td>Etiqueta Mayor<\/td><td>Etiqueta Menor<\/td><td>Etiqueta SemVer<\/td><td>Etiqueta &#8220;latest&#8221;<\/td><\/tr><tr><td>2022-01-01<\/td><td>Primera versi\u00f3n<\/td><td>1<\/td><td>1.0<\/td><td>1.0.0<\/td><td>latest<\/td><\/tr><tr><td>2022-01-02<\/td><td>Peque\u00f1o arreglo<\/td><td>1<\/td><td>1.0<\/td><td>1.0.1<\/td><td>latest<\/td><\/tr><tr><td>2022-01-03<\/td><td>Nueva funcionalidad<\/td><td>1<\/td><td>1.1<\/td><td>1.1.0<\/td><td>latest<\/td><\/tr><\/tbody><\/table><figcaption>En el caso de Docker cada imagen debe recibir m\u00faltiple etiquetas, la versi\u00f3n del 2022-01-03 tendr\u00e1 todas &#8220;1&#8221;, &#8220;1.1&#8221;, &#8220;1.1.0&#8221; y &#8220;latest&#8221;<\/figcaption><\/figure>\n\n\n\n<p>Para cumplir con SemVer y al mismo tiempo con las mejores pr\u00e1cticas de docker, el mejor lugar para generar todas estas etiquetas es la canalizaci\u00f3n.  Pero, es necesario asegurarse que la empresa acuerde usar un proceso estricto y documentado para evitar confusi\u00f3n.<\/p>\n\n\n\n<p>Mi recomendaci\u00f3n es que la etiqueta interna sea &#8220;development&#8221; por defecto, pero que pueda modificarse durante la construcci\u00f3n de la imagen.  Adem\u00e1s, en caso que sea necesario conocer la version de la imagen dentro del contenedor, se puede ponerla en una variable del ambiente (ENV).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># En el archivo Dockerfile\nARG IMAGE_VERSION=\"development\"\nFROM alpine:latest\nENV IMAGE_VERSION=$VERSION\nLABEL version=\"development\"\n\n# A la hora de construir\nIMAGE_VERSION=$(git describe --abbrev=0)\ndocker build . --build-arg IMAGE_VERSION=$IMAGE_VERSION --label version=\"$IMAGE_VERSION\" -t myregistry\/myimage:$IMAGE_VERSION<\/code><\/pre>\n\n\n\n<p>N\u00f3tese que al construir la imagen, se utiliza la \u00faltima etiqueta de git para construir la im\u00e1gen y se la pone en tres lugares:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Como argumento (&#8211;build-arg), lo cual ser\u00e1 utilizado para crear una variable de ambiente que pueda ser consumida desde dentro del contenedor<\/li><li>Como etiqueta (&#8211;label), lo cual quedar\u00e1 grabado como informaci\u00f3n &#8220;meta&#8221; del contenedor<\/li><li>Como etiqueta (-t), lo cual servir\u00e1 para regitrarlo en el registro de im\u00e1genes correspondiente<\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Versionando las im\u00e1genes de las que t\u00fa dependes<\/h4>\n\n\n\n<p>Durante la construcci\u00f3n de tu imagen, vas a tener que usar tus propias im\u00e1genes o im\u00e1genes de terceros; es importante que uses bien tus etiquetas para asegurarte que tu aplicaci\u00f3n la imagen usada sea la correcta.  Como vimos anteriormente, docker recomienda que cada nueva versi\u00f3n sea etiquetada como <code>latest<\/code>, pero eso puede ser una bendici\u00f3n o una maldici\u00f3n, dependiendo de tus necesidades y circunstancias.  Al usar <code>latest<\/code>, tienes la seguridad de siempre estar usando la \u00faltima versi\u00f3n, es decir, sin esfuerzo de tu parte, tu aplicaci\u00f3n siempre estar\u00e1 al d\u00eda, esa es la parte buena, sin embargo, como imaginar\u00e1s, tambi\u00e9n estar\u00e1s recibiendo todos los nuevos errores que se han introducido en las nuevas versiones.  Para aplicaciones que corran en producci\u00f3n, es necesario tener estabilidad y por lo tanto, no es recomendable que tu aplicaci\u00f3n use la etiqueta <code>latest<\/code>.  Pero, si has creado una canalizaci\u00f3n madura, con suficientes puertas para verificar que tu aplicaci\u00f3n funciona al 100% antes de ser puesta en producci\u00f3n, entonces est\u00e1 bien usar <code>latest<\/code>, pero con mucho cuidado.  A la larga, probablemente usar <code>latest<\/code> te traer\u00e1 m\u00e1s dolores de cabeza que bendiciones y por eso no es muy recomendable.<\/p>\n\n\n\n<p>Al usar im\u00e1genes base para tu imagen, aseg\u00farate de usar etiquetas espec\u00edficas en tu l\u00ednea <code>FROM<\/code> para evitar sorpresas, o por lo menos que no var\u00eden la versi\u00f3n mayor.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>FROM nginx:1.21.5\nFROM nginx:1.21\nFROM nginx:1\n\n<s>FROM nginx\nFROM nginx:latest<\/s><\/code><\/pre>\n\n\n\n<p>Cuando uses tus propias im\u00e1genes o im\u00e1genes de terceros en el despliegue de tu aplicaci\u00f3n (compose, helm, etc.), usa etiquetas espec\u00edficas.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>spec:\n  containers:\n  - name: nginx\n    image: nginx:1.21.5\n  - name: myapp\n    image: registry.company.com\/myapp:3.4.6<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Canalizaci\u00f3n (pipelining)<\/h3>\n\n\n\n<p>Es extremadamente importante que los artefactos creados durante la canalizaci\u00f3n sean estampados con la misma versi\u00f3n que acompa\u00f1a a los archivos de texto (c\u00f3digo fuente) que generaron el artefacto. Debe hacerse un esfuerzo muy grande que todo esto suceda en forma autom\u00e1tica y se evite la actualizaciones manuales una vez que la versi\u00f3n ha sido actualizada en el c\u00f3digo fuente. Por ejemplo, si una aplicaci\u00f3n escrita en NodeJS va a ser publicada en un contenedor, hay una tentaci\u00f3n muy grande de mantener dos versiones, una dentro de la aplicaci\u00f3n y otra para el despliegue.  Sin embargo, estas dos son la mismo, deber\u00edan mantenerse en paralelo y nunca deber\u00edan perder el sincronismo.  As\u00ed, si hay un problema en producci\u00f3n, y la versi\u00f3n en producci\u00f3n es 1.3.5, yo s\u00e9 exactamente qu\u00e9 versi\u00f3n del c\u00f3digo gener\u00f3 ese contenedor.  Veamos, hay varios lugares que deben mantenerse en sincronismo:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>package.json &#8211; \u00fanica fuente de verdad<\/li><li>contenedor &#8211; al construirse este contenedor, debe reflejar la misma versi\u00f3n de la aplicaci\u00f3n instalada en \u00e9l<\/li><li>despliegue &#8211; (e.g helm) Al desplegar la aplicaci\u00f3n usando plantillas, es necesario pasar la versi\u00f3n del contenedor a la plantilla<\/li><\/ul>\n\n\n\n<p>La canalizaci\u00f3n debe leer la versi\u00f3n de la aplicaci\u00f3n del archivo meta de la aplicaci\u00f3n y usarla en todos los dem\u00e1s lugares.  A veces esto es dif\u00edcil porque las canalizaciones tienden a estar segregadas en m\u00faltiples pasos y no todos los pasos tienen acceso al archivo meta de la aplicaci\u00f3n original.  En esos casos, debe haber un paso inicial que extraiga la versi\u00f3n del archivo meta y que la pase como variable de ambiente a los dem\u00e1s pasos de la canalizaci\u00f3n.  Por ejemplo, en GitLab CI se crea un artefacto con un archive .env para pasar la informaci\u00f3n a los dem\u00e1s pasos de la canalizaci\u00f3n:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>setup:\n  script:\n    - echo \"APP_VERSION=\"$(node -p require('.\/package.json').version\") >> build.env\n  artifacts:\n    reports:\n      dotenv: build.env\n\nconstruir:\n  dependencies:\n    - setup\n  script:\n    - docker build . --build-arg IMAGE_VERSION=$APP_VERSION --label version=\"$APP_VERSION\" -t myregistry\/myapp:$APP_VERSION\n\ndesplegar:\n  dependencies:\n    - setup\n  script:\n    - RELEASE_NAME=myapp_$APP_VERSION\n    - helm upgrade --set image=$CI_REGISTRY_IMAGE --set tag=$APP_VERSION --install $RELEASE_NAME chartmuseum\/myapp<\/code><\/pre>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>English version Descripci\u00f3n simple Si necesitas saber todos los detalles de la especificaci\u00f3n SemVer, por favor visita el [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":9318,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[38],"tags":[39],"class_list":["post-9317","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-technology","tag-tecnologia"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Versionado Sem\u00e1ntico - SemVer - El blog de Felipe<\/title>\n<meta name=\"description\" content=\"Mejores pr\u00e1cticas y ejemplos pr\u00e1cticos para usar SemVer en forma provechosa usando diferentes tecnolog\u00edas para crear aplicaciones modernas.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.pacasmayo.com\/felipe\/2022\/01\/06\/versionado-semantico-semver\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Versionado Sem\u00e1ntico - SemVer - El blog de Felipe\" \/>\n<meta property=\"og:description\" content=\"Mejores pr\u00e1cticas y ejemplos pr\u00e1cticos para usar SemVer en forma provechosa usando diferentes tecnolog\u00edas para crear aplicaciones modernas.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.pacasmayo.com\/felipe\/2022\/01\/06\/versionado-semantico-semver\/\" \/>\n<meta property=\"og:site_name\" content=\"El blog de Felipe\" \/>\n<meta property=\"article:published_time\" content=\"2022-01-06T16:32:37+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2022-03-16T14:04:23+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/blogs.pacasmayo.com\/felipe\/files\/2022\/01\/image.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1500\" \/>\n\t<meta property=\"og:image:height\" content=\"1000\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"AI\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"AI\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/2022\\\/01\\\/06\\\/versionado-semantico-semver\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/2022\\\/01\\\/06\\\/versionado-semantico-semver\\\/\"},\"author\":{\"name\":\"AI\",\"@id\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/#\\\/schema\\\/person\\\/e32bfb69f0dcbed869e838474a34d240\"},\"headline\":\"Versionado Sem\u00e1ntico &#8211; SemVer\",\"datePublished\":\"2022-01-06T16:32:37+00:00\",\"dateModified\":\"2022-03-16T14:04:23+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/2022\\\/01\\\/06\\\/versionado-semantico-semver\\\/\"},\"wordCount\":2279,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/2022\\\/01\\\/06\\\/versionado-semantico-semver\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/files\\\/2022\\\/01\\\/image.png\",\"keywords\":[\"Tecnolog\u00eda\"],\"articleSection\":[\"Technology\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/2022\\\/01\\\/06\\\/versionado-semantico-semver\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/2022\\\/01\\\/06\\\/versionado-semantico-semver\\\/\",\"url\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/2022\\\/01\\\/06\\\/versionado-semantico-semver\\\/\",\"name\":\"Versionado Sem\u00e1ntico - SemVer - El blog de Felipe\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/2022\\\/01\\\/06\\\/versionado-semantico-semver\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/2022\\\/01\\\/06\\\/versionado-semantico-semver\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/files\\\/2022\\\/01\\\/image.png\",\"datePublished\":\"2022-01-06T16:32:37+00:00\",\"dateModified\":\"2022-03-16T14:04:23+00:00\",\"description\":\"Mejores pr\u00e1cticas y ejemplos pr\u00e1cticos para usar SemVer en forma provechosa usando diferentes tecnolog\u00edas para crear aplicaciones modernas.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/2022\\\/01\\\/06\\\/versionado-semantico-semver\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/2022\\\/01\\\/06\\\/versionado-semantico-semver\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/2022\\\/01\\\/06\\\/versionado-semantico-semver\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/files\\\/2022\\\/01\\\/image.png\",\"contentUrl\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/files\\\/2022\\\/01\\\/image.png\",\"width\":1500,\"height\":1000},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/2022\\\/01\\\/06\\\/versionado-semantico-semver\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Versionado Sem\u00e1ntico &#8211; SemVer\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/#website\",\"url\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/\",\"name\":\"El blog de Felipe\",\"description\":\"De la abundancia del coraz\u00f3n...\",\"publisher\":{\"@id\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/#organization\",\"name\":\"El blog de Felipe\",\"url\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/files\\\/2019\\\/11\\\/cropped-caricatura_felipe.jpg\",\"contentUrl\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/files\\\/2019\\\/11\\\/cropped-caricatura_felipe.jpg\",\"width\":1360,\"height\":598,\"caption\":\"El blog de Felipe\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/#\\\/schema\\\/person\\\/e32bfb69f0dcbed869e838474a34d240\",\"name\":\"AI\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/4afeebd1deb1471ed6e7e21e6dc44176da2cb2ef0704b36e720ef8656e34bd65?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/4afeebd1deb1471ed6e7e21e6dc44176da2cb2ef0704b36e720ef8656e34bd65?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/4afeebd1deb1471ed6e7e21e6dc44176da2cb2ef0704b36e720ef8656e34bd65?s=96&d=mm&r=g\",\"caption\":\"AI\"},\"description\":\"Este art\u00edculo ha sido seleccionado y parcialmente escrito e ilustrado por Inteligencia Artificial (AI) basado en noticias disponibles.\",\"url\":\"https:\\\/\\\/blogs.pacasmayo.com\\\/felipe\\\/author\\\/ai\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Versionado Sem\u00e1ntico - SemVer - El blog de Felipe","description":"Mejores pr\u00e1cticas y ejemplos pr\u00e1cticos para usar SemVer en forma provechosa usando diferentes tecnolog\u00edas para crear aplicaciones modernas.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blogs.pacasmayo.com\/felipe\/2022\/01\/06\/versionado-semantico-semver\/","og_locale":"en_US","og_type":"article","og_title":"Versionado Sem\u00e1ntico - SemVer - El blog de Felipe","og_description":"Mejores pr\u00e1cticas y ejemplos pr\u00e1cticos para usar SemVer en forma provechosa usando diferentes tecnolog\u00edas para crear aplicaciones modernas.","og_url":"https:\/\/blogs.pacasmayo.com\/felipe\/2022\/01\/06\/versionado-semantico-semver\/","og_site_name":"El blog de Felipe","article_published_time":"2022-01-06T16:32:37+00:00","article_modified_time":"2022-03-16T14:04:23+00:00","og_image":[{"width":1500,"height":1000,"url":"https:\/\/blogs.pacasmayo.com\/felipe\/files\/2022\/01\/image.png","type":"image\/png"}],"author":"AI","twitter_card":"summary_large_image","twitter_misc":{"Written by":"AI","Est. reading time":"14 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.pacasmayo.com\/felipe\/2022\/01\/06\/versionado-semantico-semver\/#article","isPartOf":{"@id":"https:\/\/blogs.pacasmayo.com\/felipe\/2022\/01\/06\/versionado-semantico-semver\/"},"author":{"name":"AI","@id":"https:\/\/blogs.pacasmayo.com\/felipe\/#\/schema\/person\/e32bfb69f0dcbed869e838474a34d240"},"headline":"Versionado Sem\u00e1ntico &#8211; SemVer","datePublished":"2022-01-06T16:32:37+00:00","dateModified":"2022-03-16T14:04:23+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.pacasmayo.com\/felipe\/2022\/01\/06\/versionado-semantico-semver\/"},"wordCount":2279,"commentCount":1,"publisher":{"@id":"https:\/\/blogs.pacasmayo.com\/felipe\/#organization"},"image":{"@id":"https:\/\/blogs.pacasmayo.com\/felipe\/2022\/01\/06\/versionado-semantico-semver\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.pacasmayo.com\/felipe\/files\/2022\/01\/image.png","keywords":["Tecnolog\u00eda"],"articleSection":["Technology"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.pacasmayo.com\/felipe\/2022\/01\/06\/versionado-semantico-semver\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.pacasmayo.com\/felipe\/2022\/01\/06\/versionado-semantico-semver\/","url":"https:\/\/blogs.pacasmayo.com\/felipe\/2022\/01\/06\/versionado-semantico-semver\/","name":"Versionado Sem\u00e1ntico - SemVer - El blog de Felipe","isPartOf":{"@id":"https:\/\/blogs.pacasmayo.com\/felipe\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.pacasmayo.com\/felipe\/2022\/01\/06\/versionado-semantico-semver\/#primaryimage"},"image":{"@id":"https:\/\/blogs.pacasmayo.com\/felipe\/2022\/01\/06\/versionado-semantico-semver\/#primaryimage"},"thumbnailUrl":"https:\/\/blogs.pacasmayo.com\/felipe\/files\/2022\/01\/image.png","datePublished":"2022-01-06T16:32:37+00:00","dateModified":"2022-03-16T14:04:23+00:00","description":"Mejores pr\u00e1cticas y ejemplos pr\u00e1cticos para usar SemVer en forma provechosa usando diferentes tecnolog\u00edas para crear aplicaciones modernas.","breadcrumb":{"@id":"https:\/\/blogs.pacasmayo.com\/felipe\/2022\/01\/06\/versionado-semantico-semver\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.pacasmayo.com\/felipe\/2022\/01\/06\/versionado-semantico-semver\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blogs.pacasmayo.com\/felipe\/2022\/01\/06\/versionado-semantico-semver\/#primaryimage","url":"https:\/\/blogs.pacasmayo.com\/felipe\/files\/2022\/01\/image.png","contentUrl":"https:\/\/blogs.pacasmayo.com\/felipe\/files\/2022\/01\/image.png","width":1500,"height":1000},{"@type":"BreadcrumbList","@id":"https:\/\/blogs.pacasmayo.com\/felipe\/2022\/01\/06\/versionado-semantico-semver\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/blogs.pacasmayo.com\/felipe\/"},{"@type":"ListItem","position":2,"name":"Versionado Sem\u00e1ntico &#8211; SemVer"}]},{"@type":"WebSite","@id":"https:\/\/blogs.pacasmayo.com\/felipe\/#website","url":"https:\/\/blogs.pacasmayo.com\/felipe\/","name":"El blog de Felipe","description":"De la abundancia del coraz\u00f3n...","publisher":{"@id":"https:\/\/blogs.pacasmayo.com\/felipe\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.pacasmayo.com\/felipe\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/blogs.pacasmayo.com\/felipe\/#organization","name":"El blog de Felipe","url":"https:\/\/blogs.pacasmayo.com\/felipe\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/blogs.pacasmayo.com\/felipe\/#\/schema\/logo\/image\/","url":"https:\/\/blogs.pacasmayo.com\/felipe\/files\/2019\/11\/cropped-caricatura_felipe.jpg","contentUrl":"https:\/\/blogs.pacasmayo.com\/felipe\/files\/2019\/11\/cropped-caricatura_felipe.jpg","width":1360,"height":598,"caption":"El blog de Felipe"},"image":{"@id":"https:\/\/blogs.pacasmayo.com\/felipe\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/blogs.pacasmayo.com\/felipe\/#\/schema\/person\/e32bfb69f0dcbed869e838474a34d240","name":"AI","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/4afeebd1deb1471ed6e7e21e6dc44176da2cb2ef0704b36e720ef8656e34bd65?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/4afeebd1deb1471ed6e7e21e6dc44176da2cb2ef0704b36e720ef8656e34bd65?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/4afeebd1deb1471ed6e7e21e6dc44176da2cb2ef0704b36e720ef8656e34bd65?s=96&d=mm&r=g","caption":"AI"},"description":"Este art\u00edculo ha sido seleccionado y parcialmente escrito e ilustrado por Inteligencia Artificial (AI) basado en noticias disponibles.","url":"https:\/\/blogs.pacasmayo.com\/felipe\/author\/ai\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.pacasmayo.com\/felipe\/wp-json\/wp\/v2\/posts\/9317","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.pacasmayo.com\/felipe\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.pacasmayo.com\/felipe\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.pacasmayo.com\/felipe\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.pacasmayo.com\/felipe\/wp-json\/wp\/v2\/comments?post=9317"}],"version-history":[{"count":12,"href":"https:\/\/blogs.pacasmayo.com\/felipe\/wp-json\/wp\/v2\/posts\/9317\/revisions"}],"predecessor-version":[{"id":9433,"href":"https:\/\/blogs.pacasmayo.com\/felipe\/wp-json\/wp\/v2\/posts\/9317\/revisions\/9433"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blogs.pacasmayo.com\/felipe\/wp-json\/wp\/v2\/media\/9318"}],"wp:attachment":[{"href":"https:\/\/blogs.pacasmayo.com\/felipe\/wp-json\/wp\/v2\/media?parent=9317"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.pacasmayo.com\/felipe\/wp-json\/wp\/v2\/categories?post=9317"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.pacasmayo.com\/felipe\/wp-json\/wp\/v2\/tags?post=9317"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}