{"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":"
De acordo com 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
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
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
Para exemplificar, vamos criar um pipeline de implanta\u00e7\u00e3o que \u00e9 disparado a cada push<\/em> na branch master<\/em> de nossa aplica\u00e7\u00e3o Laravel Somador hospedada no GitHub. Para executar os passos do deploy, e por fim publicar na Umbler<\/a>, vamos utlizar o Snap CI<\/a>\u00a0, uma ferramenta de integra\u00e7\u00e3o cont\u00ednua SaaS<\/a>\u00a0criada pela Thoughtworks<\/a>\u00a0que se integra naturalmente com o GitHub.
\n
\nNosso pipeline de implanta\u00e7\u00e3o vai consistir em quatro etapas:<\/p>\n\n
- <\/i> 1. Testes de unidade<\/li>\n
- <\/i> 2. Deploy em ambiente de homologa\u00e7\u00e3o<\/li>\n
- <\/i> 3. Testes de integra\u00e7\u00e3o<\/li>\n
- <\/i> 4. Deploy em produ\u00e7\u00e3o<\/li>\n<\/ul>\n
Para poder implementar estas etapas, n\u00f3s criamos dois 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
O Laravel utiliza o arquivo .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 configurados no pr\u00f3prio Snap CI<\/a>\u00a0para cada etapa atrav\u00e9s do script alterar_variaveis.sh<\/a>.<\/p>\n
Nossa aplica\u00e7\u00e3o foi criada utlizando o laragon<\/a>.
\n<\/p>\nTestes Unit\u00e1rios<\/h2>\n
A nossa primeira etapa \u00e9 a de\u00a0testes unit\u00e1rios<\/a>,\u00a0porque esse processo \u00e9 o mais r\u00e1pido para se executar e de se conseguir um feedback. Testaremos a classe Somador<\/a>, que cont\u00e9m a regra de neg\u00f3cio de nossa aplica\u00e7\u00e3o e utilizaremos a classe BancoFake<\/a><\/em>\u00a0porque n\u00e3o queremos que \u00a0nossos 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 (Inje\u00e7\u00e3o de depend\u00eancia<\/a>), possibilitando assim a utiliza\u00e7\u00e3o de um dubl\u00ea de teste<\/a>. Para rodar os testes do PHP, o Snap CI<\/a>\u00a0nos disponibiliza o PHPUnit<\/a>, bastando invoc\u00e1-lo na linha de comando apontando para phpunit.xml que j\u00e1 vem configurado no laravel<\/a>:<\/p>\n
$ phpunit --configuration phpunit.xml<\/code><\/pre>\n
Deploy em Homologa\u00e7\u00e3o<\/h2>\n
Se os nossos testes unit\u00e1rios passarem, nosso pipeline prossegue para a pr\u00f3xima etapa. Nesta etapa precisamos configurar as 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 estes passos<\/a> e adicionar a chave privada do SSH gerada no Snap<\/a>. Com tudo configurado, podemos publicar na Umbler<\/a>\u00a0nossa vers\u00e3o de homologa\u00e7\u00e3o, e, ap\u00f3s publicar, rodamos outro script para arrumar a estrutura, pois a\u00a0estrutura do laravel<\/a>\u00a0mant\u00e9m a maioria dos arquivos fora da pasta public.<\/p>\n
$ ..\/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' < corrigir_caminho_laravel.sh<\/code><\/pre>\n
Testes de Integra\u00e7\u00e3o<\/h2>\n
Com o nosso site publicado no ambiente de homologa\u00e7\u00e3o, podemos aplicar os nossos testes de integra\u00e7\u00e3o<\/a>, que v\u00e3o testar nosso sistema de ponta a ponta. Para realizar estes testes vamos utilizar o PhantomJS<\/a>, que est\u00e1 dispon\u00edvel na linha de comando, assim como PHPUnit, bastando execut\u00e1-lo com o nosso 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
$ phantomjs tests\/teste_integracao.js<\/code><\/pre>\n
Deploy em Produ\u00e7\u00e3o<\/h2>\n
Por fim, podemos publicar em ambiente de produ\u00e7\u00e3o, com uma garantia de riscos 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
$ ..\/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' < corrigir_caminho_laravel.sh<\/code><\/pre>\n
E depois?<\/h2>\n
Outras pr\u00e1ticas e ferramentas podem ser adotadas, variando muito da necessidade e gosto dos times:<\/p>\n
Notifica\u00e7\u00f5es: O pr\u00f3prio Snap se integra com algumas ferramentas<\/a>, como por exemplo o Slack<\/a>. Voc\u00ea poderia disparar notifica\u00e7\u00f5es quando certos eventos, como por exemplo falhas no processo, ocorrerem.<\/p>\n
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
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.
\n<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"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 […]<\/p>\n","protected":false},"author":34,"featured_media":5675,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[23],"tags":[28,24,25,29,30,31],"_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}]}}