Capistrano com GIT, Tutorial Básico
Primeiro é importante colocar seu projeto rodando com GIT. Não vou explicar como instala-lo pois já existe muito material sobre isso. Mas depois da instalação o que precisamos fazer é a configuração global:
git config --user.name "Daniel Lopes"
git config --user.email "danielvlopes@areacriacoes.com.br"
Desta forma você já terá seu arquivo .gitconfig configurado, mas também podemos abrir este arquivo direto em algum editor de texto e altera-lo, também é possivel alterar esses valores apenas chamando o mesmo comando novamente.
Para ver o conteúdo do .gitconfig você pode navegar até o diretório de seu usuário basta fazer como abaixo:
cat ~/.gitconfig
Lembrando que para quem não está acostumado com Unix ainda o ~ diz respeito a pasta do usuário, no meu caso /Users/daniellopes .
Em meu arquivo de config também adicionei cores, como abaixo:
[user]
name = Daniel Lopes
email = danielvlopes@gmail.com
[color]
status = auto
branch = auto
Agora basicamente o que temos que fazer é navegar para dentro do diretório do nosso projeto Rails e depois criar um arquivo .gitignore (este arquivo serve para dizer ao GIT o que ignorar).
O conteúdo para os meus projetos é algo mais ou menos assim:
log/*.log
tmp/**/*
.DS_Store
doc/api
doc/app
config/database.yml
Salve este arquivo no raiz de seu projeto. Agora inicie um repositório git no seu aplicativo:
git init
e em seguida adicione todos os arquivos:
git add .
em seguida execute
git statuse veja que todos os arquivos foram adicionados. Agora precisamos realizar o primeiro commit em nosso projeto.
git commit -m "commit inicial"
Agora trabalhe normalmente e executando git add “nome do arquivo” e git commit -m “mensagem” (ou talvez execute git commit -a -m “mensagem” para adicionar todos os arquivos).
No entanto agora precisamo empurrar tudo isso que fizemos para um servidor remoto, será deste servidor que o capistrano irá baixar o código atual e colocar no serivdor onde nosso aplicativo em produção se encotrará.
Como estou trabalhando com Railsplayground e eles não tem suporte a SSH para GIT precisamos criar um arquivo .netrc na pasta de nosso usuário no meu caso Users/daniellopes , este arquivo será responsável por autenticar nosso usuário no servidor da RailsPlayground.
No meu caso o conteúdo está assim:
machine meudominio.svnrepository.com
login meuusuario
password minhasenha
Agora sim podemos dizer ao git qual será a url do nosso repositório remoto. Existem duas forma de fazer isso, através do comando abaixo no terminal:
git remote add origin git://meudominio/pub/meuproj/projeto.git
Ou editando o arquivo config dentro do diretório .git do nosso projeto. Para isso basta digitar mate .git/config (ou abrir o arquivo em qualquer editor de texto) a partir do rails do seu projeto Rails. Dentro do arquivo você deve colocar algo como abaixo no final do arquivo:
[remote "origin"]
url = http://domain.svnrepository.com/git/projeto
Se você fizer através do comando git remote e depois abrir o .git/config verá que o comando já inseriu estes valores.
Ótimo, tudo ok… só precisamos enviar nossos arquivos para o repositório remoto. Para isso basta:
git push origin master
Onde origin é o nome do servidor remoto que acabamos de criar através do comando git remote e master é branch que desejamos enviar para para o repo remoto.
Agora precisamos instalar(para quem estiver no Mac OSX Leopard, apenas atualizar) o capistrano. No terminal execute:
gem install capistrano
Se estiver no Leopard execute gem update capistrano .
Agora no diretório de seu projeto execute o comando:
capify .
Este comando irá criar alguns arquivos necessários para utilizar o capistrano, como por exemplo o arquivo deploy.rb dentro de sua pasta config. Abrindo o arquivo você verá algo parecido como abaixo:
set :application, "set your application name here"
set :repository, "set your repository location here"
# If you aren't deploying to /u/apps/#{application} on the target
# servers (which is the default), you can specify the actual location
# via the :deploy_to variable:
# set :deploy_to, "/var/www/#{application}"
# If you aren't using Subversion to manage your source code, specify
# your SCM below:
# set :scm, :subversion
role :app, "your app-server here"
role :web, "your web-server here"
role :db, "your db-server here", :primary => true
Agora precisamos trocar estes valores para as configurações ideais para nosso projeto. Como estamos usando GIT precisamos dizer isso e também precisamo dizer qual é o endereço do repositório GIT ao qual o capistrano terá acesso. No meu caso estou RailsPlayground e para solicitar um repositório GIT basta pedir no suporte que em alguns minutos eles enviam um usuário do painel administrativo onde você irá criar o repositório GIT e atribuir permissão a algum usuário.
O meu arquivo de deploy por enquanto será algo parecido com isso:
# ==============================================================
# SET's
# ==============================================================
default_run_options[:pty] = true
set :repository, "http://meudominio.svnrepository.com/git/projeto"
set :scm, "git"
set :scm_passphrase, "senha_do_repositorio"
set :scm_user, "usuario_do_repositorio"
set :user, "usuario_do_servidor_onde_sera_enviado_os_arquivos"
set :domain, "meudominio.com.br"
set :application, "meu_aplicativo"
set :use_sudo, false #railsplayground nao aceita sudo
set :branch, "master" #branch que sera copiado
set :deploy_to, "/home/#{user}/#{application}" #pasta para onde serao enviados os arquivos
set :deploy_via, :remote_cache
set :git_shallow_clone, 1
set :remote, user
set :scm_verbose, true
set :copy_cache, true
set :keep_releases, 3 # mantem 3 versoes, posso fazer ate 3 rollbacks de versao
# ==============================================================
# ROLE's
# ==============================================================
role :web, domain
role :app, domain
role :db, domain, :primary => true
# ==============================================================
# TASK's
# ==============================================================
task :after_update_code, :roles => [:web, :db, :app] do
run "chmod 755 #{release_path}/public -R"
end
Desta forma estou configurando o SCM (source code manager) para GIT, apontando para onde será enviado os arquivos e depois rodando um CHMOD para alterar os privelégios. Estou usando use_sudo false pois no RailsPlaygroudn não podemos executar sudo.
Ótimo desta forma agora a única coisa que precisamos fazer é executar:
cap deploy:setup
cap deploy:cold
Passo 9
Utilizamos deploy:cold pois é nosso primeiro deploy, depois disso podemos apenas rodar cap deploy e nossa app irá para o ar. Mas uma coisa é um certo o problema, e se tivermos uma pasta de onde os usuário fazem upload por exemplo… perderemos tudo sempre que fizermos deploy? Para este tipo de caso podemos utilizar a pasta shared criada pelo capistrano no servidor, nela estão os arquivos compartilhados entre os releases… podemos por exemplo utilizar esta pasta para guarda um copia do nosso database.yml e enviroment.rb e copia-los através de uma task em nosso deploy.rb.
Por enquanto vamos resolver o problema da pasta de uploads. Abra seu deploy.rb novamente e acrescente:
namespace :assets do
task :symlink, :roles => :app do
assets.create_dir
run <<-CMD
rm -rf #{release_path}/public/images/upload &&
ln -nfs #{shared_path}/upload #{release_path}/public/images/upload
CMD
end
task :create_dir, :roles => :app do
run "mkdir -p #{shared_path}/upload"
end
end
Nesta tarefa nós criamos um link simbólico da pasta /images/upload do projeto para a pasta #{shared_path}/upload #{release_path}/public/images/upload do capistrano.
Conclusão
Depois de executar o upload, Capistrano irá criar um estrutura de diretórios contendo os releases de sua aplicação e a pasta de arquivos compartilhados. Existem muitas coisas importantes para aprender com capistrano como rollbacks, tela de manutenção, stages e etc.
Lembrando que capistrano e git é muito além disso e não podemos cobrir tudo em um tutorial (mesmo porque eu não sei tudo :D ), mas isto já é o suficiente para você colocar seu projeto no ar apenas usando cap deploy no terminal.
Para saber mais sobre git aconselho fortemente que compre o livro de GIT do peepcode .
E para ter mais informações sobre capistrano com git veja este screencast de Scolt Chacon .
Um material interessante para aprender sobre git é http://www.gitcasts.com/ .
E por fim para trabalhar com git no github basta seguir http://github.com/guides
Espero que este material ajude a melhorar seu processo de deploy e agilizar mais ainda seu desenvolvimento, e sempre, melhorando a qualidade.