TEM-DF

Fonte: Wikiversidade

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]

  1. Gerência de Mudança. univasf.edu.br/~ricardo.aramos/disciplinas/. Página visitada em 26 de abril de 2016.
  2. Gerência de Configuração de Software. univasf.edu.br/~ricardo.aramos/disciplinas/. Página visitada em 26 de abril de 2016.
  3. Integração contínua. devmedia.com.br/integracao-continua-uma-introducao-ao-assunto. Página visitada em 26 de abril de 2016.
  4. Virtualização. vmware.com/br/virtualization/how-it-works. Página visitada em 25 de maio de 2016.
  5. Vagrant. vagrantup.com. Página visitada em 26 de abril de 2016.
  6. Gerência de Configuração de Software. Página visitada em 01 de Junho de 2016.
  7. Montando Ambiente de de desenvolvimento portátil. Página visitada em 01 de Junho de 2016.
  8. Deploying with Travis and Capistrano. Página visitada em 26 de Junho de 2016.