Capistrano com GIT, Tutorial Básico


Acabei comprando um MacBook Pro, projetos em Rails usando windows estavam se tornando um sofrimento, em todos os projetos eu tinha que usar uma gambiarrazinha para o Attachment_fu funcionar, GIT eu já tinha desistido e RMagick era um sofrimento para instalar… isso são algumas coisas que me fizeram mudar para o MAC (está certo que agora não tenho mais meu 3D Studio sem ter que reiniciar no windows e também não tenho jogos :( ) mas em compensação agora posso ter um ambiente de trabalho muito mais estavel e confiável além de ser 100% compatível com todas as coisas do RAILS.

obs.: Antes que amantes do Linux reclamem dizendo que eu poderia instala-lo, me defendo dizendo que as coisas não eram tão faceis. Metade dos meus programas deixariam de funcionar e nunca fui muito fã do GIMP e nem do Blender :).

Desenvolvendo em Rails, Capistrano era algo que eu sempre sentia falta, mas já tinha desistido por causa do GIT no Windows e SVN sempre foi bem chato. Agora isso não era mais problema… :D

Aproveitando a dificuldade que tive para encontrar informações centralizadas sobre Capistrano com GIT e como tive um pouco de problemas para colocar o Capistrano funcionando no RailsPlayground em sharedhosting vou compartilhar os passos para colocar seu projeto funcionando com Capistrano e GIT.

Portanto não sou expert nem em GIT nem em Capistrano, mas os passos abaixo serviram para mim e podem ajudar mais pessoas. (também recomendo fortemente que você leia o livro de GIT do peepcode , é excelente ). Você também pode encotrar um cheat sheet de GIT neste link. Correções, sugestões e complementos são bem vindos.

Passo 1 – GIT:

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:

no terminal, digite

1
2
3

  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:

1
2

  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:

1
2
3
4
5
6
7

[user]
  name = Daniel Lopes
  email = danielvlopes@gmail.com
[color]
  status = auto
  branch = auto

Passo 2

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:
1
2
3
4
5
6
7

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:

Passo 3


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).

Passo 4

No entanto agora precisamo empurrar tudo isso que fizemos para um servidor remóto, 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:

1
2
3
4

machine meudominio.svnrepository.com
  login meuusuario
  password minhasenha

Passo 5

Agora sim podemos dizer ao git qual será a url do nosso repositório remóto. Existem duas forma de fazer isso, através do comando abaixo no terminal:

1
2

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:

1
2
3

[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 remóto. Para isso basta:

1
2

git push origin master
Onde origin é o nome do servidor remóto que acabamos de criar através do comando git remote e master é branch que desejamos enviar para para o repo remóto.

Passo 6

Agora precisamos instalar(para quem estiver no Mac OSX Leopard, apenas atualizar) o capistrano. No terminal execute:

1
2

  gem install capistrano

Se estiver no Leopard execute gem update capistrano .

Passo 7

Agora no diretório de seu projeto execute o comando:

1
2

  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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

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

Passo 8

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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

# ==============================================================
# 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:

1
2
3

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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

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.


8 Comentários to “Capistrano com GIT, Tutorial Básico”

Silva Developer diz:

Como sempre mais uma excelente dica e contribuição para a comunidade web.

Abraço,

Silva Developer


Weldys Santos diz:

Sempre é bom ver pessoas que colaboram com a comunidade. Parabéns pela iniciativa e obrigado por me fazer inveja com seu mac novo… :P


Davis Zanetti Cabral diz:

Uma dica para não manter a senha do teu repositório no script: set(:scm_password) { Capistrano::CLI.password_prompt(“GIT password: “) }

Muito bom o artigo, também hospedo na railsplayground e tive problemas e nem pude sair atrás de estudar isso. O artigo me economizou algumas horas.

Abraço!


daniel lopes diz:

Obrigado pela dica Davis.


Fernando Campos diz:

Parabéns pelo tutorial Daniel Lopes! Quero migrar meus projetos para o Git, mas não sei como vou fazer, pois utilizo Uma aplicação que se chama Codecharge no PHP. Todos os meus projetos são feitos nele, e para cada site tenho quatro projetos independentes rodando. Nem imagino como fazer isso com Git… Um abraço! Fernando


Daniel Lopes diz:

Olá, este tutorial também serve para você iniciar com PHP, leia o livro do PeepCode que falei no tópico que com certeza será capaz de usar GIT com PHP. Outra coisa que é legal você dar uma olhada na github.com, muito fácil de usar e excelente.


Eduardo Fiorezi diz:

Muitoo bom o tutorial… :)

Mas agora o Railsplayground tem GIT,, só pedir pra ativar lá,,, ;)


Daniel Lopes diz:

De fato, eles tem git sim. Não precisa usar o deploy :via_copy, vou alterar a explicação no tutorial. O chato do git na railsplayground é que você nao consegue logar por SSH no server deles, mas de resto é ótimo.


Comentário