# Plano de Gerência de Configuração de Software
## Introdução

Neste documentos serão descritas as principais atividades a serem realizadas no contexto da disciplina de Gerência de Configuração de Software.

## Objetivo

O objetivo do projeto é realizar a aplicação de técnicas, e utilização de ferramentas e conhecimentos aprendidos ao longo da disciplina. Com isto, objetiva-se um melhor aprendizado e melhoria do produto alvo.

## Contexto geral

Os projetos serão realizados utilizando como produto os jogos desenvolvidos pelos alunos da Universidade de Brasília, na matéria de Introdução aos Jogos Eletrônicos. Estes jogos, em geral, não tem uma boa Gerência de Configuração de Software, e por este motivo acabam por tornar difícil sua distribuição e instalação, uma vez que é difícil entrar em contato com as equipes que desenvolveram os jogos, e o conhecimento para a utilização dos jogos se perde.

## Contexto do projeto

Para este projeto, serão aplicados os conhecimentos de Gerência de Configuração de Software utilizado o jogo MindScape, que está sendo desenvolvido na matéria de Introdução aos Jogos Eletrônicos, no semestre 1.2017.

## Escopo

* Criar políticas de colaboração: Estabelecer políticas de colaboração a serem utilizadas pelos desenvolvedores, ou outros que estejam interessados em colaborar com o jogo;
* Gerar pacote .deb do jogo: Empacotar jogo para distribuições baseadas em Debian;
* Gerar pacote .rpm do jogo: Empacotar jogo para distribuições Red Hat;
* Estruturar Manual de configuração: Criar na wiki do GitHub, a documentação necessária para facilitar a contribuição e instalação do jogo;

## Atividades principais

Criar políticas de colaboração:
* Criar política de commits
* Criar politica de utilização de branches
Gerar pacote .deb do jogo:
* Estudar passos para realização do empacotamento
* Configurar ambiente virtual para empacotamento
* Criar pacote .deb do jogo
Gerar pacote .rpm do jogo:
* Estudar passos para realização do empacotamento rpm
* Configurar ambiente virtual para empacotamento rpm
* Criar pacote .rpm do jogo
Estruturar Manual de configuração:
* Documentar passos para colaboração com o projeto
* Documentar passos para instalação do jogo

## Ferramentas

| Ferramenta | Função |
| Git | Será utilizado para controle de versão e gerenciamento de mudanças no código fonte do jogo |
| GitHub | É onde será mantido o repositório remoto do projeto e a documentação do jogo |
| Vagrant + Virtual Box | Essas ferramentas serão utilizadas pra criação de ambientes Debian e RedHat, para realização do empacotamento do jogo |

## Papeis e Responsabilidades

| Papel | Responsabilidades | Responsável |
| Desenvolvedor | Desenvolver o jogo | Luan Guimarães, Victor Navarro, Matheus Miranda e Lucas Souza |
| Gerente de Configuração de Software | Analisar necessidades do projeto, Criar plano de GCS e Realizar e monitorar atividades definidas | Luan Guimarães e Matheus Miranda |
| Auditor de Configuração de Software; | Validar atividades realizadas e artefatos gerados; | Matheus Faria |

## Cronograma

| Data | Atividade |
| 24/04/2017 | Marco: Apresentação dos planos de GCS dos projetos |
| 26/04/2017 - 01/05/2016 | Criar políticas de colaboração |
| 26/04/2017 | Criar política de commits |
| 29/04/2017 | Criar politica de utilização de branches |
| 02/05/2017 - 19/05/2017 | Gerar pacote .deb do jogo |
| 02/05/2017 | Estudar passos para realização do empacotamento |
| 10/05/2017 | Configurar ambiente virtual para empacotamento |
| 13/05/2017 | Criar pacote .deb do jogo |
| 20/05/2017 - 09/06/2017 | Gerar pacote .rpm do jogo |
| 20/05/2017 | Estudar passos para realização do empacotamento |
| 27/05/2017 | Configurar ambiente virtual para empacotamento |
| 29/05/2017 | Marco: Andamento dos projetos |
| 01/06/2017 | Criar pacote .rpm do jogo |
| 10/06/2017 - 18/06/2017 | Estruturar Manual de configuração |
| 10/06/2017 | Documentar passos para colaboração com o projeto |
| 13/06/2017 | Documentar passos para instalação do jogo |
| 19/06/2017 | Marco: Apresentação final dos projetos |

# Execução do planejamento de Gerência de Configuração de Software
## Gerenciamento de repositórios

