Grupo: Maxwell de Oliveira e Thiago Lima

Introdução

editar

Visão Geral

editar

Este 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

editar

Este é 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

editar

Repositó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

editar

Cronograma

editar
Milestone 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

editar

Papeis e Responsabilidades

editar

A 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

editar
Gerê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

editar

Integraçã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

editar

Para 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

editar

Instalação

editar

O 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

editar

Instalaçã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

editar

Depois 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

editar

Será estudada a melhor ferramenta a ser utilizada durante o andamento do projeto.

Pré-requisitos

editar
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

editar

Quando 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

editar

Antes 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
  1. https://github.com/fga-gpp-mds/2016.1-AbasteceAqui/wiki
  2. https://github.com/
  3. https://travis-ci.org/
  4. https://www.ruby-lang.org/pt/about/
  5. https://rubygems.org/
  6. https://www.vagrantup.com/
  7. https://www.chef.io/chef/
  8. http://blog.caelum.com.br/integracao-continua/
  9. https://travis-ci.org/
  10. https://www.vagrantup.com/
  11. https://www.virtualbox.org/
  12. https://www.chef.io/chef/
  13. https://www.vagrantup.com/docs/providers/
  14. https://www.vagrantup.com/docs/provisioning/
  15. http://gettingstartedwithchef.com/first-steps-with-chef.html
  16. https://supermarket.chef.io/