Introdução

editar

Finalidade

editar

Este documento tem como objetivo mostrar a aplicação de alguns dos pontos abordados na Gerência de Configuração em um ambiente de desenvolvimento real, com o objetivo de ampliar a maturidade do projeto AvaliaMais e controlar as mudanças de uma maneira mais organizada e automatizada.

Escopo

editar

A ideia do projeto é melhorar a Gerência de Configuração do projeto AvaliaMais e como foi feito as pressas devido as deadlines da disciplina de MDS, essa GCS não foi aplicada corretamente e tem trazido problemas para o avanço do mesmo. Assim, os objetivos são categorizados abaixo.

  • Integração Contínua
  • Deploy Automatizado
  • Ambiente de desenvolvimento

Visão Geral

editar

O projeto AvaliaMais foi desenvolvido na disciplina de Métodos de Desenvolvimento de Software e utiliza dados abertos do Consumidor.gov e tem como objetivo possibilitar a avaliação sobre os serviços das empresas cadastradas no sistema.

Link do repositório AvaliaMais/GCS

Link do repositório oficial do Projeto GitHub

Acrônomos e Abreviações do Projeto

editar
Sigla Significado
GCS Gerência de Configuração de Sofware
IC Integração Contínua
MDS Métodos de Desenvolvimento de Software

Gerenciamento e Configuração do Projeto

editar

Organização, Responsabilidades e Interfaces

editar

Visando realizar a gerência de configuração no projeto, foram adicionadas alguns papéis dentro do escopo da disciplina, realizados pela presente dupla.

Papel Nome Responsabilidade
Gerente de Configuração Gesiel Freitas Realizar o acompanhamento e configuração do ambiente de desenvolvimento aplicando características de GCS para aumentar a produtividade e confiabilidade do projeto.
Gerente de Configuração Vitor Borges Realizar o acompanhamento e configuração do ambiente de desenvolvimento aplicando características de GCS para aumentar a produtividade e confiabilidade do projeto.
Auditor de Gerenciamento e configuração de Software Renato Sampaio Verifica e valida as configurações propostas para o projeto.

Ferramentas, Ambiente e Infra-estrutura

editar

Algumas ferramentas serão utilizadas para aplicar a GCS no ambiente, mostradas a seguir:

Git e Github

editar

Aqui será apresentadas as ferramentas e plataformas que serão utilizadas para realizar o controle de versões do projeto.

Nome O que é?
Git Ferramenta para versionamento de projetos que tem como objetivo facilitar o desenvolvimento de softwares.
GitHub Plataforma que permite o armazenamento e disponibilização de projetos online que faz o uso da ferramenta Git.

Ferramentas de Integração Contínua: Travis-CI

editar
Sobre o Travis-CI
editar

Travis é uma ferramenta de IC em ambientes de desenvolvimento de software, é grátis e possui é um software livre - open source - que facilita o trabalho de equipes de desenvolvimento por meio de builds automatizadas.

Como funciona
editar

O Travis-CI é instalado no projeto adicionando o arquivo .travis.yml que possui uma série de scripts - criada pelo desenvolvedor do projeto - que são executados assim que o desenvolvedor sobe suas alterações para a branch que está configurada a receber a execução do Travis. O mesmo executa os scripts e a build pode ter sucesso ou não. Caso não tenha, o desenvolvedor deve ficar atento pois existe algo de errado no código e o mesmo não pode ser continuado antes de arrumar as dependências.

Ambiente de desenvolvimento

editar
Vagrant
editar

Ferramenta que possibilita a criação de um ambiente de desenvolvimento em uma maquina virtual, contendo todas as ferramentas e dependências necessarias para o desenvolvendor codificar o projeto.

VirtualBox
editar

Software de virtualização que pertence atualmente à Oracle que visa criar ambientes para a instalação de sistemas distintos. O software VirtualBox será o software utilizado para a virtualização do ambiente de desenvolvimento, utilizado no Vagrant.

Como funciona
editar

O ambiente de desenvolvimento funciona da seguinte maneira: instalando o Vagrant no projeto, é possível configurar o ambiente por meio de um arquivo, o Vagrantfile. Nele, coloca-se as dependências que precisam ser instaladas no ambiente virtualizado, definindo também qual a ferramenta de virtualização, sua memória RAM, porta de acesso e algumas outras configurações.

Ferramenta de Deploy

editar
Travis e Heroku
editar

