{"id":226,"date":"2015-12-15T11:34:12","date_gmt":"2015-12-15T13:34:12","guid":{"rendered":"https:\/\/blog.umbler.com\/?p=226"},"modified":"2018-12-06T11:34:25","modified_gmt":"2018-12-06T13:34:25","slug":"deploy-continuo-de-aplicacoes-laravel-5-na-umbler-utilizando-snap-ci","status":"publish","type":"post","link":"https:\/\/blog.umbler.com\/br\/deploy-continuo-de-aplicacoes-laravel-5-na-umbler-utilizando-snap-ci\/","title":{"rendered":"Deploy Cont\u00ednuo de Aplica\u00e7\u00f5es Laravel 5 na Umbler utilizando SNAP CI"},"content":{"rendered":"<blockquote><p>De acordo com<a href=\"https:\/\/martinfowler.com\/bliki\/ContinuousDelivery.html\" target=\"_blank\" rel=\"noopener\"> Martin Fowler<\/a>, entrega cont\u00ednua \u00e9 uma pr\u00e1tica de desenvolvimento na qual o software \u00e9 constru\u00eddo de um certo modo em que pode ser colocado em produ\u00e7\u00e3o a qualquer momento.<\/p><\/blockquote>\n<p>Basicamente, voc\u00ea deve ser capaz de colocar uma vers\u00e3o em produ\u00e7\u00e3o somente com um clique; a vers\u00e3o desejada vai passar por v\u00e1rias etapas de testes em um pipeline de implanta\u00e7\u00e3o, colocando a mesma em produ\u00e7\u00e3o caso passe com sucesso em todas as etapas.<\/p>\n<p>O deploy cont\u00ednuo \u00e9 um passo \u00e0 frente. Cada integra\u00e7\u00e3o de altera\u00e7\u00f5es no reposit\u00f3rio de c\u00f3digo fonte dispara um novo processo de deploy automaticamente, resultando em frequentes entregas de c\u00f3digo em produ\u00e7\u00e3o.<\/p>\n<p>Para exemplificar, vamos criar um pipeline de implanta\u00e7\u00e3o que \u00e9 disparado a cada <em>push<\/em> na <em>branch master<\/em> de nossa aplica\u00e7\u00e3o Laravel Somador hospedada no GitHub. Para executar os passos do deploy, e por fim publicar na<a href=\"https:\/\/www.umbler.com\" target=\"_blank\" rel=\"noopener\"> Umbler<\/a>, vamos utlizar o <a href=\"https:\/https:\/\/snap-ci.com\" target=\"_blank\" rel=\"noopener\">Snap CI<\/a>\u00a0, uma ferramenta de integra\u00e7\u00e3o cont\u00ednua <a href=\"https:\/\/en.wikipedia.org\/wiki\/Software_as_a_service\" target=\"_blank\" rel=\"noopener\">SaaS<\/a>\u00a0criada pela <a href=\"https:\/\/www.thoughtworks.com\/\" target=\"_blank\" rel=\"noopener\">Thoughtworks<\/a>\u00a0que se integra naturalmente com o GitHub.<br \/>\n<img fetchpriority=\"high\" decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/blog.umbler.com\/wp-content\/uploads\/2015\/12\/pipeline-history-ed50984c905f1b33f9ca55d2806a8ec9.jpg\" alt=\"Deploy Cont\u00ednuo de Aplica\u00e7\u00f5es na Umbler com SNAP-CI \" width=\"749\" height=\"276\" \/><br \/>\nNosso pipeline de implanta\u00e7\u00e3o vai consistir em quatro etapas:<\/p>\n<ul class=\"icon-ul ul-dashed\">\n<li><i class=\"icon icon-li icon-check\"><\/i> 1. Testes de unidade<\/li>\n<li><i class=\"icon icon-li icon-check\"><\/i> 2. Deploy em ambiente de homologa\u00e7\u00e3o<\/li>\n<li><i class=\"icon icon-li icon-check\"><\/i> 3. Testes de integra\u00e7\u00e3o<\/li>\n<li><i class=\"icon icon-li icon-check\"><\/i> 4. Deploy em produ\u00e7\u00e3o<\/li>\n<\/ul>\n<p>Para poder implementar estas etapas, n\u00f3s criamos dois <a href=\"https:\/\/www.Umbler.com\/br\/hospedagem-de-sites\" target=\"_blank\" rel=\"noopener\">sites compartilhados PHP na Umbler<\/a>, cada um com seu respectivo banco de dados: rc.phpnaumbler.com.br, que servir\u00e1 como ambiente de homologa\u00e7\u00e3o, e o phpnaumbler.com.br, que ser\u00e1 nosso ambiente de produ\u00e7\u00e3o. Como n\u00e3o temos dom\u00ednios registrados, os sites ser\u00e3o acessados atrav\u00e9s dos endere\u00e7os tempor\u00e1rios que a pr\u00f3pria Umbler fornece (meusite-com-br.umbler.net).<\/p>\n<p>O Laravel utiliza o arquivo <a href=\"https:\/\/github.com\/hebermattos\/somador\/blob\/master\/.env\" target=\"_blank\" rel=\"noopener\">.env<\/a>\u00a0para guardar as configura\u00e7\u00f5es de ambiente. Como voc\u00ea pode notar no nosso exemplo, as configura\u00e7\u00f5es de banco de dados e o nome do ambiente no arquivo versionado est\u00e3o com vari\u00e1veis. Estas ser\u00e3o substituidas por valores <a href=\"https:\/\/docs.snap-ci.com\/pipeline\/\" target=\"_blank\" rel=\"noopener\">configurados no pr\u00f3prio Snap CI<\/a>\u00a0para cada etapa atrav\u00e9s do script <a href=\"https:\/\/github.com\/hebermattos\/somador\/blob\/master\/alterar_variaveis.sh\" target=\"_blank\" rel=\"noopener\">alterar_variaveis.sh<\/a>.<\/p>\n<p>Nossa aplica\u00e7\u00e3o foi criada utlizando o<a href=\"https:\/\/laragon.org\/\" target=\"_blank\" rel=\"noopener\"> laragon<\/a>.<br \/>\n<img decoding=\"async\" class=\"aligncenter\" src=\"https:\/\/blog.umbler.com\/wp-content\/uploads\/2015\/12\/04-configure.png\" alt=\"Deploy Cont\u00ednuo na Umbler - Exemplo de configura\u00e7\u00e3o de etapa no Snap\" width=\"749\" height=\"375\" \/><\/p>\n<h2>Testes Unit\u00e1rios<\/h2>\n<p>A nossa primeira etapa \u00e9 a de\u00a0<a href=\"https:\/\/pt.wikipedia.org\/wiki\/Teste_de_unidade\" target=\"_blank\" rel=\"noopener\">testes unit\u00e1rios<\/a>,\u00a0porque esse processo \u00e9 o mais r\u00e1pido para se executar e de se conseguir um feedback. Testaremos a classe <a href=\"https:\/\/github.com\/hebermattos\/somador\/blob\/master\/app\/Src\/Somador.php\" target=\"_blank\" rel=\"noopener\">Somador<\/a>, que cont\u00e9m a regra de neg\u00f3cio de nossa aplica\u00e7\u00e3o e utilizaremos a classe <em><a href=\"https:\/\/github.com\/hebermattos\/somador\/blob\/master\/app\/Src\/BancoFake.php\" target=\"_blank\" rel=\"noopener\">BancoFake<\/a><\/em>\u00a0porque n\u00e3o queremos que \u00a0<a href=\"https:\/\/github.com\/hebermattos\/somador\/blob\/master\/tests\/somadorTest.php\" target=\"_blank\" rel=\"noopener\">nossos testes<\/a>\u00a0acessem o banco da dados (a integra\u00e7\u00e3o com o banco de dados ser\u00e1 testada mais \u00e0 frente). Note que a classe recebe uma interface no construtor (<a href=\"https:\/\/pt.wikipedia.org\/wiki\/Inje%C3%A7%C3%A3o_de_depend%C3%AAncia\" target=\"_blank\" rel=\"noopener\">Inje\u00e7\u00e3o de depend\u00eancia<\/a>), possibilitando assim a utiliza\u00e7\u00e3o de um <a href=\"https:\/\/martinfowler.com\/articles\/mocksArentStubs.html#TheDifferenceBetweenMocksAndStubs\" target=\"_blank\" rel=\"noopener\">dubl\u00ea de teste<\/a>. Para rodar os testes do PHP, o <a href=\"https:\/\/snap-ci.com\" target=\"_blank\" rel=\"noopener\">Snap CI<\/a>\u00a0nos disponibiliza o <a href=\"https:\/\/phpunit.de\/\" target=\"_blank\" rel=\"noopener\">PHPUnit<\/a>, bastando invoc\u00e1-lo na linha de comando apontando para phpunit.xml que <a href=\"https:\/\/laravel.com\/docs\/5.1\/testing\" target=\"_blank\" rel=\"noopener\">j\u00e1 vem configurado no laravel<\/a>:<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-markup\">$ phpunit --configuration phpunit.xml<\/code><\/pre>\n<h2>Deploy em Homologa\u00e7\u00e3o<\/h2>\n<p>Se os nossos testes unit\u00e1rios passarem, nosso pipeline prossegue para a pr\u00f3xima etapa. Nesta etapa precisamos configurar as <a href=\"https:\/\/docs.snap-ci.com\/pipeline\/\" target=\"_blank\" rel=\"noopener\">vari\u00e1veis de ambiente no Snap CI <\/a>\u00a0para que o nosso script, antes de publicar, altere o .env para os valores desejados. Para configurar o Git na Umbler \u00e9 s\u00f3 seguir <a href=\"https:\/\/help.Umbler.com\/hc\/pt-br\/articles\/205713329-Configurando-e-acessando-Git\" target=\"_blank\" rel=\"noopener\">estes passos<\/a> e <a href=\"https:\/\/docs.snap-ci.com\/getting-started\/ssh-keys\/\" target=\"_blank\" rel=\"noopener\">adicionar a chave privada do SSH gerada no Snap<\/a>. Com tudo configurado, podemos <a href=\"https:\/\/help.Umbler.com\/hc\/pt-br\/articles\/205713329-Configurando-e-acessando-Git\" target=\"_blank\" rel=\"noopener\">publicar na Umbler<\/a>\u00a0nossa vers\u00e3o de homologa\u00e7\u00e3o, e, ap\u00f3s publicar, rodamos outro script para arrumar a estrutura, pois a\u00a0<a href=\"https:\/\/laravel.com\/docs\/master\/structure\" target=\"_blank\" rel=\"noopener\">estrutura do laravel<\/a>\u00a0mant\u00e9m a maioria dos arquivos fora da pasta public.<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-markup\">$ ..\/alterar_variaveis.sh\r\n$ git remote add rcumbler ssh:\/\/rc.phpnaumbler.com.br@rc-phpnaumbler-com-br.umbler.net:9922\/~\/git\/rc-phpnaumbler-com-br.git\r\n$ git add .\r\n$ git commit -m \"deploy homologacao\"\r\n$ git push rcumbler master --force\r\n$ ssh rc.phpnaumbler.com.br@rc.phpnaumbler-com-br.umbler.net -p 9922 'bash -s' &lt; corrigir_caminho_laravel.sh<\/code><\/pre>\n<h2>Testes de Integra\u00e7\u00e3o<\/h2>\n<p>Com o nosso site publicado no ambiente de homologa\u00e7\u00e3o, podemos aplicar os nossos <a href=\"https:\/\/pt.wikipedia.org\/wiki\/Teste_de_integra%C3%A7%C3%A3o\" target=\"_blank\" rel=\"noopener\">testes de integra\u00e7\u00e3o<\/a>, que v\u00e3o testar nosso sistema de ponta a ponta. Para realizar estes testes vamos utilizar o <a href=\"https:\/\/phantomjs.org\/\" target=\"_blank\" rel=\"noopener\">PhantomJS<\/a>, que est\u00e1 dispon\u00edvel na linha de comando, assim como PHPUnit, bastando execut\u00e1-lo com o nosso <a href=\"https:\/\/github.com\/hebermattos\/somador\/blob\/master\/tests\/teste_integracao.js\" target=\"_blank\" rel=\"noopener\">arquivo javascript que cont\u00e9m os testes<\/a>. O PhantomJS \u00e9 um automatizador de browser que fornece uma API javascript para realizar os passos. O nosso teste consistir\u00e1 em digitar valores na inferface, clicar no bot\u00e3o do formul\u00e1rio e verificar o resultado na pr\u00f3xima p\u00e1gina:<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-markup\">$ phantomjs tests\/teste_integracao.js<\/code><\/pre>\n<h2>Deploy em Produ\u00e7\u00e3o<\/h2>\n<p>Por fim, podemos publicar em ambiente de produ\u00e7\u00e3o, com uma garantia de riscos <em>reduzidos<\/em>. O processo \u00e9 igual ao da segunda etapa, somente alterando as vari\u00e1veis de ambiente configuradas no Snap e os nossos endere\u00e7os de SSH para os dados de produ\u00e7\u00e3o:<\/p>\n<pre class=\"code-highlighter line-numbers theme-dark\"><code class=\"language-markup\">$ ..\/alterar_variaveis.sh\r\n$ git remote add rcumbler ssh:\/\/phpnaumbler.com.br@rc-phpnaumbler-com-br.umbler.net:9922\/~\/git\/rc-phpnaumbler-com-br.git\r\n$ git add .\r\n$ git commit -m \"deploy produ\u00e7\u00e3o\"\r\n$ git push rcumbler master --force\r\n$ ssh phpnaumbler.com.br@phpnaumbler-com-br.umbler.net -p 9922 'bash -s' &lt; corrigir_caminho_laravel.sh<\/code><\/pre>\n<h2>E depois?<\/h2>\n<p>Outras pr\u00e1ticas e ferramentas podem ser adotadas, variando muito da necessidade e gosto dos times:<\/p>\n<p>Notifica\u00e7\u00f5es: O pr\u00f3prio Snap se integra com <a href=\"https:\/\/docs.snap-ci.com\/notifications\/slack\/\" target=\"_blank\" rel=\"noopener\">algumas ferramentas<\/a>, como por exemplo o <a href=\"https:\/\/slack.com\/\" target=\"_blank\" rel=\"noopener\">Slack<\/a>. Voc\u00ea poderia disparar notifica\u00e7\u00f5es quando certos eventos, como por exemplo falhas no processo, ocorrerem.<\/p>\n<p>Testes de integra\u00e7\u00e3o: \u00e9 interessante limpar o banco de dados, ou mesmo garantir um certo conjunto de dados, antes de rodar testes que causam altera\u00e7\u00f5es, garantindo assim uma maior integridade na execu\u00e7\u00e3o.<\/p>\n<p>Testes manuais: obviamente, testes manuais n\u00e3o s\u00e3o poss\u00edveis. Para isso a Entrega Cont\u00ednua \u00e9 mais adequada. Na pr\u00e1tica, voc\u00ea poderia utilizar somente os tr\u00eas primeiros passos, deixando o deploy em produ\u00e7\u00e3o para outro momento.<br \/>\n<a href=\"https:\/\/app.umbler.com\/account\/login?utm_source=postlaravel&amp;utm_medium=banner&amp;utm_campaign=banner-post-laravel\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" class=\"aligncenter wp-image-1277 size-full\" src=\"https:\/\/blog.umbler.com\/wp-content\/uploads\/2015\/12\/cta-blog-laravel.png\" alt=\"Banner Deploy Laravel\" width=\"750\" height=\"325\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>De acordo com Martin Fowler, entrega cont\u00ednua \u00e9 uma pr\u00e1tica de desenvolvimento na qual o software \u00e9 constru\u00eddo de um certo modo em que pode ser colocado em produ\u00e7\u00e3o a qualquer momento. Basicamente, voc\u00ea deve ser capaz de colocar uma vers\u00e3o em produ\u00e7\u00e3o somente com um clique; a vers\u00e3o desejada vai passar por v\u00e1rias etapas [&hellip;]<\/p>\n","protected":false},"author":34,"featured_media":5675,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23],"tags":[28,24,25,29,30,31],"class_list":["post-226","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dev","tag-deploy-continuo","tag-git","tag-github","tag-laravel","tag-php","tag-snap-ci"],"_links":{"self":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/posts\/226"}],"collection":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/users\/34"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/comments?post=226"}],"version-history":[{"count":0,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/posts\/226\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/media\/5675"}],"wp:attachment":[{"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/media?parent=226"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/categories?post=226"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.umbler.com\/br\/wp-json\/wp\/v2\/tags?post=226"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}