TEM-DF
Introdução
[editar | editar código-fonte]Esta sessão provê uma visão geral do Plano de Gerência de Configuração, incluindo a finalidade, o escopo, as definições, os acrônimos, as abreviações, e uma visão geral do projeto de software que será que será alvo da gerência de configuração.
Finalidade
[editar | editar código-fonte]A finalidade deste Plano de Gerência de Configuracao é apresentar a definição de atividades, papéis e datas que descrevem como o Gerenciamento de Controle de Configuração e Mudança sera executado no sistema TEM-DF.
Visão Geral do Projeto
[editar | editar código-fonte]O TEM-DF: Transparência de Escalas Médicas do DF é uma aplicação que tem por objetivo buscar as escalas dos médicos do Distrito Federal no portal da transparência, mostrando alguns dados referente a cada um dos médicos, como o horário, dia e Unidade de Trabalho, facilitando a tarefa de encontrar médicos para um usuário com necessidade específica em um local específico. É desenvolvido em Ruby-on-rails e fornece um ranking de médicos de acordo com as avaliações feitas.
A url do repositório oficial do TEM-DF: https://github.com/EscalaSaudeDF/TEM-DF
A url do fork do repositório que está sendo aplicado os conceitos de GCS: https://github.com/ebenezerandrade/TEM-DF
Escopo
[editar | editar código-fonte]Como objetivos deste trabalho, foram definidas as seguintes contribuições:
- Realização de integração contínua
- Utilização do Vagrant para criar um ambiente com uma configuração estável
- Empacotamento .deb (em análise)
- Realização de deploy contínuo
Definições, Acrônimos e Abreviações
[editar | editar código-fonte]Termo | Significado |
---|---|
CM | Gerenciamento de Mudança [1] |
GCS | Gerência de Configuração de Software [2] |
Integração Contínua | Integração Contínua é uma pratica de desenvolvimento de software onde os membros de um time integram seu trabalho frequentemente, geralmente cada pessoa integra pelo menos diariamente – podendo haver múltiplas integrações por dia. Cada integração é verificada por um build automatizado (incluindo testes) para detectar erros de integração o mais rápido possível. [3] |
Virtualização | Simulação de hardware e criação um sistema de computadores virtual, a partir do qual pode-se executar mais de um sistema virtual, e vários sistemas operacionais e aplicativos, em um único servidor, resultando em economias de escala e mais eficiência.[4] |
Gerenciamento de Configuração de Software
[editar | editar código-fonte]Papeis e responsabilidades
[editar | editar código-fonte]Papel | Nome | Responsabilidade |
---|---|---|
Gerente de Configuração | Ebenezer e Priscilla | Assegurar e que o ambiente de CM facilite a revisão do produto e as atividades de controle de mudanças e defeitos, redigir o Plano CM, relatar estatísticas de andamento com base nas solicitações de mudança. |
Ferramentas e Infraestrutura
[editar | editar código-fonte]Ferramenta | Objetivo | Disponível em |
---|---|---|
Vagrant | Através dele é possível realizar criar novos ambientes configuráveis leves e portáteis. | https://www.vagrantup.com |
GitHub | Sistema para realização do controle de versão | https://github.com/ |
Travis CI | Serviço gratuito de integração contínua em nuvem que pode ser integrado ao GitHub | https://travis-ci.org/ |
Capistrano | Ferramenta para automatização do deploy | http://capistranorb.com/# |
Cronograma / Marcos do Projeto
[editar | editar código-fonte]Data | Atividade |
---|---|
27/04 | Divulgação do Plano de GCS |
27/04 - 04/05 | Configuração do ambiente para projeto |
04/05 - 18/05 | Realizar integração contínua (Travis CI) |
18/05 - 25/05 | Configurar Vagrant |
25/05 - 08/06 | Realizar deploy contínuo (Capistrano) |
01/06 | Apresentação intermediária do projeto |
08/06 - 20/06 | Realizar empacotamento .deb |
20/06 - 21/06 | Revisar estrutura do plano de GCS e entregáveis (integração contínua, deploy contínuo, ambiente virtual estável, empacotamento) |
22/06-29/06 | Apresentação final do Projeto |
Andamento do Projeto
[editar | editar código-fonte]Integração contínua
[editar | editar código-fonte]Primeiramente realizou o login no Travis CI com a conta do GitHub, o que permitiu que os repositórios fossem sincronizados com a ferramenta de integração contínua. Para realização da integração foi realizado 3 passos;
1 - Ativou o projeto sincronizado;
2 - Adicionou o arquivo .travis.yml no diretório rais do projeto e realizou as seguintes configurações;
language: ruby
before_script:
- cp config/database.yml.travis config/database.yml
- mysql -e "create database IF NOT EXISTS TEMDF_test;" -uroot
- export MAILGUN_API_KEY="secret"
- bundle exec rake db:migrate RAILS_ENV=test
script:
- bundle exec rake test
rvm:
- 2.2.0
notifications:
email:
recipients:
- ebenezer.andrade1@gmail.com
branches:
only:
- master
- development
env:
global:
secure: eVU2WwgDJdtpnF6D44mMD/GXJbFgmscUgn2EEm+RWtmuqsKgBsOuumkwcMwfCXVDF8s98WcT2FOErOM5RCpQBtdRmP0nivzGX3IqT3W4Dnenc2a8bUChOYpTnMk7yocDvhyMGgDDUinA9H3b4yHIxjlNb6jLdIc9pAiJOjmmuEhCnzE8hUsKS+udq4thA5KFVxNmQFG7nMluxWkH/jIqL5ttgTsFOo3bHzzoEiS0d+Yog3lhEoIMaaREA1fmaf7Jwcjl8Bxrx2BWf9WQUt0nlqOyReDhUmlwvFJ5MHSO/xKsW3snqZ55Vu8XP+QCgxZpsgvCFa/0s4e+1G65upkkUaQr3XLNqSufaDZCJaW602ci+z/w/2o5MKUttJGNdQQhLQ6AXB0fNooGB4gHecLKfKM6HYPT/EbBmXGd0uflVvydtxUJF0SOhKSxvpwTjqToitpHcJQP7cHczvGsZK5HpqODK83K0hjlbzLUPi83nemNvRGkdUsfWi+XyFy7bqYqR0/76ipx9oW54BrTkDAT44ChvQEKsMo0wVLHBxNly6HpZG0KKJ/Mfnwwr4yM4ElsvP/2c7ACcKH8hdQSlO+1vfwfaAcU/yAPe/2ePEd+tCMEguFs7XvgzwE3pZXwFYbHDIcxH9rSGPymZ4XdeLtNxKLdbhjMkxTEICuycW1ud6M=
after_success:
- "openssl aes-256-cbc -k $DEPLOY_KEY -in config/deploy/deploy_id_rsa_enc_travis -d -a -out config/deploy/deploy_id_rsa"
- "cap production deploy"
3 - O passo 3 é o push na master e realizou as devidas modificações nos arquivos .travis.yml e database.yml.travis, até garantir que a build está estável.
Configuração do Vagrant
[editar | editar código-fonte]Ferramenta
[editar | editar código-fonte]A ferramenta escolhida foi o Vagrant, que automatiza a construção de ambientes virtuais de desenvolvimento, isolando dependências e sua configuração dentro de um único ambiente descartável e consistente, reduzindo o tempo de configuração do ambiente de desenvolvimento. [5]
Instalação
[editar | editar código-fonte]Primeiramente instalou-se o VitualBox[6]:
$ sudo sh -c 'echo "deb http://download.virtualbox.org/virtualbox/debian trusty contrib" >> /etc/apt/sources.list'
$ wget http://download.virtualbox.org/virtualbox/debian/oracle_vbox.asc -O- | sudo apt-key add -
$ sudo apt-get update
$ sudo apt-get install virtualbox-4.3
$ sudo apt-get install virtualbox-dkms
E para instalação do vagrant:
$ sudo apt-get install vagrant
Comandos auxiliares vagrant[7]:
[editar | editar código-fonte]- vagrant ssh:
- vagrant up:
- vagrant reload:
- vagrant provision:
- vagrant destroy:
- vagrant suspend:
- vagrant resume:
Aplicação no projeto
[editar | editar código-fonte]Para criação de uma box padrão do UBUNTU 15.04 64 bit, foi executado o comando:
$ vagrant box add temDFEnvironmentDevelop https://github.com/kraksoft/vagrant-box-ubuntu/releases/download/15.04/ubuntu-15.04-amd64.box
Com a box criada podemos criar o aquivo de configuração da box Vagrantfile
$ cd ~/TEM-DF
$ vagrant init
Assim o arquivo vagrantfile foi preenchido da forma como segue o código abaixo, onde é definido o nome da box, as portas que serão utilizadas, a configuração com uma memória de 1GB e o arquivos com os comandos para instalação e configuração do ambiente.
#vagrantfile
VAGRANTFILE_API_VERSION = "2"
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
config.vm.box = "temDFEnvironmentDevelop"
config.vm.network :forwarded_port, guest: 3000, host: 3000
config.vm.provider :virtualbox do |vb|
vb.customize ["modifyvm", :id, "--memory", "1024"]
end
config.vm.provision "shell", path: "script/setup.sh"
end
Criação do arquivo setup.sh onde contém os comandos que serão executados pelo provision do vagrant para instalação e configuração do ambiente de desenvolvimento na box.
#setup.sh
#!/bin/bash
echo "Update: starting"
sudo apt-get update
echo "Update: DONE"
echo "Install git: starting"
sudo apt-get -y install git
echo "Install git: DONE"
echo "Installing rvm: starting"
sudo apt-get -y install curl
sudo apt-get -y install gnupg2
gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
\curl -L https://get.rvm.io | bash -s stable
source ~/.rvm/scripts/rvm
echo "Installing rvm: Done"
echo "Installing additional dependences: starting"
sudo apt-get -y install build-essential openssl libreadline6 libreadline6-dev zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev automake libtool bison subversion
apt-add-repository -y ppa:chris-lea/node.js
sudo apt-get update
sudo apt-get -y install nodejs
echo "Installing additional dependences: DONE"
echo "Installing ruby and rails: starting"
rvm install 2.3.0p0
rvm use 2.3.0p0 --default
gem install bundler
gem install rails
echo "Installing ruby and rails: DONE"
echo "Instalation Complete!"
Em seguida, para executar a máquina virtual em background, rode o comando:
$ vagrant up
Comando utilizado para acessar a maquina virtual, ao qual direciona o usuário para um console SSH, onde tem a liberdade de fazer as modificações desejadas na maquina virtual
$ vagrant ssh
Para sair deste console, rode o comando:
$ exit
Deploy contínuo com Capistrano
[editar | editar código-fonte]Comandos básicos do Capistrano
[editar | editar código-fonte]O Capistrano é uma ferramenta que automatiza o deploy de um projeto - sistema - para um ou mais servidores via SSH, eliminando realização manual de tarefas (tasks) como como reiniciar um servidor web, renomear arquivos, e executar migrações de banco de dados. Escrito em ruby, pode ser utilizado tanto com projetos web desenvolvidos nesta linguagem, quanto nas demais. É necessário que os projetos estejam sob controle de versão.
O primeiro passo é instalar a bem do Capistrano:
$ gem install capistrano
Para inicializar o Capistrano dentro da aplicação desejada,
$ cd my-project
$ cap install
Nesse processo, alguns importantes arquivos foram criados dentro do diretório do projeto
└── Capfile
└── config
| └── deploy
| | └── production.rb
│ | └── staging.rb
│ └── deploy.rb
└── lib
└── capistrano
└── tasks
No arquivo deploy.rb, é preciso informar ao Capistrano algumas informações de configuração do ambiente, como onde encontrar os servidores e o código do projeto, ou seja, a URL do repositório e o user deployment são especificados neste arquivo.
Para realizar o deploy,
$ cap deploy
Para utilizar o Capistrano, este tutorial foi um dos utilizados: [8]:
Este tutorial utilizou comandos que atualmente já estão deprecados, (como "capify .") , o que trouxe algumas dificuldades, que sem demora foram solucionadas.
Criação da chave de SSH
[editar | editar código-fonte]Passo a passo realizado para a geração da chave de SSH a ser utilizada no deploy.
No terminal, executou-se o comando para geração das chaves publica e privada.
$ ssh-keygen -t rsa -b 4096 -C "emailGitHub@exemplo.com"
logo apos a execução deste comando ainda é realizada duas iterações onde você insere um arquivo no qual deseja salvar a chave e aceita o local de armazenamento deste arquivo como padrão. E em seguida inserindo o password do chave que acabou de gerar,
Antes de adicionar essa nova chave de SSH para o ssh-agent verificou-se as chaves existentes.
Certificando que o ssh-agent está ativado
$ eval "$(ssh-agent -s)"
Adicionando a chave de SSH ao ssh-agent
$ ssh-add ~/.ssh/id_rsa"
Adicionando chave ao GitHub
$ sudo apt-get install xclip
$ xclip -sel clip < ~/.ssh/id_rsa.pub
Logo só foi preciso ir em configurações da conta no perfil do GitHub e adicionar e criar uma nova chave de ssh, adicionando um título do capistrano e logo em seguida passou o conteúdo do clipboard no campo para o conteúdo da chave.
Passos Realizados para o deploy contínuo
[editar | editar código-fonte]Para fazer o deploy contínuo a partir do Travis CI é necessário a instalação da gem para o Travis, logo o comando deve ser dado na raiz do projeto.
$ sudo gem install travis
E o comando travis login para autenticação do usuário de sua conta. No caso utilizei a mesma conta do GitHub.
$ sudo travis login
Criação do password e adicionando ele ao arquivo travis.yml
$ sudo travis encrypt DEPLOY_KEY="encryption-password" --add
O Próximo comando a ser executado utilizou-se a chave de SSH gerada anteriormente Este comando é para encriptar a sua chave privada, que será utilizada em seu deploy.
$ openssl aes-256-cbc -k "encryption-password" -in deploy_id_rsa -out config/deploy_id_rsa_enc_travis -a
No arquivo travis.yml foi inserido o seguinte trecho, com intuito de descriptografar a chave de RSA e finalmente implantar para o servidor após a build estar bem sucedida.
$after_success:
- "openssl aes-256-cbc -k $DEPLOY_KEY -in config/deploy/deploy_id_rsa_enc_travis -d -a -out config/deploy/deploy_id_rsa"
- "cap production deploy"
Em deploy.rb setou-se a chave criada.
set :ssh_options, keys: ["config/deploy/deploy_id_rsa"] if File.exist?("config/deploy/deploy_id_rsa")
E no arquivo production.rb foi adicionado a linha passando o usuário e o endereço da maquina criada no Servidor do Digital Ocean
role :web, %w{deploy@exemplo}
E por fim, rodou-se o comando e tratou os erros durante o deploy
cap production deploy
Empacotamento .deb
[editar | editar código-fonte]Referências
[editar | editar código-fonte]- ↑ Gerência de Mudança. univasf.edu.br/~ricardo.aramos/disciplinas/. Página visitada em 26 de abril de 2016.
- ↑ Gerência de Configuração de Software. univasf.edu.br/~ricardo.aramos/disciplinas/. Página visitada em 26 de abril de 2016.
- ↑ Integração contínua. devmedia.com.br/integracao-continua-uma-introducao-ao-assunto. Página visitada em 26 de abril de 2016.
- ↑ Virtualização. vmware.com/br/virtualization/how-it-works. Página visitada em 25 de maio de 2016.
- ↑ Vagrant. vagrantup.com. Página visitada em 26 de abril de 2016.
- ↑ Gerência de Configuração de Software. Página visitada em 01 de Junho de 2016.
- ↑ Montando Ambiente de de desenvolvimento portátil. Página visitada em 01 de Junho de 2016.
- ↑ Deploying with Travis and Capistrano. Página visitada em 26 de Junho de 2016.