Capistrano com GIT, Tutorial Básico

Posted by Daniel Lopes on 25/06/2008

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 status
e 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.

blog comments powered by Disqus