Heroku é uma plataforma de serviços em nuvem a qual suporta várias linguagens de programação. A primeira linguagem suportada pela plataforma foi Ruby, mais tarde adicionou suporte a várias outras como: Java, Nodejs, Python, PHP entre outras.

Este trabalho usa a linguagem de programação Ruby para realização do deploy no Heroku.

O travis trás uma integração com Heroku no qual pode realizar deploy automático após uma build bem-sucedida.

Relatório de Acompanhamento

editar

Cronograma

editar

Cronograma para controle de deadlines e andamento do projeto.

Atividade Período Descrição Responsáveis Status
Divulgar plano de GCS 26/09 à 03/10 Montagem e publicação do plano GCS na Wikiversidade Gesiel e Vitor Feito
Configuração da Ferramenta de IC 04/10 à 17/10 Configuração correta e eficiente da ferramenta de integração contínua Gesiel e Vitor Feito
Ambiente de Desenvolvimento 20/10 à 05/11 Configuração do ambiente de desenvolvimento Gesiel e Vitor Em andamento
Deploy no Heroku 06/11 à 13/11 Configuração do deploy do projeto no servidor do Heroku Gesiel e Vitor Feito
Deploy Automatizado 14/11 à 20/11 Configuração do deploy automático do projeto Gesiel e Vitor A fazer
Apresentação do Projeto 21/11 à 05/12 Apresentação do projeto final com a implementação do planejamento realizado Gesiel e Vitor A fazer

Implantação e Aplicação do Plano de Gerência de Configuração

editar

Integração Contínua

editar

Como já citado anteriormente, a ferramenta IC selecionada foi a Travis-CI. O principal motivo para a equipe selecionar esta ferramenta foi que sua integração com o Github - onde o projeto encontra-se - é muito fácil e rápida.

A configuração do Travis-CI no projeto Avalia Mais foi executado seguindo os seguintes passos:

1° Passo: Realizar login no Travis com a conta do GitHub que possui o repositório a ser utilizado

 

2° Passo: Autorizar o Travis a realizar a integração contínua nos repositórios desejados, no caso, o Avalia Mais.

3° Passo: Inserir o arquivo .travis.yml na pasta do projeto.

$ cd PROJECT_PATH
$ touch .travis.yml

4° Passo: Configurar o arquivo database.yml com as especificações da Base de Dados, que será utilizado no Travis.

default: &default
    adapter: mysql2
    username: root
    encoding: utf8
    pool: 5
    timeout: 5000

development:
    <<: *default
    database: avalia_mais_development
    password: root	

test: &test
    <<: *default
    database: avalia_mais_test
    
production:
    <<: *default
    database: avalia_mais_production

cucumber:
  <<: *test

5° Passo: Configurar o arquivo database.yml.travis para definir a base de dados de teste, a ser utilizada para os testes unitários.

test:
  adapter: mysql2
  database: avalia_mais_test
  username: root

6° Passo: Configurar o arquivo .travis.yml de acordo com o projeto e suas dependências.

language: ruby
services:
- mysql
before_script:
- cp config/database.yml.travis config/database.yml
- mysql -e 'create database myapp_test;' -uroot
script:
- bundle exec spring binstub --all
- bundle install
- bundle exec rake db:load_config
- bundle exec rake db:create
- bundle exec rake db:migrate
- bundle exec rspec
rvm:
- 2.3.1
notifications:
  email:
    recipients:
    - gesiel.was.f@gmail.com
    - vitorbertulucci@hotmail.com
branches:
  only:
  - master

Com isso, foi definido a branch a ser utilizada a integração contínua, as dependências necessárias para realizar a build de testes e os integrantes do projetos à serem avisados sobre a execução da build de testes.

Ambiente de Desenvolvimento

editar

Como dito anteriormente, foi utilizado o Vagrant juntamente com a VirtualBox da Oracle para construir o ambiente virtualizado de desenvolvimento. Para isso, foi utilizado o Vagrantfile dentro do projeto. Para a instalação do Vagrantfile no projeto basta executar o comando:

$ vagrant init

A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

