{"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\/pt\/continuous-deployment-with-jenkins-and-net\/","title":{"rendered":"Implanta\u00e7\u00e3o cont\u00ednua com Jenkins e .NET"},"content":{"rendered":"<p>Esta \u00e9 a primeira de duas postagens do blog sobre Jenkins e Couchbase. Esta primeira postagem \u00e9 uma introdu\u00e7\u00e3o geral \u00e0 implanta\u00e7\u00e3o cont\u00ednua: <span style=\"font-weight: 400\">voc\u00ea aprender\u00e1 a usar<\/span> Jenkins para implantar um aplicativo .NET automaticamente. A segunda publica\u00e7\u00e3o do blog se concentrar\u00e1 mais em como usar o Jenkins para configurar dados de teste no Couchbase antes de executar seu c\u00f3digo de teste.<\/p>\n<p>Como desenvolvedor de .NET, voc\u00ea provavelmente est\u00e1 usando o Visual Studio. Pressionar F5 no Visual Studio compila o c\u00f3digo-fonte e inicia o depurador. Se voc\u00ea for como eu, pressionar\u00e1 F5 muitas vezes durante o desenvolvimento e a busca de bugs.<\/p>\n<p>Mas o que acontece quando o c\u00f3digo est\u00e1 pronto para o hor\u00e1rio nobre? A implanta\u00e7\u00e3o acontece!<\/p>\n<p>Quando preciso publicar um aplicativo, geralmente escolho a op\u00e7\u00e3o mais pregui\u00e7osa: copiar manualmente o execut\u00e1vel para o destino, instalar manualmente e iniciar manualmente o aplicativo.<\/p>\n<p>\u00c9 \"divertido\" nas primeiras vezes, mas, no final, torna-se muito dif\u00edcil, principalmente acompanhar as altera\u00e7\u00f5es e as atualiza\u00e7\u00f5es\/implanta\u00e7\u00f5es manuais. Para ser sincero, essa abordagem manual n\u00e3o \u00e9 muito bem dimensionada: leva tempo desnecess\u00e1rio e \u00e9 propensa a erros humanos no processo de implementa\u00e7\u00e3o.<\/p>\n<p>Uma op\u00e7\u00e3o mais madura seria ter uma infraestrutura automatizada para lidar com a implementa\u00e7\u00e3o. Essa infraestrutura \u00e9 geralmente chamada de integra\u00e7\u00e3o cont\u00ednua\/implanta\u00e7\u00e3o cont\u00ednua.<\/p>\n<p>O uso da integra\u00e7\u00e3o cont\u00ednua\/implanta\u00e7\u00e3o cont\u00ednua permite um fluxo de trabalho como este:<\/p>\n<ul>\n<li>Codifique, crie e teste localmente em sua caixa de desenvolvimento (como de costume)<\/li>\n<li>Verifique o c\u00f3digo-fonte em uma ramifica\u00e7\u00e3o de desenvolvimento no seu sistema de gerenciamento de controle de fontes favorito.<\/li>\n<li>Revis\u00e3o opcional do c\u00f3digo pelos membros da equipe.<\/li>\n<li>Fa\u00e7a o merge de suas altera\u00e7\u00f5es na ramifica\u00e7\u00e3o principal (vers\u00e3o).<\/li>\n<li>O servidor de CI detectar\u00e1 as altera\u00e7\u00f5es na ramifica\u00e7\u00e3o principal e far\u00e1 o download, compilar\u00e1 e implantar\u00e1\/instalar\u00e1 seu aplicativo no servidor de vers\u00e3o.<\/li>\n<\/ul>\n<p>N\u00e3o h\u00e1 etapas manuais: tudo \u00e9 roteirizado e autom\u00e1tico.<\/p>\n<h2 id=\"toc_3\">Implementa\u00e7\u00e3o cont\u00ednua<\/h2>\n<p>Voc\u00ea pode escolher entre v\u00e1rias ferramentas de integra\u00e7\u00e3o\/implanta\u00e7\u00e3o cont\u00ednua (CI), cada uma com suas pr\u00f3prias ressalvas. Na minha configura\u00e7\u00e3o, preciso de um servidor de CI que entenda os componentes do meu aplicativo.<\/p>\n<p>Ent\u00e3o, vamos dar uma olhada mais de perto na arquitetura e nos componentes do meu aplicativo:<\/p>\n<ul>\n<li><strong>Plataforma<\/strong>: .NET 4.5.2<\/li>\n<li><strong>IDE<\/strong>: Visual Studio 2015 (arquivos MSBuild)<\/li>\n<li><strong>Tipo de aplicativo<\/strong>: Servi\u00e7o do Windows<\/li>\n<li><strong>NuGet<\/strong>: Gerenciador de pacotes usado para todas as refer\u00eancias.<\/li>\n<li><strong>Controle de origem<\/strong>: Git (github.com)<\/li>\n<\/ul>\n<p>O servidor de CI deve ser capaz de compreender todos os componentes mencionados acima e (como sou pregui\u00e7oso) deve ser muito f\u00e1cil de manter e configurar.<\/p>\n<p>Pesquisei um pouco e, com base nas experi\u00eancias de outras pessoas e em publica\u00e7\u00f5es em blogs, descobri que \u00e9 melhor usar o Jenkins <span style=\"font-weight: 400\">para implantar um servi\u00e7o do Windows<\/span>.<\/p>\n<h3 id=\"toc_4\">Jenkins<\/h3>\n<p>O Jenkins \u00e9 um servidor de compila\u00e7\u00e3o com uma arquitetura de plug-in que permite que a comunidade amplie o que o Jenkins pode \"entender\". Essa arquitetura facilita a extens\u00e3o do Jenkins para suportar arquivos MSBuild, controle de vers\u00e3o Git etc.<\/p>\n<p><a href=\"https:\/\/wiki.jenkins-ci.org\/display\/JENKINS\/Meet+Jenkins\">Conhe\u00e7a Jenkins<\/a><\/p>\n<h3 id=\"toc_5\">Configura\u00e7\u00e3o<\/h3>\n<p>O Jenkins \u00e9 instalado em um servidor de compila\u00e7\u00e3o. Na minha configura\u00e7\u00e3o, o servidor de compila\u00e7\u00e3o \u00e9 o mesmo que o servidor de lan\u00e7amento, mas isso pode ser configurado de forma diferente.<\/p>\n<p><em>Fa\u00e7a o download e instale<\/em> Jenkins para sua plataforma aqui: https:\/\/jenkins-ci.org\/<\/p>\n<p>Ap\u00f3s a instala\u00e7\u00e3o, o Jenkins estar\u00e1 dispon\u00edvel em sua porta padr\u00e3o: <a href=\"https:\/\/localhost:8080\/\">https:\/\/localhost:8080\/<\/a><\/p>\n<h3 id=\"toc_6\">Configurar o Jenkins<\/h3>\n<p>O Jenkins tem plug-ins para entender reposit\u00f3rios Git, arquivos MSBuild e v\u00e1rias outras tecnologias. Na configura\u00e7\u00e3o atual, s\u00f3 precisamos estender o Jenkins com esses dois plug-ins.<\/p>\n<h4 id=\"toc_7\">Instale o plug-in do Git para o Jenkins:<\/h4>\n<ol>\n<li>Open Jenkins, <a href=\"https:\/\/localhost:8080\/\">https:\/\/localhost:8080\/<\/a><\/li>\n<li>Navegue at\u00e9 \"Gerenciar Jenkins\"<\/li>\n<li>Navegue at\u00e9 \"Manage Plugins\" (Gerenciar plug-ins)<em>Link direto: <a href=\"https:\/\/localhost:8080\/pluginManager\">https:\/\/localhost:8080\/pluginManager<\/a><\/em><\/li>\n<li>Use a caixa de \"filtro\" para pesquisar \"Git plugin\" e instalar o plugin.<\/li>\n<\/ol>\n<h4 id=\"toc_8\">Instale o plug-in MSBuild para Jenkins:<\/h4>\n<ol>\n<li>Open Jenkins, <a href=\"https:\/\/localhost:8080\/\">https:\/\/localhost:8080\/<\/a><\/li>\n<li>Navegue at\u00e9 \"Gerenciar Jenkins\"<\/li>\n<li>Navegue at\u00e9 \"Manage Plugins\" (Gerenciar plug-ins)<em>Link direto: <a href=\"https:\/\/localhost:8080\/pluginManager\">https:\/\/localhost:8080\/pluginManager<\/a><\/em><\/li>\n<li>Use a caixa de \"filtro\" para pesquisar \"MSBUILD plugin\" e instalar o 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\" \/>O Jenkins agora entende os arquivos do MSBuild e o controle de origem do Git, mas ainda precisamos configurar o plug-in do MSBuild com um caminho para o arquivo <code>msbuild.exe<\/code> que gostar\u00edamos de usar.<\/li>\n<\/ol>\n<h4 id=\"toc_9\">Configura\u00e7\u00e3o do MSBuild<\/h4>\n<p>Quando o plug-in MSBuild foi instalado, ele adicionou suas pr\u00f3prias op\u00e7\u00f5es de configura\u00e7\u00e3o \u00e0 p\u00e1gina de configura\u00e7\u00e3o global do Jenkins.<\/p>\n<ol>\n<li>Navegue at\u00e9 <a href=\"https:\/\/localhost:8080\/\">https:\/\/localhost:8080\/<\/a><\/li>\n<li>Clique em \"Manage Jenkins\" (Gerenciar Jenkins)<\/li>\n<li>Clique em \"Configure System\" (Configurar sistema)<\/li>\n<li>Role a lista para baixo at\u00e9 encontrar \"MSBuild\"<\/li>\n<li>Clique no bot\u00e3o \"MSBuild installations...\" (Instala\u00e7\u00f5es do MSBuild...)<\/li>\n<li>Clique em \"Add MSBuild\" (Adicionar MSBuild)<\/li>\n<li>D\u00ea \u00e0 nova configura\u00e7\u00e3o do MSBuild um nome como \"MSBuild-default\".<\/li>\n<li>No campo path (caminho), insira o caminho totalmente qualificado para <code>msbuild.exe<\/code>No meu servidor, o caminho \u00e9: <code>C:Arquivos de Programas (x86)MSBuild14.0Binmsbuild.exe<\/code>Leia abaixo para obter mais informa\u00e7\u00f5es sobre o MSBuild e como instal\u00e1-lo.<\/li>\n<li>Clique em salvar.<\/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\">Instala\u00e7\u00e3o do MSBuild<\/h4>\n<p>O MSBuild \u00e9 instalado com o Visual Studio, \u00e9 o sistema de compila\u00e7\u00e3o que o Visual Studio usa quando voc\u00ea seleciona \"build\" ou pressiona \"F5\".<\/p>\n<p>Nem sempre \u00e9 vi\u00e1vel ou mesmo poss\u00edvel instalar o Visual Studio em seu computador de compila\u00e7\u00e3o. Isso pode ocorrer devido a problemas de licen\u00e7a e seguran\u00e7a etc.<\/p>\n<p>Para acomodar isso, a Microsoft lan\u00e7ou um pacote separado chamado: \"Microsoft Build Tools 2015\", que cont\u00e9m tudo o que voc\u00ea precisa para usar o MSBuild.<\/p>\n<p><em>Download direto: <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>Ap\u00f3s a instala\u00e7\u00e3o bem-sucedida, voc\u00ea ter\u00e1 o MSBuild dispon\u00edvel no servidor de compila\u00e7\u00e3o e, com isso, obter\u00e1 o valor do caminho para a etapa 8, acima.<\/p>\n<p>Com essa etapa conclu\u00edda, o Jenkins est\u00e1 pronto para criar e implantar com o MSBuild e o Git.<\/p>\n<h3 id=\"toc_11\">Criar um novo projeto de compila\u00e7\u00e3o Jenkins<\/h3>\n<p>Agora \u00e9 hora de indicar a Jenkins o c\u00f3digo-fonte e come\u00e7ar a construir.<\/p>\n<ol>\n<li>Open Jenkins, <a href=\"https:\/\/localhost:8080\/\">https:\/\/localhost:8080\/<\/a><\/li>\n<li>Selecione \"novo\". Link direto <a href=\"https:\/\/localhost:8080\/view\/All\/newJob\">https:\/\/localhost:8080\/view\/All\/newJob<\/a><\/li>\n<li>D\u00ea ao projeto o nome \"Windows Service Deployment\" ou algo que voc\u00ea possa lembrar.<\/li>\n<li>Selecione \"Freestyle project\" (Projeto de estilo livre).<\/li>\n<li>Selecione \"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>Em seguida, expanda a regi\u00e3o \"Source Code Management\" selecionando \"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>Complete a configura\u00e7\u00e3o do Git preenchendo os espa\u00e7os em branco com um URL para o seu reposit\u00f3rio e, opcionalmente, com as credenciais (se necess\u00e1rio). Nesta configura\u00e7\u00e3o, deixarei a ramifica\u00e7\u00e3o como padr\u00e3o (Master), mas voc\u00ea pode selecionar o que for mais adequado \u00e0s suas necessidades. Se voc\u00ea ainda n\u00e3o tiver um reposit\u00f3rio Git pronto para teste, poder\u00e1 usar o reposit\u00f3rio pr\u00e9-preparado aqui:<a href=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\">https:\/\/github.com\/martinesmann\/jenkins-ci-template<\/a>O c\u00f3digo-fonte cont\u00e9m alguns arquivos a mais do que a solu\u00e7\u00e3o \"Hello Windows Service\" comum. Explicarei as partes relevantes mais adiante, \u00e0 medida que forem usadas. Por enquanto, trataremos isso apenas como uma solu\u00e7\u00e3o \"Hello World\".<\/li>\n<li>Se ainda n\u00e3o tiver feito isso, clique em \"Save\" (Salvar) para manter suas altera\u00e7\u00f5es e voltar \u00e0 p\u00e1gina principal do \"Project\" (Projeto).<\/li>\n<\/ol>\n<h4 id=\"toc_12\">Testar a configura\u00e7\u00e3o do Git<\/h4>\n<p>Agora podemos testar se a guia Git Source Management foi configurada corretamente e se podemos clonar o c\u00f3digo-fonte.<\/p>\n<p>Ainda n\u00e3o estamos construindo nada, apenas clonando a fonte. A compila\u00e7\u00e3o vir\u00e1 em breve. Primeiro, vamos nos certificar de que o Jenkins possa clonar a fonte do reposit\u00f3rio.<\/p>\n<ol>\n<li>Navegue at\u00e9 a p\u00e1gina \"Project\" (Projeto)<\/li>\n<li>Clique em \"Build Now\" para iniciar uma \"Build\".<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>Na regi\u00e3o \"Build History\" (Hist\u00f3rico de compila\u00e7\u00e3o), voc\u00ea dever\u00e1 ver uma compila\u00e7\u00e3o em andamento com o nome \"#1\".<\/li>\n<li>Se tudo for conclu\u00eddo como esperado, \"SUCCESS\" (Sucesso), o criador de bolhas permanecer\u00e1 azul; caso contr\u00e1rio, ficar\u00e1 vermelho.<\/li>\n<li>Para ver os detalhes da compila\u00e7\u00e3o, clique no n\u00famero da compila\u00e7\u00e3o \"#1\"<\/li>\n<li>Em seguida, clique em \"Console Output\" (Sa\u00edda do console). Voc\u00ea dever\u00e1 ver algo semelhante ao que tenho aqui:\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>*O que \u00e9 importante observar aqui \u00e9 a <strong>caminho<\/strong> para o \"espa\u00e7o de trabalho\", pois \u00e9 nele que o c\u00f3digo-fonte \u00e9 baixado e constru\u00eddo. Esse conhecimento pode ser muito \u00fatil ao depurar a configura\u00e7\u00e3o da CI.<\/li>\n<\/ol>\n<h4 id=\"toc_13\">Cria\u00e7\u00e3o do c\u00f3digo-fonte<\/h4>\n<p>A pr\u00f3xima etapa \u00e9 compilar e construir o c\u00f3digo-fonte.<\/p>\n<ol>\n<li>Navegue at\u00e9 a p\u00e1gina \"projeto\"<\/li>\n<li>Selecione \"Configure\" (Configurar)<\/li>\n<li>Localize a op\u00e7\u00e3o \"Adicionar etapa de compila\u00e7\u00e3o\"<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>Selecione a op\u00e7\u00e3o \"Build a Visual Studio project or solution using MSBuild\". Precisamos configurar alguns valores aqui:\n<ol>\n<li>Primeiro, selecione a vers\u00e3o do MSBuild (configuramos isso em uma etapa anterior).<\/li>\n<li>Em seguida, forne\u00e7a o caminho para o arquivo *.sln ou *.proj de seu projeto.<em>Para o reposit\u00f3rio pr\u00e9-cozido, o caminho \u00e9: <code>srcMyWindowsServiceMyWindowsServiceDeploy-Windows-Service-Via-MSBuild.proj<\/code><\/em><strong>Observe<\/strong>: <em>N\u00e3o estamos apontando para o arquivo de solu\u00e7\u00e3o, mas sim para um arquivo MSBuild personalizado que est\u00e1 no projeto. Esse arquivo MSBuild est\u00e1 lidando com todas as etapas envolvidas na compila\u00e7\u00e3o e na implementa\u00e7\u00e3o do servi\u00e7o do Windows.<\/em>Se estiver usando o reposit\u00f3rio pr\u00e9-preparado, sua configura\u00e7\u00e3o dever\u00e1 ser semelhante a esta:<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>Clique em salvar<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<h4 id=\"toc_14\">Restaura\u00e7\u00e3o do pacote NuGet<\/h4>\n<p>Se f\u00f4ssemos criar o projeto neste momento, ele falharia devido \u00e0 falta de pacotes NuGet. Portanto, precisamos restaurar os pacotes NuGet antes de tentar compilar a fonte.<\/p>\n<p><code>nuget.exe<\/code> torna essa tarefa muito f\u00e1cil, basta acionar esse comando no arquivo de solu\u00e7\u00e3o:<\/p>\n<p><code>nuget restore \"caminho para o arquivo *.sln<\/code><\/p>\n<p>N\u00e3o \u00e9 surpresa que o Jenkins possa lidar com v\u00e1rias etapas de compila\u00e7\u00e3o, ent\u00e3o vamos adicionar uma etapa de compila\u00e7\u00e3o para ativar a restaura\u00e7\u00e3o do NuGet.<\/p>\n<ol>\n<li>Navegue at\u00e9 a p\u00e1gina \"projeto\".<\/li>\n<li>Selecione \"Configure\" (Configurar).<\/li>\n<li>Localize a op\u00e7\u00e3o \"Adicionar etapa de compila\u00e7\u00e3o\".<\/li>\n<li>Clique em \"Add build step\" (Adicionar etapa de compila\u00e7\u00e3o).<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>Selecione \"Execute Windows batch command\" (Executar comando em lote do Windows).<\/li>\n<li>Reorganize a ordem de constru\u00e7\u00e3o arrastando a nova etapa de constru\u00e7\u00e3o para o topo.<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>No campo Comando, insira:<code>nuget restore srcMyWindowsService<\/code><\/li>\n<li>Clique em \"Salvar\".<\/li>\n<\/ol>\n<p>Agora estamos prontos para construir o projeto!<\/p>\n<h4 id=\"toc_15\">O teste final! Hor\u00e1rio nobre!<\/h4>\n<ol>\n<li>Navegue at\u00e9 a p\u00e1gina do projeto<\/li>\n<li>Clique no link \"Build now\" (Criar agora)<\/li>\n<li>Aguarde a conclus\u00e3o da compila\u00e7\u00e3o<\/li>\n<li>Abra o \"Windows Explorer\" e navegue at\u00e9 <code>C:<\/code><\/li>\n<li>Confirme se o arquivo \"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 o arquivo e leia o conte\u00fado do registro. Esse arquivo foi criado pelo nosso servi\u00e7o do Windows rec\u00e9m-instalado!<\/li>\n<li>Verifique se o servi\u00e7o est\u00e1 instalado e em execu\u00e7\u00e3o:\n<ol>\n<li>No Windows, abra a janela de gerenciamento \"Servi\u00e7os\"<\/li>\n<li>Role a tela para baixo at\u00e9 encontrar o servi\u00e7o \"My Windows Service (...)\"<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>Parab\u00e9ns!<\/em> Agora voc\u00ea configurou com sucesso o Jenkins para fazer download, compilar e implementar um servi\u00e7o Windows .NET! A automa\u00e7\u00e3o \u00e9 demais!<\/p>\n<h3 id=\"toc_16\">O c\u00f3digo-fonte:<\/h3>\n<p>At\u00e9 o momento, n\u00e3o demos muita aten\u00e7\u00e3o ao c\u00f3digo-fonte, mas vamos analisar o conte\u00fado e a estrutura do reposit\u00f3rio.<\/p>\n<p>Se voc\u00ea navegar at\u00e9 a raiz do reposit\u00f3rio em:<\/p>\n<p><a href=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\">https:\/\/github.com\/martinesmann\/jenkins-ci-template<\/a><\/p>\n<p>Voc\u00ea encontrar\u00e1 todos os arquivos usuais como README etc., mas tamb\u00e9m um arquivo chamado <code>nuget.exe<\/code>.<\/p>\n<p><code>nuget.exe<\/code> \u00e9 o execut\u00e1vel usado para restaurar as depend\u00eancias do pacote NuGet da solu\u00e7\u00e3o. Voc\u00ea poderia argumentar se \u00e9 ou n\u00e3o uma boa pr\u00e1tica ter arquivos bin\u00e1rios no seu controle de origem, mas, nesse caso, \u00e9 uma depend\u00eancia necess\u00e1ria para o sistema de compila\u00e7\u00e3o e, portanto, eu o inclu\u00ed.<\/p>\n<p>Eu coloquei <code>nuget.exe<\/code> na raiz, para mant\u00ea-lo separado do c\u00f3digo-fonte real e facilitar a localiza\u00e7\u00e3o ao configurar a compila\u00e7\u00e3o no Jenkins.<\/p>\n<p>Se navegarmos mais profundamente no reposit\u00f3rio para <a href=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/tree\/master\/src\/MyWindowsService\/MyWindowsService\">src\/MyWindowsService\/MyWindowsService\/<\/a> encontramos quatro arquivos que fazem todo o trabalho pesado de compila\u00e7\u00e3o e instala\u00e7\u00e3o do Windows Service.<\/p>\n<p>O arquivo do ponto de entrada principal \u00e9 <a href=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/blob\/master\/src\/MyWindowsService\/MyWindowsService\/MyWindowsService.csproj\">Implantar o Windows-Service via-MSBuild.proj<\/a> \u00e9 um arquivo MSBuild criado n\u00e3o apenas para compilar o c\u00f3digo-fonte, mas tamb\u00e9m para parar, desinstalar e iniciar o aplicativo Windows Service. Isso \u00e9 feito chamando os tr\u00eas arquivos em lote conforme necess\u00e1rio: <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> e <a href=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/blob\/master\/src\/MyWindowsService\/MyWindowsService\/safeServiceStop.bat\">safeServiceStop.bat<\/a>.<\/p>\n<p>Est\u00e1 fora do escopo desta postagem do blog explicar em detalhes o que cada um dos quatro arquivos faz, mas se voc\u00ea der uma olhada nos arquivos individualmente, tenho certeza de que ter\u00e1 uma boa compreens\u00e3o de seu funcionamento interno e de como eles colaboram.<\/p>\n<p>O c\u00f3digo-fonte do Windows Service pode ser visualizado e editado no Visual Studio para atender \u00e0s suas necessidades espec\u00edficas. O c\u00f3digo-fonte de amostra fornecido no reposit\u00f3rio \u00e9 muito simples e grava apenas algumas entradas em um arquivo de texto (arquivo de registro) e tamb\u00e9m \"insere\" um documento no Couchbase Server:<\/p>\n<p><a href=\"https:\/\/github.com\/martinesmann\/jenkins-ci-template\/blob\/master\/src\/MyWindowsService\/MyWindowsService\/Service1.cs\">Service1.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>Se voc\u00ea n\u00e3o tem experi\u00eancia com o Couchbase, sugiro que d\u00ea uma olhada no nosso tutorial de .NET aqui:<\/p>\n<p><a href=\"https:\/\/github.com\/couchbaselabs\/try-cb-dotnet\">try-cb-dotnet<\/a>.<\/p>\n<h3 id=\"toc_17\">Crie seu pr\u00f3prio<\/h3>\n<p>A maneira mais f\u00e1cil de<span style=\"font-weight: 400\"> usar o Jenkins e o .NET para criar e implantar <\/span>Seu pr\u00f3prio servi\u00e7o automatizado do Windows provavelmente seria clonar esse reposit\u00f3rio e alterar o c\u00f3digo do servi\u00e7o no Visual Studio para atender \u00e0s suas necessidades.<\/p>\n<p>Obrigado pela leitura!<\/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.0 (Yoast SEO v26.0) - 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\/pt\/continuous-deployment-with-jenkins-and-net\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\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\/pt\/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\":\"pt-BR\",\"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\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"pt-BR\",\"@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\/pt\/author\/martin-esmann\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Jenkins + .NET: Use MSBuild to Achieve Continuous Deployment","description":"Esta postagem se concentra em como usar o Jenkins para configurar dados de teste no Couchbase antes de executar seu c\u00f3digo de teste para integra\u00e7\u00e3o cont\u00ednua\/implanta\u00e7\u00e3o cont\u00ednua.","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\/pt\/continuous-deployment-with-jenkins-and-net\/","og_locale":"pt_BR","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\/pt\/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":"pt-BR","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":"Esta postagem se concentra em como usar o Jenkins para configurar dados de teste no Couchbase antes de executar seu c\u00f3digo de teste para integra\u00e7\u00e3o cont\u00ednua\/implanta\u00e7\u00e3o cont\u00ednua.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/continuous-deployment-with-jenkins-and-net\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@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":"Blog do Couchbase","description":"Couchbase, o banco de dados 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":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@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 dos desenvolvedores, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@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 \u00e9 um defensor do desenvolvedor .Net na Couchbase. Ele \u00e9 um desenvolvedor apaixonado com foco profundo em tecnologias Microsoft como .NET.","url":"https:\/\/www.couchbase.com\/blog\/pt\/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 \u00e9 um defensor do desenvolvedor .Net na Couchbase. Ele \u00e9 um desenvolvedor apaixonado com foco profundo em tecnologias Microsoft como .NET."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2113","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/54"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=2113"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2113\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=2113"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2113"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2113"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2113"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}