# Adopt-a-Hydrant

Grupo: Álvaro Fernando e Fábio Texeira

# Introdução
### Finalidade

Este documento apresenta um plano de Gerência de Configuração de software para o Adopt-a-Hydrant. Através deste, define-se diretrizes e atividades para o controle de versões e configuração do sistema em suporte ao desenvolvimento do projeto.
Link para o repositório: https://github.com/codeforamerica/adopt-a-hydrant

### Escopo

O Adopt-a-Hydrant é uma aplicação web que permite aos cidadãos "adotarem" hidrantes de sua cidade, que precisam serem "desenterrados" da neve depositada sobre eles pois a neve pode comprometer a utilização de tal estrutura. Ele é desenvolvido utilizando a linguagem de programação Ruby e o framework Rails.
Como objetivos deste trabalho, definiu-se a contribuição nos seguintes aspectos:
* Gerência de Configuração do Ambiente de Desenvolvimento;
* Empacotamento deb;
* Automatização da build da aplicação.

# Visão Geral

Nas seções seguintes deste documento, define-se um cronograma para as atividades de gerenciamento de configuração, bem como todo os resultados obtidos durante este processo. Inclui-se, portanto, a documentação da configuração e execução das tarefas executadas para alcançar os objetivos propostos.
Link para a organização do projeto de GCS: https://github.com/adopt-a-hydrant-FGA

# Cronograma

| Data - Início / Previsão de Término | Atividade |
| 27/04 - 10/05 | Implementação da GCS do ambiente de desenvolvimento |
| 11/05 - 24/05 | Empacotamento DEB do projeto |
| 25/05 - 07/06 | Empacotamento RPM do projeto |
| 01/06/2016 | Marco I - Apresentação do andamento do projeto |
| 08/06 - 21/06 | Automação da build |
| 22/06/2016 | Marco II - Apresentação final do Projeto |

# Ferramentas, Ambiente e Infra-estrutura

| Ferramenta | Descrição |
| Github | Forge free de aplicações que utilizam do sistema de versionamento git. |
| Travis CI | Ferramenta de integração continua com suporte a repositórios no github e free, desde que o software seja livre. |
| Chef | Ferramenta utilizada para a criaçao de receitas que automatiza as mais diversas tarefas. |
| build-essential | Pacote que contem informações de listas informativas de pacotes que são considerados essenciais para a construção de pacotes Debian. |
| devscripts | O pacote devscripts fornece uma colecção de scripts que podem ser usados para desenvolvedores Debian e outros que desejam construir pacotes Debian. |
| debhelper | Debhelper é usado para ajudar a construir um pacotes Debian. |
| RPMbuild | RPMbuild é usada para construir os pacotes RPM. |
| Vagrant | Ferramenta para facilitar a criação de ambientes virtuais. |
| VirtualBox | Ferramenta para emulação de sistemas operacionais. |

# Ambiente de Desenvolvimento

Foi criado uma Vagrant box para a virtualização do ambiente de desenvolvimento. Utilizou-se como base o a box do Ubuntu 14.04 ubuntu/trusty64. Neste ambiente já estão instaladas as dependências necessárias para que o sistema seja executado localmente para fins de desenvolvimento.
A box está disponível para distribuição no sistema Atlas da HashiCorp. Foi criado uma organização chamada adopt-a-hydrant-fga com a box adopt-a-hydrant.
Link: https://atlas.hashicorp.com/adopt-a-hydrant-FGA/boxes/adopt-a-hydrant

### Notas Técnicas