Com isso, o Vagrantfile é criado. Com o Vagrantfile instalado no projeto, realizou-se a configuração do arquivo da seguinte maneira:

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # Use Ubuntu 16.04 Xenial Xerus 64-bit as our operating system
  config.vm.box = "ubuntu/xenial64"

  # Configurate the virtual machine to use 2GB of RAM
  config.vm.provider :virtualbox do |vb|
    vb.customize ["modifyvm", :id, "--memory", "2048"]
  end

  # Forward the Rails server default port to the host
  config.vm.network :forwarded_port, guest: 3000, host: 3000

  # Configurate the virtual environment with shell script - Installing all dependences
  config.vm.provision "shell", privileged: false, path: "script/script.sh"
  
end

Após a configuração do arquivo Vagranfile, executa-se o seguinte comando para a criação da máquina virtual:

$ vagrant up --provision

A execução desse comando faz com que o vagrant crie uma máquina virtual e a configure de acordo com as configurações pré definidas no Vagrantfile. Para ter acesso à máquina virtual por meio do terminal, deve-se executar o comando:

$ vagrant ssh

Welcome to Ubuntu 14.04.5 LTS (GNU/Linux 3.13.0-101-generic x86_64)

 * Documentation:  https://help.ubuntu.com/

  System information as of Sun Nov 27 20:09:24 UTC 2016

  System load:  0.0               Processes:           81
  Usage of /:   5.5% of 39.34GB   Users logged in:     0
  Memory usage: 14%               IP address for eth0: 10.0.2.15
  Swap usage:   0%

  Graph this data and manage this system at:
    https://landscape.canonical.com/

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

New release '16.04.1 LTS' available.
Run 'do-release-upgrade' to upgrade to it.


Last login: Sun Nov 27 20:09:24 2016 from 10.0.2.2
vagrant@vagrant-ubuntu-trusty-64:~$

Já dentro da máquina virtual, acesse a página /vagrant dentro do ambiente.

$ cd /vagrant


Como o ambiente configurado, basta executar o seguinte comando para acessar pela porta configurada o projeto:

$ rails s -b 0.0.0.0

Script de configuração do ambiente

editar
#script.sh
#!/bin/bash


echo "Update: starting"
sudo apt-get update
sudo apt-get upgrade 
echo "Update: DONE"

echo "Install git: starting"
sudo apt-get -y install git 
echo "Install git: DONE"

echo "Installing additional dependences: starting"
sudo apt-get install -y build-essential autoconf bison libssl-dev libyaml-dev libreadline6-dev zlib1g-dev libncurses5-dev libffi-dev libgdbm-dev

sudo apt-get -y install nodejs 
echo "Installing additional dependences: DONE"

echo "Installing rvm: starting"
sudo apt-get -y install curl 
gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 

echo "chave instalada"

echo "Instalando RVM"
\curl -sSL https://get.rvm.io | bash

echo "RVM instalada"

echo "diretorio para uso do rvm"
source /home/vagrant/.rvm/scripts/rvm 
echo "Installing rvm: Done"

echo "Installing ruby: starting"
rvm install 2.3.1
rvm use 2.3.1 --default
echo "Ruby instaled: DONE"

echo "Installing rails: starting"
gem install bundler
gem install rails -v 4.2.4
echo "Installing rails: DONE"

echo "install mysql cliente"
sudo apt-get -y install mysql-client
echo "mysql instaled: DONE"

echo "instalation mysql server starting"
sudo debconf-set-selections <<< "mysql-server mysql-server/root_password password root"
sudo debconf-set-selections <<< "mysql-server mysql-server/root_password_again password root"
sudo apt-get -y install mysql-server
sudo apt-get install -y  libmysqlclient-dev

echo "mysql server instaled: DONE"

echo "instalation postgree: starting"
sudo apt-get install -y postgresql
sudo apt-get install -y libpq-dev
echo "postgree instaled: DONE" 
echo "instalation sucess"

echo "instalation gems and create db: starting"
cd /vagrant
bundle install
rake db:create db:migrate
echo "success"

echo "Instalation Complete!"

Deploy Automatizado

editar

O deploy automatizado foi feito com as configurações já existentes entre o Travis e o Heroku. Com isso, foi necessário apenas inserir no final do arquivo .travis.yml algumas configurações que permitem o deploy no servidor do Heroku.

Para isso deve-se criar uma conta no Heroku e após isso seguir os seguintes passos.

  1. Instalar heroku toolbelt
$ wget -O- https://toolbelt.heroku.com/install-ubuntu.sh | sh

2. Realizar login no heroku

 $ heroku login Enter your Heroku credentials.            Email: example@example.com                        Password:

3. criar um aplicativo no Heroku.

$ heroku create avalia-mais-gcs