Serão mantidos dois repositórios principais dentro da organização no GitHUb:
* [Este repositório](https://github.com/mind-scape/mindscape), sendo o repositório principal, onde é mantido o código fonte do jogo MindScape, e utilizado para controle de versões e desenvolvimento colaborativo deste.
* O [repositório de suporte](https://github.com/PlataformaJogosUnB), onde serão mantidos arquivos necessários à configuração de ambientes de desenvolvimento e empacotamento do jogo.

### Política de Commits

Os commits realizados no repositório do projeto deverão seguir o padrão definido abaixo: - Mensagem do commit em inglês, com verbo no infinitivo indicando o propósito do commit. Se necessário, utilizar-se de comentário adicionais.
- Ao commitar utilizar-se da linha de comando $git commit -s. Deve-se também citar, utilizando a menção "Signed-off-by", o nome de usuário e email dos membros que colaboraram com o desenvolvimento do código que está sendo commitado.

### Política de Branches

A branch devel será sempre atualizada a partir da branch master deste repositório. As branchs de desenvolvimento das funcionalidades deverão ser criadas sempre a partir da branch devel. Uma vez que as funcionalidades estejam concluídas deve ser aberto o Pull Request para a branch devel.
Os Pull Requests só serão integrados à branch devel uma vez que o código desenvolvido tenha sido devidamente revisado por pelo menos outro membro da equipe de desenvolvimento.
Nos pontos de entrega definidos, será aberto um "Pull Request" da branch devel para a branch master do repositório oficial. Desta forma visa-se garantir a estabilidade da branch master do repositório oficial, que será utilizada para empacotamento do jogo.

### Utilização das Branches

Sempre que um ou mais membros da equipe for começar a trabalhar no desenvolvimento de uma nova funcionalidade ,correção de erros ou melhorias no jogo, deve-se criar uma branch a partir da branch devel, com o padrão definido abaixo:
Padrão para novas funcionalidades:
Nome da branch indicando a funcionalidade a ser desenvolvida, com palavras em minúsculo separadas por underline. Ex: game_mechanics;
Padrão para correção de erros ou melhorias:
Nome da branch com o formato "issue_x_nome_da_issue", onde 'x' indica o número da issue a que está relacionado o que será desenvolvido, essa issue já deve estar mapeada no repositório. O restante do nome da branch será feito a partir de um breve resumo do nome da issue.

### Política de aprovação

Para que o "Pull Request" das funcionalidades seja devidamente aceito, este deve estar devidamente revisado e conforme os padrões de commit e estilo de código definidos.

### Uso das Issues

Durante o desenvolvimento, deverão ser utilizadas issues para mapear as demandas e as funcionalidades, de modo que cada issue deve ser identificada com labels que facilitem o seu mapeamento com as tarefas e funcionalidades sendo desenvolvidas. Labels podem ser criadas de acordo com as necessidades de utilização. Além disso ,devem ser utilizadas as seguintes labels padrão:
Desta forma, por exemplo, caso uma issue esteja mapeando um bug relacionado à engine, deve adicionar à ela as tags "Bug" e "Engine".

## Ferramentas e configuração de ambientes de desenvolvimento e empacotamento

Para utilizar as configurações de ambiente estabelecidas é necessário primeiramente ter as seguintes dependências instaladas:
* Ruby
* Chake
* Vagrant
* Virtual Box
* NFS
Para configuração automatizada do ambiente de desenvolvimento foram utilizPython, com utilização do VirtualEnvPython, com utilização do VirtualEnvadas três ferramentas em conjunto, sendo elas: Chef, Chake e Vagrant. Foi construído um 'cookbook' chef com algumas receitas para configuração direta dos ambientes. Essas receitas quando executadas , por default, realizam a instalação e configuração de um ambiente de desenvolvimento com todas as dependências necessárias à utilização das SDL, a biblioteca gráfica utilizada no desenvolvimento do jogo, e à compilação do jogo. Estas foram feitas de forma genérica de modo que, ao executar a receita, o sistema operacional sendo utilizado é identificado e a correspondente configuração é realizada neste.
Além das receitas de configuração de ambientes de desenvolvimento, também foram desenvolvidas receitas para criação de um ambiente para empacotamento do jogo, uma vez que é interesssante haver um ambiente "limpo" para criação e manutenção de pacotes. Para tal utilização basta que o usuário descomente a linha "- role[packager]" no arquivo nodes.yaml, que diz quais conjuntos de receitas devem ser executados ao convergir cada uma das máquinas. Dentro do 'cookbook packager' foram definidas configurações para instalação das dependências necessárias à realização dos empacotamentos .deb e .rpm.
A criação das máquinas virtuais utilizando o Vagrant é bastante simples e demanda apenas uma linha de comando, já que o arquivo de configuração do Vagrant já está editado com as devidas configurações. Com a máquina virtual criada e 'rodando', é utilizado o Chake para execução das receitas 'remotamente' dentro da VM. O Chake funciona exatamente como uma abstração do ChefServer e permite que receitas possam ser executadas em hosts remotamente, bastando para tal, apenas realizar as corretas configurações deste.
Uma vez instaladas as dependências, deve-se seguir os seguintes passos: Clone o código fonte do jogo
Caso se deseje utilizar uma máquina debian, seja para desenvolvimento, execução ou empacotamento do jogo. Deve ser setado no Vagrant file a VM debian a ser utilizada na linha 'config.vm.box'.
Caso se deseje utilizar uma máquina Centos, seja para desenvolvimento, execução ou empacotamento do jogo. Deve ser setado no Vagrant file a VM debian a ser utilizada na linha 'config.vm.box'.
Execute o Vagrantfile, subindo a máquina virtual desejada.
Saia do diretório atual
Clone o repositório de configuração de ambiente
Execute os cookbooks chef utilizando o chake

### Empacotamento RPM

Para fazer o empacotamento .rpm, siga as seguintes instruções:
Acesse o repositório de configuração de ambiente
Acesse a máquina virtual
Acesse a pasta compartilhada via NFS onde se encontra o código fonte do jogo
Gere uma tag para a versão do software
Execute o script de empacotamento