Falcon Framework
Responsáveis
editarThiago Meira Bernardes
Luis Filipe Resende Vilela
Introdução
editarEste 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
editarA finalidade deste documento é documentar um padrão a ser seguido durante o andamento do projeto, visando o controle e organização do mesmo.
Escopo
editarEste 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
editarPapel | 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
editarIteraçã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
editarPolítica de Branchs
editarPara 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
editar- 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
editarFerramenta | 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
editarEmpacotamento
editarO 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
# coding: utf-8
lib = File.expand_path('../lib', __FILE__)
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
require 'falcon_factory/version'
Gem::Specification.new do |spec|
spec.platform = Gem::Platform::RUBY
spec.name = 'falcon_factory'
spec.version = FalconFactory::VERSION
spec.summary = 'Backend web application framework.'
spec.description = 'Will generate backend for you through a DB model.'
spec.authors = ["thiagotmb"]
spec.email = ["tmb0710@gmail.com"]
spec.license = "MIT"
spec.required_ruby_version = '>= 2.3.0'
spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
spec.executables = ["falcon_factory"]
spec.require_paths = ["lib"]
spec.add_dependency "activesupport-inflector"
spec.add_dependency "activesupport", "~> 5.0.0.rc1"
spec.add_dependency "bundler", "~> 1.11"
spec.add_development_dependency 'rspec'
spec.add_development_dependency "rake", "~> 10.0"
spec.post_install_message = "Thanks for install falcon_factory!"
# Prevent pushing this gem to RubyGems.org by setting 'allowed_push_host', or
# delete this section to allow pushing this gem to any host.
if spec.respond_to?(:metadata)
spec.metadata['allowed_push_host'] = "TODO: Set to 'http://mygemserver.com'"
else
raise "RubyGems 2.3.0 or newer is required to protect against public gem pushes."
end
end
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:Isso vai gerar um script falcon.sh que será responsável por criar o seu servidor.
ruby falcon_main.rb
- Execute: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.
bash falcon.sh
- 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
editarA 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:
image: ruby:2.3
before_script:
- apt-get update -qq && apt-get install -y -qq sqlite3 libsqlite3-dev nodejs
- ruby -v
- which ruby
- gem install bundler --no-ri --no-rdoc
- bundle install --gemfile falcon_factory_gem/Gemfile --jobs $(nproc) "${FLAGS[@]}"
Unit Tests:
stage: test
script:
- rspec
Release to dropbox:
stage: deploy
script:
- cd falcon_factory_gem
- rake build
- >-
curl
-X POST https://content.dropboxapi.com/2/files/upload
--header "Authorization: Bearer 7MrPrA4nZMEAAAAAAAAT6G6uJ97ljn8HUw5KgJLykFg_dKnRycGmkNRYMYYJj0bM"
--header "Dropbox-API-Arg: {\"path\": \"/Releases/falcon_factory_gem/falcon_factory-0.0.1.gem\",\"mode\": \"add\",\"autorename\": true,\"mute\": false}"
--header "Content-Type: application/octet-stream"
--data-binary pkg/falcon_factory-0.0.1.gem
Ambiente
editarO 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:
# -*- mode: ruby -*-
# vi: set ft=ruby :
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# Use Ubuntu 14.04 Trusty Tahr 64-bit as our operating system
config.vm.box = "ubuntu/trusty64"
# 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
# Use Chef Solo to provision our virtual machine
config.vm.provision :chef_solo do |chef|
chef.cookbooks_path = ["cookbooks", "site-cookbooks"]
chef.add_recipe "apt"
chef.add_recipe "ruby_build"
chef.add_recipe "rbenv::user"
chef.add_recipe "rbenv::vagrant"
chef.add_recipe "vim"
chef.add_recipe "mysql::server"
chef.add_recipe "mysql::client"
# Install Ruby 2.2.1 and Bundler
# Set an empty root password for MySQL to make things simple
chef.json = {
rbenv: {
user_installs: [{
user: 'vagrant',
rubies: ["2.3.1"],
global: "2.3.1",
gems: {
"2.3.1" => [
{ name: "bundler" }
]
}
}]
},
mysql: {
server_root_password: ''
}
}
end
end
Arquivo Cheff configurado:
site "http://community.opscode.com/api/v1"
cookbook 'apt'
cookbook 'build-essential'
cookbook 'mysql', '5.5.3'
cookbook 'ruby_build', '2.3.0'
cookbook 'vim'