4. Realizar o deploy

$ git push heroku master

5. Instalar TravisCI

$ gem install travis

6. Criptografar a chave de segurança do git

$ travis encrypt $(heroku auth:token) --add deploy.api_key

7. No arquivo do .travis.yml será gerado automaticamente as linhas no final do arquivo.

deploy:
  provider: heroku
  app: avalia-mais-gcs		
  api_key:
    secure: JFd0mo1jV/nOmSNpJqkmg8hkSmgL
hw6fY4qdhBVwTap1Vb4446piZqolv1/tVdYk/3u
a51O8Vk2gze4PZJbuTwmRszQQUIOWC8c9MWavBL
HhrVBYiBNrRHE0f62Hex+t5HnwuBzieoGDuaJ/7
1VYo2O5tDzX/kyZY5FhdyRV1/B8/hy8/SGs+ur3
Knf1503f9N4KWwSE7zSlB3uY9Ix+Oz2j8b1wUQI
M420Zz6nDg9uTbdjQLTeBFO/Oa9BHpByHHbz0x8
X3G0TEGOqrE5ZWVR6dDwefysgS0BDl/nAEnGkdI
+zllX6o3hwIlGjJVHWDIB54NtC6V6+3U5s/BQ9n
lNlHJrlJsH+ILIi91OD5rds4PuD95QUjoN7/Z3u
GCgBFNk9aOoyk5awfANrDm7ajsEy221MghMjFgm
Ia4136p3EPUiTkVRFeIaqnSQXsgynfmgBLS88ln
SbVl/uudyDWrq7OzevVkn3GAaqX2wYwTyqX2MOe
vUxOgxp7IOe99qb16L7Eamxy5tqAYWqixiwr/hN
Y5i7qnyn6kkJpJr/1THLFy1Ba5ZO/MPxQPUWUSx
fT5OjFnbFrG1te7UkWSNbLy0bzlvEuzu4/YT1yC
FTcPxA8y+UjPQv49f5rT4iK8rhx5OhBM73prpQK
Q1X6rrVw2L62d/WdwsOTbssfSrDSqDs=
  on:
     branch: master

Com isso, o Travis, ao obter sucesso nas atividades anteriores, executa os comandos de deploy, que podem ser acompanhados no log de atividades em tempo real que aparecem no site do travis, sobre o repositório desejado.

The command "bundle exec rspec" exited with 0.
Fetching: dpl-1.8.24.gem (100%)
Successfully installed dpl-1.8.24
1 gem installed

Installing deploy dependencies
Fetching: multi_json-1.12.1.gem (100%)
Successfully installed multi_json-1.12.1
Fetching: excon-0.54.0.gem (100%)
Successfully installed excon-0.54.0
Fetching: heroku-api-0.4.2.gem (100%)
Successfully installed heroku-api-0.4.2
3 gems installed
Fetching: rendezvous-0.1.2.gem (100%)
Successfully installed rendezvous-0.1.2
1 gem installed

Preparing deploy
authenticated as gesiel.was.f@gmail.com
checking for app 'avalia-mais-gcs'
found app 'avalia-mais-gcs'
Cleaning up git repository with `git stash --all`. If you need build artifacts for deployment, set `deploy.skip_cleanup: true`. See https://docs.travis-ci.com/user/deployment/#Uploading-Files.
Saved working directory and index state WIP on (no branch): 64e27dd Merge branch 'master' of https://github.com/GesielFreitas/AvaliaMais
HEAD is now at 64e27dd Merge branch 'master' of https://github.com/GesielFreitas/AvaliaMais
dpl.3
Deploying application

Resultados Esperados

editar

Como saber se as atividades de virtualização deram certo?

editar

Com a execução das atividades de virtualização do ambiente e o servidor do Rails em execução (rails s -b 0.0.0.0), será possível verificar e acessar localmente o site do AvaliaMais por meio do endereço http://0.0.0.0:3000, que é a porta de acesso definida no Vagranfile.

Como saber se as atividades de deploy deram certo?

editar

Ao executar todos os comandos, será possível ter acesso ao site do AvaliaMais por meio do link http://avalia-mais-gcs.herokuapp.com/.

Referências Bibliográficas

editar

http://www.contagia.com.br/blog/git-pra-que-serve/

https://www.oficinadanet.com.br/post/14791-o-que-github

https://code.tutsplus.com/tutorials/travis-ci-what-why-how--net-34771