# Falcon Framework
## Responsáveis

Thiago Meira Bernardes
Luis Filipe Resende Vilela

## Introdução

Este plano de Gerência de Configuração de Software visa descrever as atividades do Gerenciamento de Controle e Mudança que serão executados durante os ciclo de vida do projeto Falcon Framework.
A proposta do Falcon é o desenvolvimento de um Framework que possibilite automatizar o processo de desenvolvimento da conexão cliente-servidor, diminuindo o esforço e aumentando a produtividade dessa atividade do processo de desenvolvimento de software. O Falcon irá gerar código do servidor a partir de uma modelagem gráfica, e seguindo o padrão de resposta desse servidor gerado, gerará também o SDK para a camada cliente se conectar com o servidor. Além de oferecer a conexão facilitada do Cliente-Servidor, o Falcon fornecerá automaticamente a funcionalidade de sincronização e persistência dos dados desejados. Na próxima sessão os recursos estão ordenados por ordem de prioridade, assim os desenvolvedores terão menos esforço para construção desse módulo nos softwares desenvolvidos.
Obs: Este Plano de Gerência de Configuração de Software foi desenvolvido na disciplina de Gerência de Configuração de Software do 1 Semestre de 2016 na FGA/UnB-Gama

### Finalidade

A finalidade deste documento é documentar um padrão a ser seguido durante o andamento do projeto, visando o controle e organização do mesmo.

### Escopo

Este Plano de Gerenciamento de Configuração é destinado para todos os integrantes da equipe responsável pelo desenvolvimento do Falcon Framework nas diciplinas de Medição e Análise, Desenho de Software e Modelagem de Processos.
Na disciplina de Gerência de configuração o objetivo principal é criar uma automação do empacotamento do Falcon Framework módulo de Geração de Servidor, a cada build lançada no repositório remoto, a integração contínua irá gerar um novo empacotamento e disponibilizará para download. O Módulo do produto já está pronto na linguagem Ruby e gerando servidores em Ruby on Rails, também será expandido para gerar servidores em NodeJS.

## Papéis e Responsabilidades

| Papel | Responsabilidade | Responsável |
| Gestor de configuração do projeto | Acompanha as alterações dos artefatos, itens de configuração relacionados ao projeto | Luís |
| Gestor de ferramentas de gerência de configuração | Realiza a manutenção da infraestrutura, isto é, a plataforma operacional e ferramentas utilizadas no processo de GCS. | Luís e Thiago |
| Gestor de configuração de software | Gerencia e aprova as atividades de GCS | Thiago |
| Auditor de configuração de software | Realiza a auditoria de configuração no projeto | Luís e Thiago |
| Desenvolvedor | Produz os itens de configuração que são gerenciados, no caso, o código-fonte do Geração de Servidor do Falcon Framework | Luís, Thiago e Gabriel Araújo |

## Cronograma

| Iteração | Período | Macro Atividade | Status |
| 1 | 25/04 -> 01/05 | Redigir Plano de Gerência de Configuração | Done |
| 2 | 01/05 -> 08/05 | Analisar as ferramentas a serem utilizadas | Done |
| 3 | 08/05 -> 15/05 | Implementar empacotamento para Linux | Done |
| 4 | 15/05 -> 22/05 | Implementar empacotamento para OSX | Done |
| 5 | 22/05 -> 29/05 | Implementar empacotamento para Windows | Done |
| 6 | 29/05 -> 05/06 | Implementar Integração Contínua com empacotamento automático | Done |
| 7 | 05/06 -> 12/06 | Analisar ambiente que será usado para testes | Done |
| 8 | 12/06 -> 19/06 | Implementar Integração Contínua para testes | Done |

## Organização
### Política de Branchs

Para a política de branchs, será utilizado o model de branchs criado por Vincent Driessen's. Que é uma estratégia de gerenciamento de releases e branch que ajudará a equipe de desenvolvimento no rastreamento das features implementadas, ajustes feitos e grades releases do projeto.

#### Git-flow