Utilizou-se um script para redução do tamanho do arquivo de iniciação do ambiente virtualizado, desenvolvido por Adrien Brault e disponibilizado em um Github Gist. Este script também está disponível no repositório criado para o projeto da disciplina.
Link: https://github.com/adopt-a-hydrant-FGA/adopt-a-hydrant_devel
Para preparar o ambiente de desenvolvimento, foi utilizado o script disponível no link abaixo:
Link: https://github.com/adopt-a-hydrant-FGA/adopt-a-hydrant_devel/blob/master/prepare-rails-env.sh
Os passo portanto para o levantar o ambiente de desenvolvimento são:
* Instalar as últimas versões do Vagrant e do VirtualBox
* Baixar e levantar a box disponibilizada no Atlas
* Parar a máquina levantada:
* Após o download, é necessário adicionar esta linha de configuração no Vagrantfile:
* Depois, basta iniciar a máquina, mudar para o diretório do projeto e executar o comando de serviço do Rails
Caso já se tenha um arquivo Vagrantfile, basta inserir nele o bloco abaixo:
E em seguida iniciar a maquina:

# Empacotamento

Foi planejado o empacotamento DEB e RPM, o pacote DEB seria enviado aos desenvolvedores do projeto como uma forma de contribuição e o pacote RPM serviria apanas de aprendizado. Porém devido há alguns problemas encontrados, não conseguimos realizar nenhum dos pacotes.

### Problemas encontrados:

As versões do Ruby e do Rails utilizados pela aplicação não estão disponíveis para as distribuições Ubuntu, fedora e centOS, o mesmo vale para algumas das gems utilizadas como a gem "devise".

### O que tentamos fazer:

Inicialmente tentamos empacotar separadamente o Ruby e o Rails. Sendo assim pegando como base pacotes já existentes utilizando o comando:
Bastando então "atualiza-los" para as suas versões mais recentes, porém a complexidade interna de tais pacotes inviabilizou essa nossa tentativa.
Como não conseguimos fazer os pacotes do Ruby e do Rails para as versões necessárias, passamos então a buscar ferramentas que poderiam nos auxiliar na tarefa de empacotar a aplicação, após uma busca sobre empacotamento DEB de aplicações ruby on rails chagamos na gem pkgr que realizaria a tarefa de fazer os pacotes DEB e RPM.
Após instalada:
Basta executar:
Dessa forma, baseado no sistema operacional, a gem gera um pacote DEB ou RPM.
A gem reconhece as seguintes distribuições:
* Ubuntu 14.04 ("trusty")
* Ubuntu 12.04 ("precise")
* Debian 8 ("jessie")
* Debian 7 ("wheezy")
* RHEL/CentOS 7
* RHEL/CentOS 6
* Suse Linux Enterprise Server 12
* Fedora 20
* Amazon Linux AMI 2014
Porém como já era de se esperar, o processo automatizado de geração de pacotes dessa gem é cheio de falhas, dentre elas:
* A aplicação adopt-a-hydrant utiliza o banco de dados postgreesql, o pkgr cria o pacote utilizando o banco de dados mysql como dependência;
* O pacote gerado não fornece nenhuma dependência de servidor(apache e etc);
* No fim, o que a gem faz é basicamente "instalar" a aplicação no diretório /opt com as dependências binárias (ruby, rails, bundle e etc) e gems dentro da aplicação.
Também tentamos utilizar o serviço packager.io para a geração dos pacotes. Esse serviço é pago, mas ele oferece um período free de 14 dias. Sobre a sua utilização, ele basicamente cria os pacotes DEB e RPM para as distribuições Ubuntu 14.04, Debian-7 e centOS-6. Porém, ao analisarmos o seu log, percebemos que esse serviço utiliza a gem pkgr para a criação desses pacotes. Logo caímos nos mesmos problemas já citados anteriormente.
De diferente do pkgr esse serviço apenas facilita a instalação dos pacotes:

### Sobre o pacote RPM:

Por aprendizado tentamos também criar o pacote RPM da aplicação, mas como estávamos tendo dificuldades no empacotamento DEB, que era o nosso principal objetivo, acabamos abandonando a criação desse pacote. Até o momento em que paramos a criação desse pacote tínhamos conseguido empacotar o Ruby 2.3.1 na distribuição Fedora.

# Referências

* https://wiki.debian.org/IntroDebianPackaging#Introduction_to_Debian_Packaging