AbasteceAqui
Grupo: Maxwell de Oliveira e Thiago Lima
Introdução
editarVisão Geral
editarEste documento está estruturado de forma a deixar claro o que e como será feito juntamente com os resultados da configuração proposta no projeto. Logo, este estará seccionado em:
- Introdução - Visão geral e definições de termos sobre o que será tratado no documento.
- Plano de Trabalho - Visão geral a cerca do plano de trabalho.
- Gerência de Configuração de Software - Descreve os papéis e responsabilidades e as ferramentas utilizadas.
- Como Iremos Contribuir - Descreve as formas de contribuição para o projeto.
Propósito
editarEste é um projeto para a disciplina Gerência de Configuração de Software (GCS). O objetivo principal é aplicar técnicas de GCS para melhorar o projeto AbasteceAqui. Este artigo apresenta o que será feito e como serão executadas as atividades do projeto.
Definições, Acrônimos e Abreviações
editar- GCS - Gerência e Configuração de Software.
- Integração Contínua (CI) - integrar continuamente o software produzido por uma ou mais equipes.
Repositórios no GitHub
editarRepositório original: https://github.com/fga-gpp-mds/2016.1-AbasteceAqui
Repositório Fork: https://github.com/MaxOliveira/2016.1-AbasteceAqui
Escopo
editar"O AbasteceAqui é um software que tem como intuito elucidar dados relativos a preços de combustíveis no Brasil. Esta solução esta sendo desenvolvida em plataforma Ruby on Rails."[1] Ele tem o objetivo de mostrar dados abertos sobre preços e postos de combustíveis no Brasil. Possibilita, de uma forma fácil e simples, que os usuários tenham acesso a esses dados e possam tomar decisões melhores a respeito do consumo de combustível. Seja em uma cidade, estado ou mesmo em uma viagem com a recomendação de onde abastecer em uma rota determinada pelo usuário. Aplicação de GCS no projeto:
- Integração contínua.
- Automatização do ambiente de desenvolvimento.
- Deploy automático.
Obs: A integração contínua foi iniciada no projeto AbasteceAqui em Métodos de Desenvolvimento de Software (MDS).
Plano de Trabalho
editarCronograma
editarMilestone | Sprint | Período | Atividade | Status |
---|---|---|---|---|
Planejamento | 1 | 29/09 | Análise da GCS no AbasteceAqui | Feito |
2 | 29/09 - 03/10 | Redigir Plano de GCS | Fazendo | |
Integração Contínua | 3 | 03/10 - 10/10 | Analisar a integração contínua atual do projeto | A fazer |
4 | 10/10 - 17/10 | Implementar melhorias se necessário | A fazer | |
Automatização do Ambiente
de Desenvolvimento |
5 | 17/10 - 24/10 | Pesquisar ferramentas | A fazer |
6 | 24/10 - 31/10 | Implementar a automatização | A fazer | |
Deploy Automático | 7 | 31/10 - 07/11 | Pesquisar ferramentas | A fazer |
8 | 07/10 - 14/11 | Implementar deploy automático | A fazer | |
Entrega Final | 9 | 14/11 - 21/11 | Entrega do Projeto Final | A fazer |
21/11~05/12 | Apresentação do Projeto | A fazer |
Gerência de Configuração de Software
editarPapeis e Responsabilidades
editarA equipe é formada pelos alunos Maxwell de Oliveira e Thiago Lima. Ambos farão os mesmos papéis, todos os papéis previstos para uma Gerência de Configuração de Software, como gerente de controle mudanças, gerente de configuração. Além disso, toda a equipe participará da elaboração do Plano de Gerência de Configuração de Software, configurar o ambiente de gerência de configuração, atualizar Wiki, entre outros.
Ferramentas, Ambiente e Infra-estrutura
editarGerência de Configuração | |
---|---|
Ferramenta | Descrição |
Git | Gerenciador de versões utilizada pela equipe de desenvolvimento. |
Github [2] | Source forge onde está presente o repositório do projeto, no qual contribuidores e interessados podem ver o código do software. |
Travis [3] | Serviço de integração contínua usado para gerar build e testes de software hospedado no GitHub. |
Ruby [4] | Linguagem de programação utilizada no desenvolvimento. |
Gem [5] | É o gerenciador de pacotes da linguagem do projeto, ruby. Facilita a instalação de dependências do software e resolução de dependência entre pacotes. |
Vagrant [6] | Possibilita a criação e configuração de um ambiente de produção em uma máquina virtual, no qual estará pronta para ser utilizada por um desenvolvedor. |
Chef [7] | Ferramenta para instalar todas as dependências necessárias para trabalhar com o projeto da linguagem, a fim de facilitar as contribuições ao mesmo. |
Como iremos contribuir
editarIntegração Contínua (CI)
editar“Integração Contínua é uma pratica de desenvolvimento de software onde os membros de um time integram seu trabalho frequentemente, geralmente cada pessoa integra pelo menos diariamente – podendo haver múltiplas integrações por dia."[8] Para nosso escopo, o sistema de integração contínua Tracis Ci[9] já está implementado e completamente funcional, portanto, a dupla focou em implementar a automatização do ambiente de desenvolvimento (utilizando Vagrant + VirtualBox + Chef) e o deploy automático (utilizando o Heroku).
Automatização do ambiente de desenvolvimento
editarPara a automatização do ambiente de desenvolvimento foram utilizadas as ferramentas Vagrant[10], trabalhando juntamente com o virtualbox[11] e a ferramenta Chef Solo[12] para baixar e instalar todas as dependências necessárias para a execução correta do projeto, e assim, facilita as contribuições de outros desenvolvedores para o mesmo.
Instalação e Configuração do Vagrant e VirtualBox
editarInstalação
editarO comando utilizado para baixar e instalar automaticamente a ferramenta Vagrant é:
$ sudo apt-get install vagrant
E o comando para a instalação do Virtualbox é:
$ sudo apt-get install virtualbox
Configurando o Vagrant
editar- VirtualBox é onde suas máquinas virtuais serão executadas. Serão executadas em background e podendo serem utilizadas através de SSH.
Dois plugins do Vagrant serão necessários:
- vagrant-vbguest: Instala automaticamente VirtualBox para host's e guest's.
- vagrant-librarian-chef: Permite executar o Chef automaticamente ao iniciar a máquina virtual.
Comando para a instalação do plugin vagrant-vbguest:
vagrant plugin install vagrant-vbguest
Comando para a instalação do plugin vagrant-librarian-chef:
vagrant plugin install vagrant-librarian-chef-nochef
A instalação pode demorar alguns minutos.
O Vagrant cria um arquivo de configuração chamado Vagrantfile onde contém todas as configurações necessárias para a sua execução, como por exemplo, o provider[13] que no caso será o VirtualBox e o provisioner[14].Toda a configuração do Vagrant é feita na linguagem Ruby, porém, não são necessários conhecimentos muito avançados a cerca da linguagem.
- A seguir o arquivo Vagrantfile criado para automatizar o ambiente do projeto AbasteceAqui:
VAGRANTFILE_API_VERSION = "2" Vagrant.configure(VAGRANTFILE_API_VERSION) do |config| config.vm.define "abasteceAquiVM" do |abasteceAquiVM| abasteceAquiVM.vm.box = "ubuntu/trusty64" end config.vm.network :forwarded_port, guest: 3000, host: 3000 config.vm.provider "virtualbox" do |v| v.customize ["modifyvm", :id, "--memory", "2048"] end config.vm.provision :chef_solo do |chef| chef.cookbooks_path = ["cookbooks"] chef.add_recipe "apt" chef.add_recipe "nodejs" chef.add_recipe "ruby_build" chef.add_recipe "vim" chef.add_recipe "rbenv::default" chef.add_recipe "heroku" end config.vm.provision "shell", path: "scripts.sh" end
- O trecho de código a seguir informa ao Vagrant qual distribuição linux será utilizada na máquina virtual, que no caso será o Ubuntu trusty 64:
config.vm.define "abasteceAquiVM" do |abasteceAquiVM| abasteceAquiVM.vm.box = "ubuntu/trusty64" end
- O trecho de código a seguir indica a porta a ser utilizada na execução do projeto, no caso será a porta 3000:
config.vm.network :forwarded_port, guest: 3000, host: 3000
- O treco de código a seguir informa ao Vagrant que o provider será o VirtualBox, e define que a quantidade de memória utiilizada pelo mesmo será de 2048Mb(2Gb):
config.vm.provider "virtualbox" do |v| v.customize ["modifyvm", :id, "--memory", "2048"] end
Instalando e Configurando o Chef
editarInstalação
editar- Para instalar o Chef basta executar os seguintes comandos[15]:
cd ~ curl -L https://www.opscode.com/chef/install.sh | bash
Configuração para o projeto AbasteceAqui
editar- O treho de código a seguir informa que o provisioning será feito pelo Chef, que irá instalar o Chef Solo e instalar as 6 receitas adicionadas:
config.vm.provision :chef_solo do |chef| chef.cookbooks_path = ["cookbooks"] chef.add_recipe "apt" chef.add_recipe "nodejs" chef.add_recipe "ruby_build" chef.add_recipe "vim" chef.add_recipe "rbenv::default" chef.add_recipe "heroku" end
- O arquivo de configuração do chef, o Cheffile, é onde indicamos quais os cookbooks em que adicionamos suas respectivas receitas anteriormente:
site "http://community.opscode.com/api/v1"
cookbook 'apt'
cookbook 'git'
cookbook 'build-essential'
cookbook 'ruby_build'
cookbook 'nodejs'
cookbook 'rbenv', '~> 1.7.1'
cookbook 'vim'
cookbook 'sudo', '~> 3.1.0'
cookbook 'heroku', '~> 0.1.0'
Os cookbooks estão, em sua maioria, no site chef supermarket[16], onde há todas as espeficicações e seu respectivo autor do cookbook.
- Tendo em vista que alguns cookbooks encontrados no chef supermarket estão desatualizados ou não estão funcionando, tivemos problemas com alguns cookbooks desatualizados, principalmente o do Ruby pois instala a versão 1.9.3 e a versão requerida para o projeto é uma versão >= 2.0. Sendo assim, uma solução foi utilizar comandos Shell Script para prover a instalação das dependências restantes. No Vagrantfile informamos que os scripts para a intalação está localizado no arquivo scripts.sh:
config.vm.provision "shell", path: "scripts.sh"
- Conteúdo do arquivo scripts.sh:
cd /vagrant rbenv install 2.3.1 rbenv global 2.3.1 gem install bundler gem install rails -v 4.2.6 rbenv rehash sudo -E apt-get install sqlite3 libsqlite3-dev bundle install
Subindo a Máquina Virtual com o Vagrant
editarDepois de feita todas as configurações necessárias, é necessário executar o Vagrant. Para isso se utiliza os seguintes comandos:
- Comando para iniciar o Vagrant:
vagrant up
Este comando irá executar todas as configurações feitas anteriormente, por este motivo, dependendo do computador utilizado pode demorar bastante.
- Após a execução, deve - se acessar a máquina virtual através do comando:
vagrant ssh
- Agora que está dentro da máquina virtual Ubuntu, devemos acessar a pasta do projeto AbasteceAqui:
cd /Vagrant/
- Tendo em vista que as Gems já foram instaladas com os comandos Shell Script indicado no Vagrantfile, não será necessário executar o bundle. Sendo assim, iremos para o seguinte comando:
rake db:migrate
- Para que as funcionalidades funcionem corretamente, é necessário fazer o parser dos dados:
rake parser:run
Como a carga de dados é muito grande, a execução pode demorar bastante.
- Feito isso, para executar o servidor deve-se utilizar o comando:
rails s -b 0.0.0.0
Isso vinculará o servidor à 0.0.0.0, possibilitando o acesso à todas as interfaces, ou seja, possibilita que possamos acessar o servidor através do navegador padrão.
- Por fim, como foi configurado no Vagrantfile que a porta utilizada seria a 300 (podendo ser qualquer porta que não esteja sendo utilizada), basta acessar o endereço https://localhost:3000 no navegador padrão para ter acesso ao sistema AbasteceAqui.
Deploy Automático
editarSerá estudada a melhor ferramenta a ser utilizada durante o andamento do projeto.
Pré-requisitos
editar- Uma conta no Heroku. Pode ser feita aqui https://signup.heroku.com/dc.
- Ruby 2.2.5 instalado localmente.
- Bundler instalado localmente.
gem bundler install
Depois disso é necessário instalar o Heroku Command Line Interface (CLI). No ubuntu e debian, isso pode ser feito com o comando abaixo:
wget -O- https://toolbelt.heroku.com/install-ubuntu.sh | sh
Configurando o ambiente
editarQuando terminar a instalação, vai ser possível utilizar os comandos do heroku. Como o login.
heroku login Enter your Heroku credentials. Email: emailHeroku@example.com Password:
Pode ser que seja necessário mudar a versão do rails que está sendo utilizada. Neste projeto, é utilizado o rails 4. Para instalar essa versão, pode ser usado o seguinte comando:
gem install rails -v 4.2.6 --no-ri --no-rdoc
No caso de precisar utilizar rails 5:
gem install rails --no-ri --no-rdoc
Como o projeto utilizava o sqlite3, foi necessário mudar a gem para pg. O heroku utiliza o banco de dados postgresql. Neste caso foi removida a seguinte gem:
gem 'sqlite3'
e foi adicionada esta gem:
gem 'pg'
Também é necessário acrescentar a seguinte gem:
gem 'rails_12factor', group: :production
Fazendo o deploy
editarAntes de fazer o deploy da aplicação, é preciso criar uma aplicação heroku:
heroku create
Para fazer o deploy:
git push heroku master
A aplicação pode ser acessada pela url fornecida pelo heroku, ou simplesmente inserindo o comando abaixo no terminal:
heroku open
Referências
editar- ↑ https://github.com/fga-gpp-mds/2016.1-AbasteceAqui/wiki
- ↑ https://github.com/
- ↑ https://travis-ci.org/
- ↑ https://www.ruby-lang.org/pt/about/
- ↑ https://rubygems.org/
- ↑ https://www.vagrantup.com/
- ↑ https://www.chef.io/chef/
- ↑ http://blog.caelum.com.br/integracao-continua/
- ↑ https://travis-ci.org/
- ↑ https://www.vagrantup.com/
- ↑ https://www.virtualbox.org/
- ↑ https://www.chef.io/chef/
- ↑ https://www.vagrantup.com/docs/providers/
- ↑ https://www.vagrantup.com/docs/provisioning/
- ↑ http://gettingstartedwithchef.com/first-steps-with-chef.html
- ↑ https://supermarket.chef.io/