* Production branch: master
* Development branch: develop
Branch prefixes:
* Feature branch prefix: feature/
* Release branch prefix: release/
* Hotfix branch prefix: hotfix/
* Version tag prefix: ""
* Support branch prefix: support/

## Ferramentas

| Ferramenta | Versão | Descrição | Disponibilização |
| Atom | 1.7.4 | Editor de Texto. | https://atom.io |
| GitLab CI | | Serviços para integração contínua. | https://about.gitlab.com/gitlab-ci/ |
| Rubygem | 2.5.1 | Gerenciador de pacotes ruby (gems) | https://rubygems.org |
| Bundler | 1.11.2 | Gerenciador de dependências ruby | http://bundler.io |

## Controle de Configuração
### Empacotamento

O empacotamento foi realizado através do bundler, que empacota as dependências necessárias para instalar o Falcon. No arquivo .gemspec abaixo, realizamos a configuração de atributos padrão, como: plataforma, nome, versão, descrição, autores, tipo de licença. E realizamos também a adição das dependências da gem, como: bundler, activesupport e o próprio ruby versão 2.3.0.
O seguinte pacote foi configurado com ajuda do seguinte tutorial http://railscasts.com/episodes/245-new-gem-with-bundler
Antes do empacotamento a instalação do falcon seguia os seguintes passos:
* Clone o Projeto:git clone git@gitlab.com:FalconTeam/server_generetor.git
* Defina o seu arquivo falcon_schema.yml
* Execute:ruby falcon_main.rb Isso vai gerar um script falcon.sh que será responsável por criar o seu servidor.
* Execute:bash falcon.sh Isso vai gerar uma aplicação baseada no seu schema. Se você não tem as ferramentas necessárias para gerar o servidor, o script irá instalá-las e isso pode levar alguns minutos.
* execute: 'cd ..'
* execute: 'cd falcon_generated_app'
* execute: 'cd your_app_name'
* execute: 'rails s'
* Aproveite sua API
Nesse modo anterior, era necessário clonar todo o projeto e executar alguns comandos específicos para conseguir gerar o servidor. Porém, a partir do empacotamento do falcon em uma gem, a instalação passou a ser realizada da seguinte maneira:
* Realiza o download da falcon gem: falcon_factory
* Instale a gem:gem install falcon_factory-0.0.1.gem
* Defina o seu schema falcon_schema.yml
* Execute o script abaixo para gerar seu servidor:falcon_factory generate -m your_falcon_schema_file.yml -t existent_folder_to_save_de_server
* Entre na pasta em que o servidor foi gerado:cd my_generated_app_path/falcon_generated_app/my_app_name
* Execute: 'rails s'
* Aproveite sua API

### Integração contínua

A integração contínua foi realizada utilizando uma ferramenta do próprio GitLab, o GitLab CI. O GitLab CI é uma ferramenta Open Source e é totalmente integrada ao GitLab, além de ser escalável, pois executa os testes distribuídos em máquinas separadas, que você pode adicionar tantas quanto deseja, ele é fácil de aprender e possui uma documentação enxuta e objetiva. O GitLab CI também é multi-plataforma e multi-linguagem , ou seja, executa builds em Unix, OSX e Windows, além da possibilidade do código ser em qualquer linguagem.
A integração foi realizada a partir de uma vm com imagem do ruby 2.3.0, que é a versão necessária para executar a gem. Foram criados dois "jobs": um para teste e o outro para deploy. O primeiro "job" para teste executa os testes e se estes passarem, iniciará o "job" de deploy. Nesse "job" de deploy é realizado o empacotamento em uma .gem e publicada no dropbox. Abaixo está o .gitlab-ci.yml:

### Ambiente

O gerenciamento do ambiente de desenvolvimento está sendo automatizado utilizando o `Vagrant 1.8.4` e o Cheff. A equipe ainda nao conclui o completamente a configuração do ambiente que precisa contar com uma instância `Ubuntu` e `ruby <= 2.3.0`. Segue o arquivo Vagrant configurado:
Arquivo Cheff configurado: