{"id":2113,"date":"2016-01-08T10:23:52","date_gmt":"2016-01-08T10:23:51","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2113"},"modified":"2025-06-13T15:56:24","modified_gmt":"2025-06-13T22:56:24","slug":"continuous-deployment-with-jenkins-and-net","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/continuous-deployment-with-jenkins-and-net\/","title":{"rendered":"Despliegue continuo con Jenkins y .NET"},"content":{"rendered":"<p>Este es el primer post de dos sobre Jenkins y Couchbase. Este primer post es una introducci\u00f3n general al Despliegue Continuo: <span style=\"font-weight: 400\">vas a aprender a usar<\/span> Jenkins para desplegar una aplicaci\u00f3n .NET autom\u00e1ticamente. La segunda entrada del blog se centrar\u00e1 m\u00e1s en c\u00f3mo utilizar Jenkins para configurar los datos de prueba en Couchbase antes de ejecutar el c\u00f3digo de prueba.<\/p>\n<p>Como desarrollador .NET es probable que utilices Visual Studio. Al pulsar F5 en Visual Studio se compila el c\u00f3digo fuente y se inicia el depurador. Si eres como yo, pulsar\u00e1s F5 muchas veces durante el desarrollo y la b\u00fasqueda de errores.<\/p>\n<p>Pero, \u00bfqu\u00e9 ocurre cuando el c\u00f3digo est\u00e1 listo? Se despliega.<\/p>\n<p>Cuando necesito publicar una aplicaci\u00f3n, suelo elegir la opci\u00f3n m\u00e1s perezosa: copiar manualmente el ejecutable en el destino, instalar manualmente e iniciar manualmente la aplicaci\u00f3n.<\/p>\n<p>Es \"divertido\" las primeras veces, pero al final se vuelve realmente dif\u00edcil; en particular, hacer un seguimiento de los cambios y las actualizaciones\/despliegues manuales. Para ser sinceros, este enfoque manual no funciona muy bien: lleva un tiempo innecesario y es propenso a errores humanos en el proceso de despliegue.<\/p>\n<p>Una opci\u00f3n m\u00e1s madura ser\u00eda disponer de una infraestructura automatizada para gestionar el despliegue. Este tipo de infraestructura suele denominarse integraci\u00f3n continua\/despliegue continuo.<\/p>\n<p>El uso de la Integraci\u00f3n Continua\/Despliegue Continuo, permite un flujo de trabajo como este:<\/p>\n<ul>\n<li>Codifique, compile y pruebe localmente en su equipo de desarrollo (como de costumbre).<\/li>\n<li>Compruebe el c\u00f3digo fuente en una rama de desarrollo en su sistema de gesti\u00f3n de control de c\u00f3digo fuente favorito.<\/li>\n<li>Revisi\u00f3n opcional del c\u00f3digo por los miembros del equipo.<\/li>\n<li>Fusione sus cambios en la rama principal (release).<\/li>\n<li>El servidor CI detectar\u00e1 los cambios en la rama principal y descargar\u00e1, compilar\u00e1 y desplegar\u00e1\/instalar\u00e1 su aplicaci\u00f3n en el servidor de publicaci\u00f3n.<\/li>\n<\/ul>\n<p>No hay pasos manuales: todo est\u00e1 programado y es autom\u00e1tico.<\/p>\n<h2 id=\"toc_3\">Despliegue continuo<\/h2>\n<p>Puedes elegir entre varias herramientas de Integraci\u00f3n\/Despliegue Continuo (CI), cada una con sus propias advertencias. En mi caso, necesito un servidor de integraci\u00f3n continua que entienda los componentes de mi aplicaci\u00f3n.<\/p>\n<p>Echemos un vistazo a la arquitectura y los componentes de mi aplicaci\u00f3n:<\/p>\n<ul>\n<li><strong>Plataforma<\/strong>.NET 4.5.2<\/li>\n<li><strong>IDE<\/strong>: Visual Studio 2015 (archivos MSBuild)<\/li>\n<li><strong>Tipo de aplicaci\u00f3n<\/strong>: Servicio Windows<\/li>\n<li><strong>NuGet<\/strong>: Gestor de paquetes utilizado para todas las referencias.<\/li>\n<li><strong>Control de las fuentes<\/strong>: Git (github.com)<\/li>\n<\/ul>\n<p>El servidor CI debe ser capaz de entender todos los componentes mencionados anteriormente y (como soy perezoso) debe ser realmente f\u00e1cil de mantener y configurar.<\/p>\n<p>Investigu\u00e9 un poco y, por las experiencias de otras personas y las entradas del blog, descubr\u00ed que lo mejor es utilizar Jenkins <span style=\"font-weight: 400\">desplegar un servicio Windows<\/span>.<\/p>\n<h3 id=\"toc_4\">Jenkins<\/h3>\n<p>Jenkins es un servidor de construcci\u00f3n con una arquitectura de plugins que permite a la comunidad ampliar lo que Jenkins puede \"entender\". Esta arquitectura facilita la ampliaci\u00f3n de Jenkins para que admita archivos MSBuild, control de versiones Git, etc.<\/p>\n<p><a href=\"https:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/Meet+Jenkins\">Conoce a Jenkins<\/a><\/p>\n<h3 id=\"toc_5\">Puesta en marcha<\/h3>\n<p>Jenkins est\u00e1 instalado en un servidor de compilaci\u00f3n. En mi configuraci\u00f3n, el servidor de compilaci\u00f3n es el mismo que el servidor de publicaci\u00f3n, pero puede configurarse de forma diferente.<\/p>\n<p><em>Descargar e instalar<\/em> Jenkins para su plataforma aqu\u00ed: https:\/\/jenkins-ci.org\/<\/p>\n<p>Tras la instalaci\u00f3n, Jenkins est\u00e1 disponible en su puerto por defecto: <a href=\"https:\/\/localhost:8080\/\">https:\/\/localhost:8080\/<\/a><\/p>\n<h3 id=\"toc_6\">Configurar Jenkins<\/h3>\n<p>Jenkins tiene plugins para entender repositorios Git, archivos MSBuild y varias otras tecnolog\u00edas. En la configuraci\u00f3n actual solo necesitamos ampliar Jenkins con esos dos plugins.<\/p>\n<h4 id=\"toc_7\">Instale el plugin Git para Jenkins:<\/h4>\n<ol>\n<li>Open Jenkins, <a href=\"https:\/\/localhost:8080\/\">https:\/\/localhost:8080\/<\/a><\/li>\n<li>Vaya a \"Gestionar Jenkins\".<\/li>\n<li>Vaya a \"Administrar plugins\".<em>Enlace directo: <a href=\"https:\/\/localhost:8080\/pluginManager\">https:\/\/localhost:8080\/pluginManager<\/a><\/em><\/li>\n<li>Utiliza la casilla \"filtro\" para buscar \"Git plugin\" e instalar el plugin.<\/li>\n<\/ol>\n<h4 id=\"toc_8\">Instale el plugin MSBuild para Jenkins:<\/h4>\n<ol>\n<li>Open Jenkins, <a href=\"https:\/\/localhost:8080\/\">https:\/\/localhost:8080\/<\/a><\/li>\n<li>Vaya a \"Gestionar Jenkins\".<\/li>\n<li>Vaya a \"Administrar plugins\".<em>Enlace directo: <a href=\"https:\/\/localhost:8080\/pluginManager\">https:\/\/localhost:8080\/pluginManager<\/a><\/em><\/li>\n<li>Utiliza la casilla \"filtro\" para buscar \"MSBUILD plugin\" e instalar el plugin.<img decoding=\"async\" src=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/raw\/master\/content\/images\/Screen%20Shot%202016-01-04%20at%2014.34.30.png\" alt=\"plugin screen\" \/>Jenkins ahora entiende los archivos MSBuild y el control de c\u00f3digo fuente Git, pero todav\u00eda tenemos que configurar el plugin MSBuild con una ruta al archivo <code>msbuild.exe<\/code> que nos gustar\u00eda utilizar.<\/li>\n<\/ol>\n<h4 id=\"toc_9\">Configuraci\u00f3n de MSBuild<\/h4>\n<p>Cuando se instal\u00f3 el plugin MSBuild, \u00e9ste a\u00f1adi\u00f3 sus propias opciones de configuraci\u00f3n a la p\u00e1gina de configuraci\u00f3n global de Jenkins.<\/p>\n<ol>\n<li>Vaya a <a href=\"https:\/\/localhost:8080\/\">https:\/\/localhost:8080\/<\/a><\/li>\n<li>Haga clic en \"Gestionar Jenkins\".<\/li>\n<li>Haga clic en \"Configurar sistema\".<\/li>\n<li>Despl\u00e1cese por la lista hasta encontrar \"MSBuild\".<\/li>\n<li>Haga clic en el bot\u00f3n \"Instalaciones MSBuild...\".<\/li>\n<li>Haga clic en \"A\u00f1adir MSBuild\".<\/li>\n<li>Dale a la nueva configuraci\u00f3n de MSBuild un nombre como \"MSBuild-default\".<\/li>\n<li>En el campo de ruta, introduzca la ruta completa a <code>msbuild.exe<\/code>En mi servidor la ruta es: <code>C:Archivos de programa (x86)MSBuild14.0Binmsbuild.exe<\/code>Lea m\u00e1s abajo para obtener m\u00e1s informaci\u00f3n sobre MSBuild y c\u00f3mo instalarlo.<\/li>\n<li>Haz clic en Guardar.<\/li>\n<\/ol>\n<p><img decoding=\"async\" src=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/raw\/master\/content\/images\/Screen%20Shot%202016-01-05%20at%2013.49.47.png\" alt=\"plugin screen\" \/><\/p>\n<h4 id=\"toc_10\">Instalaci\u00f3n de MSBuild<\/h4>\n<p>MSBuild se instala con Visual Studio, es el sistema de compilaci\u00f3n que utiliza Visual Studio cuando seleccionas \"compilar\" o pulsas \"F5\".<\/p>\n<p>No siempre es posible instalar Visual Studio en la m\u00e1quina de compilaci\u00f3n. Esto puede deberse a problemas de licencia, seguridad, etc.<\/p>\n<p>Para acomodar esto Microsoft ha lanzado un paquete separado llamado: \"Microsoft Build Tools 2015\" que contiene todo lo necesario para utilizar MSBuild.<\/p>\n<p><em>Descarga directa: <a href=\"https:\/\/www.microsoft.com\/en-us\/download\/details.aspx?id=48159\">https:\/\/www.microsoft.com\/en-us\/download\/details.aspx?id=48159<\/a><\/em><\/p>\n<p>Despu\u00e9s de la instalaci\u00f3n con \u00e9xito tiene MSBuild disponible en el servidor de compilaci\u00f3n y con eso se obtiene el valor de la ruta para el paso 8, arriba.<\/p>\n<p>Con este paso hecho Jenkins est\u00e1 listo para construir y desplegar con MSBuild y Git.<\/p>\n<h3 id=\"toc_11\">Crear un nuevo proyecto de compilaci\u00f3n Jenkins<\/h3>\n<p>Ahora es el momento de apuntar a Jenkins al c\u00f3digo fuente y empezar a construir.<\/p>\n<ol>\n<li>Open Jenkins, <a href=\"https:\/\/localhost:8080\/\">https:\/\/localhost:8080\/<\/a><\/li>\n<li>Enlace directo <a href=\"https:\/\/localhost:8080\/view\/All\/newJob\">https:\/\/localhost:8080\/view\/All\/newJob<\/a><\/li>\n<li>Dale al proyecto un nombre \"Windows Service Deployment\" o algo que puedas recordar.<\/li>\n<li>Selecciona \"Proyecto Freestyle\".<\/li>\n<li>Seleccione \"Ok\".<img decoding=\"async\" src=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/raw\/master\/content\/images\/Screen%20Shot%202016-01-04%20at%2014.41.38.png\" alt=\"plugin screen\" \/><\/li>\n<li>A continuaci\u00f3n, ampl\u00ede la regi\u00f3n \"Gesti\u00f3n del c\u00f3digo fuente\" seleccionando \"Git\".<img decoding=\"async\" src=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/raw\/master\/content\/images\/Screen%20Shot%202016-01-05%20at%2010.43.31.png\" alt=\"plugin screen\" \/><\/li>\n<li>Completa la configuraci\u00f3n de Git rellenando los espacios en blanco con una URL a tu repositorio y opcionalmente las credenciales (si son necesarias).Jenkins tambi\u00e9n puede trabajar con ramas. En esta configuraci\u00f3n dejar\u00e9 la rama por defecto (Master) pero puedes seleccionar la que se ajuste a tus necesidades.Si a\u00fan no tienes un repositorio Git listo para probar, puedes usar el repositorio precocinado aqu\u00ed:<a href=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\">https:\/\/github.com\/martinesmann\/jenkins-ci-template<\/a>El c\u00f3digo fuente contiene algunos archivos m\u00e1s que la soluci\u00f3n \"Hello Windows Service\" habitual. Voy a explicar las partes pertinentes m\u00e1s adelante, ya que se utilizan. Por ahora vamos a tratar esto como una soluci\u00f3n \"Hola Mundo\".<\/li>\n<li>Si a\u00fan no lo ha hecho, haga clic en \"Guardar\" para conservar los cambios y volver a la p\u00e1gina principal del \"Proyecto\".<\/li>\n<\/ol>\n<h4 id=\"toc_12\">Probar la configuraci\u00f3n de Git<\/h4>\n<p>Ahora podemos comprobar si la pesta\u00f1a Git Source Management se ha configurado correctamente y que podemos clonar el c\u00f3digo fuente.<\/p>\n<p>Todav\u00eda no estamos construyendo nada, s\u00f3lo clonando la fuente. La construcci\u00f3n vendr\u00e1 en un momento. Primero, asegur\u00e9monos de que Jenkins puede clonar el c\u00f3digo fuente desde el repositorio.<\/p>\n<ol>\n<li>Vaya a la p\u00e1gina \"Proyecto<\/li>\n<li>Haga clic en \"Construir ahora\" para iniciar una \"Construcci\u00f3n\".<img decoding=\"async\" src=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/raw\/master\/content\/images\/Screen%20Shot%202016-01-05%20at%2011.07.33.png\" alt=\"plugin screen\" \/><\/li>\n<li>En la regi\u00f3n \"Historial de construcciones\" deber\u00edas ver ahora una construcci\u00f3n en curso con el nombre \"#1\".<\/li>\n<li>Si todo se completa como se esperaba \"\u00c9XITO\" entonces el creador de burbujas permanece azul, si no se pone rojo.<\/li>\n<li>Para ver los detalles de la versi\u00f3n, haz clic en el n\u00famero de versi\u00f3n \"#1\".<\/li>\n<li>A continuaci\u00f3n, haga clic en \"Salida de la consola\". Usted debe ver algo similar a lo que tengo aqu\u00ed:\n<pre><code class=\"language-none\">Started by user anonymous\r\nBuilding in workspace C:Program Files (x86)JenkinsjobsWindows Service deploymentworkspace\r\nCloning the remote Git repository\r\nCloning repository https:\/\/github.com\/martinesmann\/jenkins-ci-template\r\n&gt; git.exe init C:Program Files (x86)JenkinsjobsWindows Service deploymentworkspace # timeout=10\r\nFetching upstream changes from https:\/\/github.com\/martinesmann\/jenkins-ci-template\r\n&gt; git.exe --version # timeout=10\r\n&gt; git.exe -c core.askpass=true fetch --tags --progress https:\/\/github.com\/martinesmann\/jenkins-ci-template +refs\/heads\/*:refs\/remotes\/origin\/*\r\n&gt; git.exe config remote.origin.url https:\/\/github.com\/martinesmann\/jenkins-ci-template # timeout=10\r\n&gt; git.exe config --add remote.origin.fetch +refs\/heads\/*:refs\/remotes\/origin\/* # timeout=10\r\n&gt; git.exe config remote.origin.url https:\/\/github.com\/martinesmann\/jenkins-ci-template # timeout=10\r\nFetching upstream changes from https:\/\/github.com\/martinesmann\/jenkins-ci-template\r\n&gt; git.exe -c core.askpass=true fetch --tags --progress https:\/\/github.com\/martinesmann\/jenkins-ci-template +refs\/heads\/*:refs\/remotes\/origin\/*\r\n&gt; git.exe rev-parse \"refs\/remotes\/origin\/master^{commit}\" # timeout=10\r\n&gt; git.exe rev-parse \"refs\/remotes\/origin\/origin\/master^{commit}\" # timeout=10\r\nChecking out Revision db11bee4586694774f21e9f38b57af8535c88e1e (refs\/remotes\/origin\/master)\r\n&gt; git.exe config core.sparsecheckout # timeout=10\r\n&gt; git.exe checkout -f db11bee4586694774f21e9f38b57af8535c88e1e\r\nFirst time build. Skipping changelog.\r\nFinished: SUCCESS<\/code><\/pre>\n<p>*Lo que es importante destacar aqu\u00ed es la <strong>ruta<\/strong> al \"espacio de trabajo\", ya que es aqu\u00ed donde se descarga el c\u00f3digo fuente y desde donde se construye. Este conocimiento puede ser muy \u00fatil a la hora de depurar la configuraci\u00f3n de CI.*<\/li>\n<\/ol>\n<h4 id=\"toc_13\">Construir la fuente<\/h4>\n<p>El siguiente paso es compilar y construir el c\u00f3digo fuente.<\/p>\n<ol>\n<li>Ir a la p\u00e1gina \"proyecto<\/li>\n<li>Seleccione \"Configurar\".<\/li>\n<li>Busque la opci\u00f3n \"A\u00f1adir paso de compilaci\u00f3n\"<img decoding=\"async\" src=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/raw\/master\/content\/images\/Screen%20Shot%202016-01-05%20at%2011.18.26.png\" alt=\"image\" \/><\/li>\n<li>Seleccione la opci\u00f3n \"Build a Visual Studio project or solution using MSBuild\".Necesitamos configurar algunos valores aqu\u00ed:\n<ol>\n<li>En primer lugar, seleccione la versi\u00f3n de MSBuild (la configuramos en un paso anterior).<\/li>\n<li>A continuaci\u00f3n, indique la ruta del archivo *.sln o *.proj de su proyecto.<em>Para el repositorio precocinado la ruta es: <code>srcMyWindowsServiceMyWindowsServiceDeploy-Windows-Service-Via-MSBuild.proj<\/code><\/em><strong>Atenci\u00f3n<\/strong>: <em>No estamos apuntando al archivo de la soluci\u00f3n, sino a un archivo MSBuild personalizado que se encuentra en el proyecto. Este archivo MSBuild est\u00e1 manejando todos los pasos involucrados con la compilaci\u00f3n y despliegue del servicio de Windows.<\/em>Si est\u00e1 utilizando el repositorio precocinado, su configuraci\u00f3n deber\u00eda tener este aspecto:<img decoding=\"async\" src=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/raw\/master\/content\/images\/Screen%20Shot%202016-01-05%20at%2011.50.26.png\" alt=\"image\" \/><\/li>\n<li>Haz clic en Guardar<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<h4 id=\"toc_14\">Restauraci\u00f3n de paquetes NuGet<\/h4>\n<p>Si tuvi\u00e9ramos que construir el proyecto en este momento fallar\u00eda debido a la falta de paquetes NuGet. Por lo tanto tenemos que restaurar los paquetes NuGet antes de intentar construir la fuente.<\/p>\n<p><code>nuget.exe<\/code> hace esta tarea muy f\u00e1cil, simplemente tenemos que disparar este comando en el archivo de la soluci\u00f3n:<\/p>\n<p><code>nuget restore \"ruta al archivo *.sln<\/code><\/p>\n<p>No sorprende que Jenkins pueda manejar m\u00faltiples pasos de compilaci\u00f3n, as\u00ed que agreguemos un paso de compilaci\u00f3n para habilitar la restauraci\u00f3n de NuGet.<\/p>\n<ol>\n<li>Vaya a la p\u00e1gina \"proyecto\".<\/li>\n<li>Seleccione \"Configurar\".<\/li>\n<li>Busque la opci\u00f3n \"A\u00f1adir paso de compilaci\u00f3n\".<\/li>\n<li>Haga clic en \"A\u00f1adir paso de compilaci\u00f3n\".<img decoding=\"async\" src=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/raw\/master\/content\/images\/Screen%20Shot%202016-01-05%20at%2021.42.13.png\" alt=\"image\" \/><\/li>\n<li>Seleccione \"Ejecutar comando por lotes de Windows\".<\/li>\n<li>Reorganice el orden de construcci\u00f3n arrastrando el nuevo paso de construcci\u00f3n a la parte superior.<img decoding=\"async\" src=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/raw\/master\/content\/images\/Screen%20Shot%202016-01-05%20at%2021.44.36.png\" alt=\"image\" \/><\/li>\n<li>En el campo Comando inserte:<code>nuget restore srcMiServicioWindows<\/code><\/li>\n<li>Haz clic en \"Guardar\".<\/li>\n<\/ol>\n<p>Ya estamos listos para construir el proyecto.<\/p>\n<h4 id=\"toc_15\">\u00a1La prueba final! \u00a1Primera hora!<\/h4>\n<ol>\n<li>Ir a la p\u00e1gina del proyecto<\/li>\n<li>Haga clic en el enlace \"Construir ahora<\/li>\n<li>Espere a que finalice la compilaci\u00f3n<\/li>\n<li>Abra el \"Explorador de Windows\" y vaya a <code>C:<\/code><\/li>\n<li>Confirme que el archivo \"MyWindowsService.log\" existe.<img decoding=\"async\" src=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/raw\/master\/content\/images\/Screen%20Shot%202016-01-05%20at%2022.22.09.png\" alt=\"image\" \/><\/li>\n<li>Abra el archivo y lea el contenido del registro. Este archivo ha sido creado por nuestro reci\u00e9n instalado servicio de Windows.<\/li>\n<li>Compruebe que el Servicio est\u00e1 instalado y en funcionamiento:\n<ol>\n<li>En Windows, abra la ventana de gesti\u00f3n \"Servicios<\/li>\n<li>Despl\u00e1cese hacia abajo hasta encontrar el servicio \"Mi servicio Windows (...)\"<img decoding=\"async\" src=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/raw\/master\/content\/images\/Screen%20Shot%202016-01-06%20at%2012.49.51.png\" alt=\"image\" \/><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><em>\u00a1Felicidades!<\/em> Ha configurado con \u00e9xito Jenkins para descargar, compilar y desplegar un servicio .NET Windows. \u00a1Automatizaci\u00f3n ROCKS!<\/p>\n<h3 id=\"toc_16\">El c\u00f3digo fuente:<\/h3>\n<p>Hasta ahora no hemos prestado mucha atenci\u00f3n al c\u00f3digo fuente, pero tom\u00e9monos un momento para recorrer el contenido y la estructura del repositorio.<\/p>\n<p>Si navega a la ra\u00edz del repositorio en:<\/p>\n<p><a href=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\">https:\/\/github.com\/martinesmann\/jenkins-ci-template<\/a><\/p>\n<p>encontrar\u00e1 todos los archivos habituales como README, etc., pero tambi\u00e9n un archivo llamado <code>nuget.exe<\/code>.<\/p>\n<p><code>nuget.exe<\/code> es el ejecutable utilizado para restaurar las dependencias de paquetes NuGet de la soluci\u00f3n. Se podr\u00eda discutir si es o no una buena pr\u00e1ctica tener archivos binarios en el control de c\u00f3digo fuente, pero en este caso es una dependencia necesaria para el sistema de construcci\u00f3n y por lo tanto lo he incluido.<\/p>\n<p>He colocado <code>nuget.exe<\/code> en la ra\u00edz, para mantenerlo separado del c\u00f3digo fuente real y que sea f\u00e1cil de encontrar al configurar la compilaci\u00f3n en Jenkins.<\/p>\n<p>Si navegamos m\u00e1s profundamente en el repositorio para <a href=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/tree\/master\/src\/MyWindowsService\/MyWindowsService\">src\/MyWindowsService\/MyWindowsService\/<\/a> encontramos cuatro archivos que hacen todo el trabajo duro de compilar e instalar el servicio de Windows.<\/p>\n<p>El archivo de entrada principal es <a href=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/blob\/master\/src\/MyWindowsService\/MyWindowsService\/MyWindowsService.csproj\">Despliegue-Windows-Service-Via-MSBuild.proj<\/a> es un archivo MSBuild construido para, no s\u00f3lo, compilar el c\u00f3digo fuente; sino tambi\u00e9n: detener, desinstalar e iniciar la aplicaci\u00f3n Windows Service. Esto se logra llamando a los tres archivos por lotes seg\u00fan sea necesario: <a href=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/blob\/master\/src\/MyWindowsService\/MyWindowsService\/safeServiceDelete.bat\">safeServiceDelete.bat<\/a>, <a href=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/blob\/master\/src\/MyWindowsService\/MyWindowsService\/safeServiceStart.bat\">safeServiceStart.bat<\/a> y <a href=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/blob\/master\/src\/MyWindowsService\/MyWindowsService\/safeServiceStop.bat\">safeServiceStop.bat<\/a>.<\/p>\n<p>Est\u00e1 fuera del alcance de esta entrada del blog explicar en detalle lo que hace cada uno de los cuatro archivos, pero si echa un vistazo a los archivos individualmente estoy seguro de que obtendr\u00e1 una muy buena comprensi\u00f3n de su funcionamiento interno y la forma en que colaboran.<\/p>\n<p>El c\u00f3digo fuente del servicio de Windows se puede ver y editar en Visual Studio para adaptarlo a tus necesidades espec\u00edficas. El c\u00f3digo fuente de ejemplo proporcionado en el repositorio es muy sencillo y s\u00f3lo escribe unas pocas entradas en un archivo de texto (archivo de registro) y tambi\u00e9n \"upserts\" un documento a Couchbase Server:<\/p>\n<p><a href=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/blob\/master\/src\/MyWindowsService\/MyWindowsService\/Service1.cs\">Servicio1.cs<\/a><\/p>\n<pre><code class=\"language-C#\">using System;\r\nusing System.Collections.Generic;\r\nusing System.IO;\r\nusing System.ServiceProcess;\r\nusing Couchbase;\r\nusing Couchbase.Configuration.Client;\r\n\r\nnamespace MyWindowsService\r\n{\r\n    public partial class Service1 : ServiceBase\r\n    {\r\n        bool firstRun;\r\n        public Service1()\r\n        {\r\n            InitializeComponent();\r\n        }\r\n\r\n        protected override void OnStart(string[] args)\r\n        {\r\n            firstRun = true;\r\n\r\n            Log(\r\n                LogToCouchbase(new List { \"OnStart:\", DateTime.Now.ToString() })\r\n            );\r\n        }\r\n\r\n        protected override void OnStop()\r\n        {\r\n            Log(\r\n                 LogToCouchbase(new List { \"OnStop:\", DateTime.Now.ToString() })\r\n             );\r\n        }\r\n\r\n        private List Log(List lines)\r\n        {\r\n            try\r\n            {\r\n                File.AppendAllLines(\"c:\\MyWindowsService.log.txt\", lines);\r\n            }\r\n            catch (Exception ex)\r\n            {\r\n                lines.AddRange(\r\n                    new[] {\r\n                        \"Excpetion:\",\r\n                        ex.Message,\r\n                        ex.StackTrace\r\n                    });\r\n            }\r\n\r\n            return lines;\r\n        }\r\n\r\n        private List LogToCouchbase(List lines)\r\n        {\r\n            try\r\n            {\r\n                if (firstRun)\r\n                {\r\n                    var config = new ClientConfiguration\r\n                    {\r\n                        Servers = new List { new Uri(\"https:\/\/10.0.0.4:8091\") }\r\n                    };\r\n\r\n                    ClusterHelper.Initialize(config);\r\n\r\n                    firstRun = false;\r\n                }\r\n\r\n                \/\/ this will overwrite any old log lines!\r\n                var result =\r\n                    ClusterHelper\r\n                    .GetBucket(\"default\")\r\n                    .Upsert(\r\n                        \"MyWindowsService.log.txt\",\r\n                        new\r\n                        {\r\n                            id = \"MyWindowsService.log.txt\",\r\n                            log = string.Join(\"n\", lines)\r\n                        }\r\n                    );\r\n\r\n                lines.AddRange(\r\n                new[] {\r\n                        \"Couchbase result: \",\r\n                        result.Success.ToString(),\r\n                        \"Document Key: \",\r\n                        \"MyWindowsService.log.txt\"\r\n                });\r\n            }\r\n            catch (Exception ex)\r\n            {\r\n                lines.AddRange(\r\n                new[] {\r\n                        \"Excpetion:\",\r\n                        ex.Message,\r\n                        ex.StackTrace\r\n                });\r\n            }\r\n\r\n            return lines;\r\n        }\r\n    }\r\n}<\/code><\/pre>\n<p>Si eres nuevo en Couchbase te sugiero que eches un vistazo a nuestro tutorial .NET aqu\u00ed:<\/p>\n<p><a href=\"https:\/\/github.com\/couchbaselabs\/try-cb-dotnet\">try-cb-dotnet<\/a>.<\/p>\n<h3 id=\"toc_17\">Cree su propio<\/h3>\n<p>La forma m\u00e1s f\u00e1cil de<span style=\"font-weight: 400\"> utilizar Jenkins y .NET para compilar y desplegar <\/span>Su propio servicio automatizado de Windows ser\u00eda probablemente clonar este repositorio y cambiar el c\u00f3digo del servicio en Visual Studio para adaptarlo a sus necesidades.<\/p>\n<p>Gracias por leerme.<\/p>","protected":false},"excerpt":{"rendered":"<p>This is the first blog post of two about Jenkins and Couchbase. This first post is a general introduction to Continuous Deployment: you\u2019re going to learn to use Jenkins to deploy a .NET application automatically. The second blog post will [&hellip;]<\/p>","protected":false},"author":54,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1811,1816],"tags":[1567,1565],"ppma_author":[9027],"class_list":["post-2113","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-couchbase-server","tag-continuous-deployment","tag-jenkins"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.2 (Yoast SEO v26.2) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Jenkins + .NET: Use MSBuild to Achieve Continuous Deployment<\/title>\n<meta name=\"description\" content=\"This post focuses on how to use Jenkins to set-up test data in Couchbase before running your test code for continuous integration\/continuous deployment.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/continuous-deployment-with-jenkins-and-net\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Continuous Deployment with Jenkins &amp; .NET\" \/>\n<meta property=\"og:description\" content=\"This post focuses on how to use Jenkins to set-up test data in Couchbase before running your test code for continuous integration\/continuous deployment.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/continuous-deployment-with-jenkins-and-net\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2016-01-08T10:23:51+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-13T22:56:24+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/raw\/master\/content\/images\/Screen%20Shot%202016-01-04%20at%2014.34.30.png\" \/>\n<meta name=\"author\" content=\"Martin Esmann, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Martin Esmann, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"12 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/\"},\"author\":{\"name\":\"Martin Esmann, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/2795ae2ee44b46479499d6fa514b7ee8\"},\"headline\":\"Continuous Deployment with Jenkins &amp; .NET\",\"datePublished\":\"2016-01-08T10:23:51+00:00\",\"dateModified\":\"2025-06-13T22:56:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/\"},\"wordCount\":1917,\"commentCount\":5,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"Continuous Deployment\",\"Jenkins\"],\"articleSection\":[\".NET\",\"Couchbase Server\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/\",\"name\":\"Jenkins + .NET: Use MSBuild to Achieve Continuous Deployment\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2016-01-08T10:23:51+00:00\",\"dateModified\":\"2025-06-13T22:56:24+00:00\",\"description\":\"This post focuses on how to use Jenkins to set-up test data in Couchbase before running your test code for continuous integration\/continuous deployment.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Continuous Deployment with Jenkins &amp; .NET\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/2795ae2ee44b46479499d6fa514b7ee8\",\"name\":\"Martin Esmann, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/af6bbf8de1ed87c78bfbc9ac7454a4fc\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/c8aea3b717146fd35e6b3c299ba8b331987c90cb1996f0141f0c6de29aa04c4b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/c8aea3b717146fd35e6b3c299ba8b331987c90cb1996f0141f0c6de29aa04c4b?s=96&d=mm&r=g\",\"caption\":\"Martin Esmann, Developer Advocate, Couchbase\"},\"description\":\"Martin Esmann is a .Net Developer Advocate at Couchbase. He is a passionate developer with a deep focus on Microsoft Technologies like .NET.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/martin-esmann\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Jenkins + .NET: Use MSBuild to Achieve Continuous Deployment","description":"Este post se centra en c\u00f3mo utilizar Jenkins para configurar los datos de prueba en Couchbase antes de ejecutar el c\u00f3digo de prueba para la integraci\u00f3n continua \/ despliegue continuo.","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:\/\/www.couchbase.com\/blog\/es\/continuous-deployment-with-jenkins-and-net\/","og_locale":"es_MX","og_type":"article","og_title":"Continuous Deployment with Jenkins &amp; .NET","og_description":"This post focuses on how to use Jenkins to set-up test data in Couchbase before running your test code for continuous integration\/continuous deployment.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/continuous-deployment-with-jenkins-and-net\/","og_site_name":"The Couchbase Blog","article_published_time":"2016-01-08T10:23:51+00:00","article_modified_time":"2025-06-13T22:56:24+00:00","og_image":[{"url":"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/raw\/master\/content\/images\/Screen%20Shot%202016-01-04%20at%2014.34.30.png","type":"","width":"","height":""}],"author":"Martin Esmann, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Martin Esmann, Developer Advocate, Couchbase","Est. reading time":"12 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/"},"author":{"name":"Martin Esmann, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/2795ae2ee44b46479499d6fa514b7ee8"},"headline":"Continuous Deployment with Jenkins &amp; .NET","datePublished":"2016-01-08T10:23:51+00:00","dateModified":"2025-06-13T22:56:24+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/"},"wordCount":1917,"commentCount":5,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["Continuous Deployment","Jenkins"],"articleSection":[".NET","Couchbase Server"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/","url":"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/","name":"Jenkins + .NET: Use MSBuild to Achieve Continuous Deployment","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2016-01-08T10:23:51+00:00","dateModified":"2025-06-13T22:56:24+00:00","description":"Este post se centra en c\u00f3mo utilizar Jenkins para configurar los datos de prueba en Couchbase antes de ejecutar el c\u00f3digo de prueba para la integraci\u00f3n continua \/ despliegue continuo.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Continuous Deployment with Jenkins &amp; .NET"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/2795ae2ee44b46479499d6fa514b7ee8","name":"Martin Esmann, Defensor del Desarrollador, Couchbase","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/af6bbf8de1ed87c78bfbc9ac7454a4fc","url":"https:\/\/secure.gravatar.com\/avatar\/c8aea3b717146fd35e6b3c299ba8b331987c90cb1996f0141f0c6de29aa04c4b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/c8aea3b717146fd35e6b3c299ba8b331987c90cb1996f0141f0c6de29aa04c4b?s=96&d=mm&r=g","caption":"Martin Esmann, Developer Advocate, Couchbase"},"description":"Martin Esmann es desarrollador de .Net en Couchbase. Es un desarrollador apasionado con un profundo enfoque en tecnolog\u00edas Microsoft como .NET.","url":"https:\/\/www.couchbase.com\/blog\/es\/author\/martin-esmann\/"}]}},"authors":[{"term_id":9027,"user_id":54,"is_guest":0,"slug":"martin-esmann","display_name":"Martin Esmann, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/c8aea3b717146fd35e6b3c299ba8b331987c90cb1996f0141f0c6de29aa04c4b?s=96&d=mm&r=g","author_category":"","last_name":"Esmann","first_name":"Martin","job_title":"","user_url":"","description":"Martin Esmann es desarrollador de .Net en Couchbase. Es un desarrollador apasionado con un profundo enfoque en tecnolog\u00edas Microsoft como .NET."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/54"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=2113"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2113\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=2113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=2113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=2113"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=2113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}