{"id":3907,"date":"2017-09-05T07:00:02","date_gmt":"2017-09-05T14:00:02","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=3907"},"modified":"2023-06-08T13:38:35","modified_gmt":"2023-06-08T20:38:35","slug":"continuously-deploying-nodejs-application-circleci","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/continuously-deploying-nodejs-application-circleci\/","title":{"rendered":"Implanta\u00e7\u00e3o cont\u00ednua de um aplicativo Node.js usando o CircleCI"},"content":{"rendered":"<p>H\u00e1 alguns meses, escrevi sobre <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/create-continuous-deployment-pipeline-nodejs-jenkins\/\" target=\"_blank\" rel=\"noopener\">Cria\u00e7\u00e3o de um pipeline de implanta\u00e7\u00e3o cont\u00ednua com o Node.js e o Jenkins<\/a>onde o aplicativo Node.js estava usando <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/\" target=\"_blank\" rel=\"noopener\">Couchbase<\/a> de alguma forma. Essencialmente, ele pegava um projeto do GitHub, instalava as depend\u00eancias, executava os testes e, em seguida, executava o aplicativo em algum servidor, sendo que algum servidor era a mesma m\u00e1quina em que o Jenkins estava.<\/p>\n<p>O Jenkins \u00e9 \u00f3timo, mas d\u00e1 muito trabalho para ser configurado e continuar funcionando. Em vez disso, existem solu\u00e7\u00f5es hospedadas de integra\u00e7\u00e3o cont\u00ednua (CI) e implanta\u00e7\u00e3o cont\u00ednua (CD), como <a href=\"https:\/\/circleci.com\/\" target=\"_blank\" rel=\"noopener\">CircleCI<\/a>.<\/p>\n<p>Veremos como pegar um projeto Node.js que tem controle de vers\u00e3o no GitHub e implant\u00e1-lo continuamente em algum servidor remoto usando o CircleCI sempre que um push for feito.<\/p>\n<p><!--more--><\/p>\n<p>Antes de continuar, voc\u00ea j\u00e1 deve ter criado uma conta CircleCI, ter um servidor remoto dispon\u00edvel e ter um projeto Node.js dispon\u00edvel no GitHub.<\/p>\n<p>Neste exemplo, estou usando um Droplet que criei em <a href=\"https:\/\/m.do.co\/c\/ee4903914bb4\" target=\"_blank\" rel=\"noopener\">Oceano Digital<\/a> e o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/creating-user-profile-store-with-node-js-nosql-database\/\" target=\"_blank\" rel=\"noopener\">Projeto de armazenamento de perfil de usu\u00e1rio em Node.js<\/a> Eu j\u00e1 havia escrito sobre isso h\u00e1 algum tempo. Sinta-se \u00e0 vontade para usar o que quiser.<\/p>\n<h2>Preparando o servidor remoto para conex\u00f5es SSH<\/h2>\n<p>O objetivo da implanta\u00e7\u00e3o cont\u00ednua \u00e9 poder implantar automaticamente um projeto est\u00e1vel em seu servidor sem problemas.<\/p>\n<p>Ao usar o CircleCI, durante a etapa de implanta\u00e7\u00e3o, queremos que nosso projeto seja copiado depois que nosso fluxo de trabalho de teste for bem-sucedido. Isso pode acontecer por meio de um SCP ou de um Git Checkout com uma s\u00e9rie de comandos no servidor remoto. O que melhor atender \u00e0s suas necessidades.<\/p>\n<p>Como estamos usando o Node.js, \u00e9 melhor usar a \u00faltima op\u00e7\u00e3o porque precisaremos instalar depend\u00eancias e reiniciar o servi\u00e7o do Node.js. Isso \u00e9 um pouco mais profundo do que apenas copiar arquivos. Por esse motivo, precisaremos do CircleCI para podermos nos conectar \u00e0 nossa inst\u00e2ncia remota via SSH.<\/p>\n<p>A maneira mais segura de fazer isso \u00e9 criar uma chave privada SSH para o CircleCI. Em seu servidor, supondo que ele seja Linux, execute o seguinte:<\/p>\n<pre class=\"lang:default decode:true\">ssh-keygen -t rsa -C \"circleci\"<\/pre>\n<p>Voc\u00ea receber\u00e1 uma s\u00e9rie de perguntas sobre a chave. \u00c9 importante que essa chave SSH n\u00e3o contenha uma senha, pois o CircleCI n\u00e3o oferece suporte a senhas de chaves at\u00e9 o momento.<\/p>\n<p>Depois que a chave for gerada, execute o seguinte:<\/p>\n<pre class=\"lang:default decode:true\">cat ~\/.ssh\/id_rsa.pub &gt;&gt; ~\/.ssh\/authorized_keys<\/pre>\n<p>O comando acima pressup\u00f5e que voc\u00ea nomeou sua chave <strong>id_rsa<\/strong>. Ele anexar\u00e1 a chave p\u00fablica ao final do arquivo <strong>chaves_autorizadas<\/strong> arquivo.<\/p>\n<p>O conte\u00fado do <strong>id_rsa<\/strong> O arquivo de chave privada precisa ser copiado para o painel do CircleCI mais adiante neste guia.<\/p>\n<p>Antes de projetar o fluxo de trabalho, precisamos clonar o projeto do GitHub em nosso servidor. Veja o exemplo a seguir:<\/p>\n<pre class=\"lang:default decode:true\">git clone https:\/\/github.com\/my-example-project .\/profile-store<\/pre>\n<p>\u00c9 importante lembrar onde voc\u00ea clonou o projeto, pois ele ser\u00e1 usado pelo script de implanta\u00e7\u00e3o em nosso fluxo de trabalho. O CircleCI far\u00e1 o SSH em nosso servidor e executar\u00e1 um <code>git pull<\/code> dentro do diret\u00f3rio do projeto.<\/p>\n<h2>Projetando as etapas do fluxo de trabalho<\/h2>\n<p>Antes de o projeto ser coletado pelo CircleCI, ele precisa ser alterado um pouco no GitHub. O CircleCI, como muitas outras solu\u00e7\u00f5es de CI\/CD, exige que um arquivo de configura\u00e7\u00e3o seja colocado no projeto.<\/p>\n<p>Supondo que voc\u00ea esteja olhando para o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/creating-user-profile-store-with-node-js-nosql-database\/\" target=\"_blank\" rel=\"noopener\">projeto de loja de perfil de usu\u00e1rio<\/a>Precisamos criar um diret\u00f3rio chamado <strong>.circleci<\/strong> na raiz com um arquivo chamado <strong>config.yml<\/strong>.<\/p>\n<p>Abra este <strong>.circleci\/config.yml<\/strong> e adicione o seguinte:<\/p>\n<pre class=\"lang:default decode:true\">version: 2\r\njobs:\r\n    build:\r\n        docker:\r\n            - image: circleci\/node:7\r\n        steps:\r\n            - checkout\r\n            - run:\r\n                name: install-dependencies\r\n                command: npm install\r\n            - run:\r\n                name: tests\r\n                command: npm test\r\n            - deploy:\r\n                name: digital-ocean\r\n                command: ssh -o \"StrictHostKeyChecking no\" user@hostname \"cd ~\/profile-store; git pull; npm install; forever start app.js\"<\/pre>\n<p>Ent\u00e3o, o que est\u00e1 acontecendo na configura\u00e7\u00e3o acima?<\/p>\n<p>Estamos dizendo que queremos criar um cont\u00eainer do Docker executando o Node 7.x para realizar nossos testes e outros testes de fluxo de trabalho. Com rela\u00e7\u00e3o \u00e0s etapas, primeiro \u00e9 feito o check-out do projeto do GitHub no cont\u00eainer. Em seguida, instalamos todas as depend\u00eancias no projeto, pois elas n\u00e3o foram confirmadas no GitHub. A <strong>package.json<\/strong> do nosso projeto tem um script chamado <strong>teste<\/strong> que, em teoria, executaria nossos testes. Nosso projeto n\u00e3o tem nenhum teste real.<\/p>\n<p>Desde que as tr\u00eas etapas anteriores tenham sido bem-sucedidas, ser\u00e1 feita uma implanta\u00e7\u00e3o. Esse comando far\u00e1 o SSH em nosso servidor, navegar\u00e1 at\u00e9 o diret\u00f3rio de nossa escolha, far\u00e1 altera\u00e7\u00f5es no projeto, instalar\u00e1 quaisquer depend\u00eancias potencialmente novas e iniciar\u00e1 o <strong>para sempre<\/strong> processo.<\/p>\n<p>Podemos implantar nosso projeto por meio do SSH porque, neste ponto, temos certeza de que as etapas locais anteriores foram bem-sucedidas no cont\u00eainer.<\/p>\n<p>Fa\u00e7a o commit das altera\u00e7\u00f5es do projeto no GitHub para que possamos configurar o projeto no painel do CircleCI.<\/p>\n<h2>Configura\u00e7\u00e3o do projeto no painel de controle do CircleCI<\/h2>\n<p>Algumas coisas precisam ser configuradas no CircleCI para que o pipeline de CI\/CD funcione para o projeto. Em seu <a href=\"https:\/\/circleci.com\/projects\" target=\"_blank\" rel=\"noopener\">Painel de controle do CircleCI<\/a> encontre o projeto do GitHub que voc\u00ea deseja gerenciar. Se voc\u00ea tiver vinculado o GitHub ao CircleCI, h\u00e1 uma boa chance de que ele j\u00e1 apare\u00e7a devido \u00e0 adi\u00e7\u00e3o do arquivo de configura\u00e7\u00e3o.<\/p>\n<p>Nas configura\u00e7\u00f5es do projeto, localize a op\u00e7\u00e3o\u00a0<strong>Permiss\u00f5es de SSH<\/strong> se\u00e7\u00e3o.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-3910 size-full\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/08\/circle-ci-ssh-key.png\" alt=\"CircleCI SSH Permissions Example\" width=\"1100\" height=\"510\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/08\/circle-ci-ssh-key.png 1100w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/08\/circle-ci-ssh-key-300x139.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/08\/circle-ci-ssh-key-1024x475.png 1024w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/08\/circle-ci-ssh-key-768x356.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/08\/circle-ci-ssh-key-20x9.png 20w\" sizes=\"auto, (max-width: 1100px) 100vw, 1100px\" \/><\/p>\n<p>Copie a chave privada criada anteriormente para esta se\u00e7\u00e3o. Isso permitir\u00e1 que o CircleCI se conecte ao seu servidor para implanta\u00e7\u00e3o. Lembre-se, a partir de agora, a chave SSH deve ser sem senha.<\/p>\n<p>Nesse ponto, todos os futuros envios para o GitHub devem resultar no in\u00edcio do pipeline. Se tudo for aprovado, voc\u00ea poder\u00e1 acessar as altera\u00e7\u00f5es \u00e0 medida que elas ocorrem no seu servidor que executa o Node.js.<\/p>\n<h2>Onde est\u00e1 o benef\u00edcio do NoSQL?<\/h2>\n<p>Digamos que suas altera\u00e7\u00f5es de c\u00f3digo envolvam altera\u00e7\u00f5es no modelo de dados. Se voc\u00ea estivesse usando um RDBMS, provavelmente teria que enviar um script SQL com um monte de <code>ALTER<\/code> toda vez que voc\u00ea faz uma altera\u00e7\u00e3o. Embora seja poss\u00edvel, isso definitivamente n\u00e3o \u00e9 conveniente.<\/p>\n<p>Vamos ser um pouco mais espec\u00edficos aqui.<\/p>\n<p>Digamos que eu quisesse incluir informa\u00e7\u00f5es de endere\u00e7o em cada um dos meus perfis de usu\u00e1rio, algo que n\u00e3o estava sendo coletado anteriormente. Com o NoSQL e um modelo JSON flex\u00edvel, eu poderia simplesmente adicionar as informa\u00e7\u00f5es aos meus objetos JavaScript que est\u00e3o sendo salvos e concluir o salvamento. N\u00e3o h\u00e1 necessidade de criar nenhum script de migra\u00e7\u00e3o.<\/p>\n<h2>Conclus\u00e3o<\/h2>\n<p>Voc\u00ea acabou de ver como usar o CircleCI para a implanta\u00e7\u00e3o cont\u00ednua de um aplicativo da Web Node.js. Usamos um <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/user-profile-store-advanced-data-modeling\/\">armazenamento de perfil de usu\u00e1rio<\/a> aplicativo de um <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/creating-user-profile-store-with-node-js-nosql-database\/\" target=\"_blank\" rel=\"noopener\">exemplo anterior<\/a>e o implantou em um servidor via SSH sempre que novas altera\u00e7\u00f5es eram enviadas para o GitHub.<\/p>\n<p>H\u00e1 muitas solu\u00e7\u00f5es de integra\u00e7\u00e3o e implanta\u00e7\u00e3o cont\u00ednuas dispon\u00edveis. Se quiser hospedar sua pr\u00f3pria solu\u00e7\u00e3o, voc\u00ea pode conferir uma varia\u00e7\u00e3o deste tutorial que usa o Jenkins chamado,\u00a0<a href=\"https:\/\/www.couchbase.com\/blog\/pt\/create-continuous-deployment-pipeline-nodejs-jenkins\/\" target=\"_blank\" rel=\"noopener\">Criar um pipeline de implanta\u00e7\u00e3o cont\u00ednua com o Node.js e o Jenkins<\/a>.<\/p>","protected":false},"excerpt":{"rendered":"<p>A few months back I had written about creating a continuous deployment pipeline with Node.js and Jenkins, where the Node.js application was using Couchbase in some fashion. Essentially, it took a project from GitHub, installed the dependencies, ran the tests, [&hellip;]<\/p>","protected":false},"author":63,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,1822],"tags":[1919,2031,1567],"ppma_author":[9032],"class_list":["post-3907","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-node-js","tag-cd","tag-ci","tag-continuous-deployment"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Continuously Deploying a Node.js Application Using CircleCI<\/title>\n<meta name=\"description\" content=\"Learn how to continuously deploy your Node.js web application changes on GitHub to a remote web server via SSH with CircleCI.\" \/>\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\/continuously-deploying-nodejs-application-circleci\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Continuously Deploying a Node.js Application Using CircleCI\" \/>\n<meta property=\"og:description\" content=\"Learn how to continuously deploy your Node.js web application changes on GitHub to a remote web server via SSH with CircleCI.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/continuously-deploying-nodejs-application-circleci\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/thepolyglotdeveloper\" \/>\n<meta property=\"article:published_time\" content=\"2017-09-05T14:00:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-06-08T20:38:35+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/08\/circle-ci-ssh-key.png\" \/>\n<meta name=\"author\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@nraboy\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Nic Raboy, Developer Advocate, Couchbase\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/\"},\"author\":{\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1\"},\"headline\":\"Continuously Deploying a Node.js Application Using CircleCI\",\"datePublished\":\"2017-09-05T14:00:02+00:00\",\"dateModified\":\"2023-06-08T20:38:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/\"},\"wordCount\":1072,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"cd\",\"ci\",\"Continuous Deployment\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Node.js\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/\",\"name\":\"Continuously Deploying a Node.js Application Using CircleCI\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2017-09-05T14:00:02+00:00\",\"dateModified\":\"2023-06-08T20:38:35+00:00\",\"description\":\"Learn how to continuously deploy your Node.js web application changes on GitHub to a remote web server via SSH with CircleCI.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/#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\/continuously-deploying-nodejs-application-circleci\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Continuously Deploying a Node.js Application Using CircleCI\"}]},{\"@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\/bb545ebe83bb2d12f91095811d0a72e1\",\"name\":\"Nic Raboy, Developer Advocate, Couchbase\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g\",\"caption\":\"Nic Raboy, Developer Advocate, Couchbase\"},\"description\":\"Nic Raboy is an advocate of modern web and mobile development technologies. He has experience in Java, JavaScript, Golang and a variety of frameworks such as Angular, NativeScript, and Apache Cordova. Nic writes about his development experiences related to making web and mobile development easier to understand.\",\"sameAs\":[\"https:\/\/www.thepolyglotdeveloper.com\",\"https:\/\/www.facebook.com\/thepolyglotdeveloper\",\"https:\/\/x.com\/nraboy\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/nic-raboy-2\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Implanta\u00e7\u00e3o cont\u00ednua de um aplicativo Node.js usando o CircleCI","description":"Saiba como implantar continuamente as altera\u00e7\u00f5es de seu aplicativo da Web Node.js no GitHub em um servidor da Web remoto via SSH com o CircleCI.","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\/continuously-deploying-nodejs-application-circleci\/","og_locale":"pt_BR","og_type":"article","og_title":"Continuously Deploying a Node.js Application Using CircleCI","og_description":"Learn how to continuously deploy your Node.js web application changes on GitHub to a remote web server via SSH with CircleCI.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/continuously-deploying-nodejs-application-circleci\/","og_site_name":"The Couchbase Blog","article_author":"https:\/\/www.facebook.com\/thepolyglotdeveloper","article_published_time":"2017-09-05T14:00:02+00:00","article_modified_time":"2023-06-08T20:38:35+00:00","og_image":[{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/08\/circle-ci-ssh-key.png","type":"","width":"","height":""}],"author":"Nic Raboy, Developer Advocate, Couchbase","twitter_card":"summary_large_image","twitter_creator":"@nraboy","twitter_misc":{"Written by":"Nic Raboy, Developer Advocate, Couchbase","Est. reading time":"5 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/"},"author":{"name":"Nic Raboy, Developer Advocate, Couchbase","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/bb545ebe83bb2d12f91095811d0a72e1"},"headline":"Continuously Deploying a Node.js Application Using CircleCI","datePublished":"2017-09-05T14:00:02+00:00","dateModified":"2023-06-08T20:38:35+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/"},"wordCount":1072,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["cd","ci","Continuous Deployment"],"articleSection":["Best Practices and Tutorials","Node.js"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/","url":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/","name":"Implanta\u00e7\u00e3o cont\u00ednua de um aplicativo Node.js usando o CircleCI","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2017-09-05T14:00:02+00:00","dateModified":"2023-06-08T20:38:35+00:00","description":"Saiba como implantar continuamente as altera\u00e7\u00f5es de seu aplicativo da Web Node.js no GitHub em um servidor da Web remoto via SSH com o CircleCI.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/continuously-deploying-nodejs-application-circleci\/#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\/continuously-deploying-nodejs-application-circleci\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Continuously Deploying a Node.js Application Using CircleCI"}]},{"@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\/bb545ebe83bb2d12f91095811d0a72e1","name":"Nic Raboy, defensor dos desenvolvedores, Couchbase","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/8863514d8bed0cf6080f23db40e00354","url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","caption":"Nic Raboy, Developer Advocate, Couchbase"},"description":"Nic Raboy \u00e9 um defensor das modernas tecnologias de desenvolvimento m\u00f3vel e da Web. Ele tem experi\u00eancia em Java, JavaScript, Golang e uma variedade de estruturas, como Angular, NativeScript e Apache Cordova. Nic escreve sobre suas experi\u00eancias de desenvolvimento relacionadas a tornar o desenvolvimento m\u00f3vel e da Web mais f\u00e1cil de entender.","sameAs":["https:\/\/www.thepolyglotdeveloper.com","https:\/\/www.facebook.com\/thepolyglotdeveloper","https:\/\/x.com\/nraboy"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/nic-raboy-2\/"}]}},"authors":[{"term_id":9032,"user_id":63,"is_guest":0,"slug":"nic-raboy-2","display_name":"Nic Raboy, Developer Advocate, Couchbase","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/bedeb68368d4681aca4c74fe5f697f0c423b80d498ec50fd915ba018b72c101f?s=96&d=mm&r=g","author_category":"","last_name":"Raboy","first_name":"Nic","job_title":"","user_url":"https:\/\/www.thepolyglotdeveloper.com","description":"Nic Raboy \u00e9 um defensor das modernas tecnologias de desenvolvimento m\u00f3vel e da Web. Ele tem experi\u00eancia em Java, JavaScript, Golang e uma variedade de estruturas, como Angular, NativeScript e Apache Cordova. Nic escreve sobre suas experi\u00eancias de desenvolvimento relacionadas a tornar o desenvolvimento m\u00f3vel e da Web mais f\u00e1cil de entender."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/3907","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\/63"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=3907"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/3907\/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=3907"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=3907"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=3907"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=3907"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}