Rails: semana de atualizações

Recentemente foram anunciados duas atualizações nos frameworks Rails. Para quem usava a versão 2.0.2 é recomendado passar a usar 2.0.4 e para quem já usava a 2.1.0 agora deve ir para 2.1.1.

A razão disso foram vulnerabilidades de segurança, especificamente para quem aceitava entrada de dados via XML. Isso foi prontamente corrigido e por isso as atualizações. Essas duas versões subiram hoje e até o fim do dia devem estar replicadas em todas as máquinas Linux compartilhada da Locaweb que suportam Rails.

Leia o resto do artigo para saber o que fazer. Além disso há mais novidades: Locarails versão 1.1.5. Continue lendo.

Atualizando o Rails

Se você é desenvolvedor Rails atualize na sua máquina também. Se estiver fazendo projetos com a versão 2.0.2 faça:

gem install rails –version=2.0.4

E se estiver fazendo projetos em Rails 2.1, faça:

gem install rails –version=2.1.1

No arquivo config/environment.rb do seu projeto em Rails 2.0.2, altere a seguinte linha:

RAILS_GEM_VERSION = ‘2.0.4′

E no mesmo arquivo, para projetos Rails 2.1, altere a mesma linha para:

RAILS_GEM_VERSION = ‘2.1.1′

Caso esteja com o Rails ‘congelado’ (freeze) dentro do diretório vendor/rails do seu projeto, atualize-o com:

rake rails:freeze:gems

Locarails

Finalmente, atualize seu projeto na Locaweb. E, neste ponto, outra atualização: o Locarails ganha versão 1.1.5.

Quando eu criei o Locarails o objetivo foi ajudar os desenvolvedores, principalmente os iniciantes, a utilizar o poder do pacote Capistrano, uma poderosa ferramenta de deployment automatizado. O Locarails deve ser instalado na sua máquina local de desenvolvimento, ele configurará a receita config/deploy.rb que o Capistrano usa, tudo de forma simples e sem codificação envolvida.

Porém, a versão inicial do Locarails funcionava perfeitamente com o Capistrano 2.4.3. Mas alguns dias atrás foi lançada a versão 2.5.0. Isso quebrou a compatibilidade e o Locarails passou a não se comportar corretamente. Eu mesmo já fiz as correções no Capistrano e enviei para apreciação do mantenedor do projeto, mas enquanto não é lançada a versão 2.5.1, resolvi atualizar o próprio Locarails para injetar as correções automaticamente.

Para atualizar ou instalar o Locarails na sua máquina local, faça:

gem install akitaonrails-locarails.

Recomendo refazer o processo inicial, então, a partir do diretório do seu projeto, faça:

cd meu_projeto

locarails . -f

A diretiva -f forçará a atualização da receita do Capistrano com a nova correção. Preencha os dados sobre sua hospedagem que ele pede. Depois, rode apenas uma vez:

cap deploy:setup

Finalmente, para colocar de fato sua aplicação em produção na hospedagem, faça:

cap deploy.

Toda vez que você modificar sua aplicação, apenas faça ‘cap deploy’. O Capistrano auxilia em outros cenários também. Digamos que você subiu na sua conta uma versão com bugs e quer rapidamente voltar seu site para a versão imediatamente anterior. Para isso, sem mexer no seu código ainda, faça apenas:

cap deploy:rollback

E instantaneamente seu site voltará ao ar sem os bugs. Você agora pode corrigí-los na sua máquina local e quando estiver realmente pronto, faça novamente ‘cap deploy’.

Brindes Locarails

Mais do que isso, as receitas do Capistrano permitem muito mais e no Locarails eu embuti algumas receitas que podem ajudá-lo. Por exemplo, digamos que você queira um backup do seu banco de dados MySQL. Para isso faça:

cap db:backup

Ele fará um dump da sua base, compactará utilizando tar e gzip e automaticamente já fará o download para sua máquina local no arquivo com o nome ‘dump.tar.gz’. O tempo do download, claro, dependerá do tamanho da sua base de dados e da velocidade de sua conexão.

Agora, digamos que alguma coisa errada aconteceu à sua base e você quer restaurar os dados que tinha puxado anteriormente. Garanta que existe o backup chamado ‘dump.tar.gz’ no diretório do seu projeto e então faça:

cap db:restore

Ele fará o upload do arquivo ‘dump.tar.gz’ à sua hospedagem e já fará a restauração do banco automaticamente. Cuidado: esta é uma operação destrutiva e ele obviamente apagará os dados do seu banco e colocará seu backup por cima. Tenha certeza do que está fazendo antes de usar este comando.

Finalmente, digamos que você note algum comportamento estranho na sua aplicação Rails e quer rapidamente ver o log para checar. Para isso use o comando:

cap log:tail

Ele fará um ‘tail’ remoto no arquivo ‘production.log’ da sua aplicação Rails. O tail, para quem não conhece, é um comando que ‘observa’ alterações num arquivo texto e já mostra imediatamente na sua tela. Portanto, se usar esse comando ele ficará lendo tudo que aparecer no arquivo de log. Vá no seu browser e faça sua aplicação dar problema e verá essa entrada aparecendo no seu log imediatamente. Cuidado: essa operação consome a banda da sua hospedagem e é recomendada apenas quando for muito necessário. Não deixe ela ligada indefinidamente.

Para usuários avançados, que conhecem os conceitos de SSH, sabe que as hospedagens Locaweb sempre suportaram conexão via SSH. Em especial, se estiver num Linux ou num Mac, você pode gerar um par de chaves - privada e pública - usando o comando “ssh-keygen -t rsa”. Normalmente isso irá gerar o par de chaves ‘~/.ssh/id_rsa’ e ‘~/.ssh/id_rsa.pub’. 

Quando você se conecta via SSH ele sempre pede a senha da sua conta. Para não pedir mais senha, você pode adicionar sua chave pública no arquivo ~/.ssh/authorized_keys em sua hospedagem. Para fazer isso automaticamente use o Capistrano novamente. Com as chaves já geradas e seguindo exatamente os nomes descritos acima, use o comando:

cap ssh:upload_key

E pronto, ele fará o upload da sua chave pública e, com isso, não será mais necessário digitar sua senha para entrar na hospedagem. Cuidado: Isso funciona porque o SSH fará a autenticação baseada na chave privada (id_rsa) que somente você tem. A segurança da chave privada é responsabilidade do seu dono e ela nunca deve ser enviada a ninguém nem a outra máquina. Considere sua chave privada algo tão ou mais importante que seu cartão de crédito, que você não mostra nem empresta a ninguém. 

Locarails para outros projetos

E quem disse que o Capistrano serve somente para projetos Rails? Se se eu quiser utilizar o Locarails para projetos não Rails, como em PHP por exemplo?

Digamos que você quer controlar seu blog em Wordpress usando Capistrano. Pois bem, crie um diretorio para isso:

mkdir wordpress

Agora, dentro dele, crie um diretorio chamado ‘public’

cd wordpress

mkdir config

mkdir public

Agora descompacte os fontes do wordpress - da maneira que melhor convir, seja simplesmente descomprimir um tar gzip ou fazer algo como svn checkout - na pasta public! Este é o truque!

Agora rode o comando locarails conforme explicado acima:

locarails .

cap deploy:setup

cap deploy

Realmente, eu não fiz esse teste ainda :-) Mas tecnicamente não há motivos para não funcionar porque a função do Capistrano é simplesmente pegar todos os fontes do seu projeto enviá-los ao servidor, independente da linguagem. No caso, a configuração padrão pensará que é um projeto Rails e inclusive criará o arquivo tmp/restart.txt no servidor imaginando que precisa reiniciar o Phusion Passenger. Mas tudo isso será inócuo à sua aplicação Wordpress e de graça você ganha as funcionalidades de rollback, que um dia pode ser fundamental.

Locarails + Git

E não é só isso. Ainda é uma funcionalidade experimental mas o Locarails já suporta configuração para Git. Além do mais todas as contas Linux da Locaweb automaticamente já suportam Git!

O exemplo mais simples é o seguinte:

rails teste

cd teste

git add .

git commit -a -m “initial commit”

locarails . -m git

cap deploy:setup

cap deploy

Os comandos acima criam um novo projeto Rails, então, de dentro do projeto executa-se o comando locarails com a opção para git. Ele fará algumas perguntas - basta dar enter quando a pergunta oferecer uma resposta padrão - e automaticamente criará um repositório Git remoto no seu servidor e já enviará seu código para lá.

A partir daí, toda vez que modificar seu projeto faça o seguinte:

git commit -a -m “minhas modificacoes”

git push 

cap deploy

Isso faz commit das suas modificações no repositório Git local. O ‘git push’ envia apenas as alterações para o repositório remoto no servidor. E o ‘cap deploy’ atualiza apenas o que foi modificado desde o último deployment, aumentando consideravelmente a velocidade das suas atualizações.

Git é um assunto mais avançado que merece um artigo à parte. Aguardem mais novidades sobre isso! E aproveitem para testar o Locarails. Qualquer dúvida em relação a esta ferramenta, enviem e-mail diretamente para mim em fabio.akita@locaweb.com.br.

8 respostas to “Rails: semana de atualizações”

  1. Gabriel Rinaldi Says:

    Olá, estou num Mac e estou recebendo o seguinte erro ao rodar o cap deploy:

    /Library/Ruby/Gems/1.8/gems/akitaonrails-locarails-1.1.6/lib/locarails/fix.rb:2:Warning: Gem::SourceIndex#search support for String patterns is deprecated
    Loading temporary fixes for Capistrano 2.5.x
    * executing `deploy’
    * executing `deploy:update’
    ** transaction: start
    * executing `deploy:update_code’
    * getting (via checkout) revision to /tmp/20081114032914
    executing locally: cp -R /Users/Gabriel/Aptana Studio/doce /tmp/20081114032914
    usage: cp [-R [-H | -L | -P]] [-fi | -n] [-pvX] source_file target_file
    cp [-R [-H | -L | -P]] [-fi | -n] [-pvX] source_file … target_directory
    * processing exclusions…
    *** [deploy:update_code] rolling back
    * executing “rm -rf /home/w2reinos/rails_app/doce/releases/20081114032914; true”
    servers: ["doce.megafono.com.br"]
    Password:
    [doce.megafono.com.br] executing command
    command finished
    /Library/Ruby/Gems/1.8/gems/akitaonrails-locarails-1.1.6/lib/locarails/copy.rb:47:in `initialize’: No such file or directory - /tmp/20081114032914/REVISION (Errno::ENOENT)
    from /Library/Ruby/Gems/1.8/gems/akitaonrails-locarails-1.1.6/lib/locarails/copy.rb:47:in `open’
    from /Library/Ruby/Gems/1.8/gems/akitaonrails-locarails-1.1.6/lib/locarails/copy.rb:47:in `deploy!’
    from /Library/Ruby/Gems/1.8/gems/capistrano-2.5.2/lib/capistrano/recipes/deploy.rb:204:in `load’
    from /Library/Ruby/Gems/1.8/gems/capistrano-2.5.2/lib/capistrano/configuration/execution.rb:128:in `instance_eval’
    from /Library/Ruby/Gems/1.8/gems/capistrano-2.5.2/lib/capistrano/configuration/execution.rb:128:in `invoke_task_directly_without_callbacks’
    from /Library/Ruby/Gems/1.8/gems/capistrano-2.5.2/lib/capistrano/configuration/callbacks.rb:27:in `invoke_task_directly’
    from /Library/Ruby/Gems/1.8/gems/capistrano-2.5.2/lib/capistrano/configuration/execution.rb:81:in `execute_task’
    from /Library/Ruby/Gems/1.8/gems/capistrano-2.5.2/lib/capistrano/configuration/namespaces.rb:186:in `send’
    … 25 levels…
    from /Library/Ruby/Gems/1.8/gems/capistrano-2.5.2/lib/capistrano/cli/execute.rb:14:in `execute’
    from /Library/Ruby/Gems/1.8/gems/capistrano-2.5.2/bin/cap:4
    from /usr/bin/cap:19:in `load’
    from /usr/bin/cap:19

    Se puder me ajudar eu gostaria muito que isso funcionasse!

  2. AkitaOnRails Says:

    @Gabriel, procure nunca usar diretórios de programação com espaço no nome. Veja “Aptana Studio”. Acredito que se você renomear esse diretório para ficar sem o espaço no meio deve funcionar. Vou ver se faço um fix pra isso na gem, mas por enquanto esse é o jeito mais curto.

  3. Marcos Winter Says:

    Como posso atualizar as gems do meu servidor , preciso utilizar gem brazilian-rails para a versão 2.0.10 , me falaram de colocar na vendor funciona imediatamente

  4. AkitaOnRails Says:

    @Marcos, veja este link http://ryandaigle.com/articles/2008/4/1/what-s-new-in-edge-rails-gem-dependencies

  5. Gabriel Rinaldi Says:

    @Akita
    Desculpe postar aqui de novo, mas agora o erro é na migração:
    * executing `deploy’
    * executing `deploy:update’
    ** transaction: start
    * executing `deploy:update_code’
    * getting (via checkout) revision to /var/folders/1B/1B42ch1WH088TP33orawpk+++TI/-Tmp-/20081126030602
    executing locally: cp -R /Users/Gabriel/FG2R/docedever /var/folders/1B/1B42ch1WH088TP33orawpk+++TI/-Tmp-/20081126030602
    * processing exclusions…
    compressing /var/folders/1B/1B42ch1WH088TP33orawpk+++TI/-Tmp-/20081126030602 to /var/folders/1B/1B42ch1WH088TP33orawpk+++TI/-Tmp-/20081126030602.tar.gz
    executing locally: tar czf 20081126030602.tar.gz 20081126030602
    servers: ["docedever.tempsite.ws"]
    ** sftp upload /var/folders/1B/1B42ch1WH088TP33orawpk+++TI/-Tmp-/20081126030602.tar.gz -> /tmp/20081126030602.tar.gz
    [docedever.tempsite.ws] /tmp/20081126030602.tar.gz
    [docedever.tempsite.ws] done
    * sftp upload complete
    * executing “cd /home/docedever/rails_app/docedever/releases && tar xzf /tmp/20081126030602.tar.gz && rm /tmp/20081126030602.tar.gz”
    servers: ["docedever.tempsite.ws"]
    [docedever.tempsite.ws] executing command
    command finished
    * executing `deploy:finalize_update’
    * executing “chmod -R g+w /home/docedever/rails_app/docedever/releases/20081126030602″
    servers: ["docedever.tempsite.ws"]
    [docedever.tempsite.ws] executing command
    command finished
    * executing “rm -rf /home/docedever/rails_app/docedever/releases/20081126030602/log /home/docedever/rails_app/docedever/releases/20081126030602/public/system /home/docedever/rails_app/docedever/releases/20081126030602/tmp/pids &&\n mkdir -p /home/docedever/rails_app/docedever/releases/20081126030602/public &&\n mkdir -p /home/docedever/rails_app/docedever/releases/20081126030602/tmp &&\n ln -s /home/docedever/rails_app/docedever/shared/log /home/docedever/rails_app/docedever/releases/20081126030602/log &&\n ln -s /home/docedever/rails_app/docedever/shared/system /home/docedever/rails_app/docedever/releases/20081126030602/public/system &&\n ln -s /home/docedever/rails_app/docedever/shared/pids /home/docedever/rails_app/docedever/releases/20081126030602/tmp/pids”
    servers: ["docedever.tempsite.ws"]
    [docedever.tempsite.ws] executing command
    command finished
    * executing “find /home/docedever/rails_app/docedever/releases/20081126030602/public/images /home/docedever/rails_app/docedever/releases/20081126030602/public/stylesheets /home/docedever/rails_app/docedever/releases/20081126030602/public/javascripts -exec touch -t 200811260306.32 {} ‘;’; true”
    servers: ["docedever.tempsite.ws"]
    [docedever.tempsite.ws] executing command
    command finished
    * executing `deploy:symlink’
    * executing `before_symlink’
    * executing “test -d /home/docedever/rails_app/docedever/releases/20081126030602/tmp || mkdir -m 755 /home/docedever/rails_app/docedever/releases/20081126030602/tmp”
    servers: ["docedever.tempsite.ws"]
    [docedever.tempsite.ws] executing command
    command finished
    * executing “test -d /home/docedever/rails_app/docedever/releases/20081126030602/db || mkdir -m 755 /home/docedever/rails_app/docedever/releases/20081126030602/db”
    servers: ["docedever.tempsite.ws"]
    [docedever.tempsite.ws] executing command
    command finished
    * executing “cp /home/docedever/rails_app/docedever/etc/database.yml /home/docedever/rails_app/docedever/releases/20081126030602/config/database.yml”
    servers: ["docedever.tempsite.ws"]
    [docedever.tempsite.ws] executing command
    command finished
    * executing “cd /home/docedever/rails_app/docedever/releases/20081126030602 && rake db:migrate RAILS_ENV=production”
    servers: ["docedever.tempsite.ws"]
    [docedever.tempsite.ws] executing command
    *** [err :: docedever.tempsite.ws] rake aborted!
    *** [err :: docedever.tempsite.ws]
    *** [err :: docedever.tempsite.ws] Unknown MySQL server host ‘200.234.202.120.locaweb.com.br’ (1)
    *** [err :: docedever.tempsite.ws]
    *** [err :: docedever.tempsite.ws]
    *** [err :: docedever.tempsite.ws] (See full trace by running task with –trace)
    *** [err :: docedever.tempsite.ws]
    ** [out :: docedever.tempsite.ws] (in /home/docedever/rails_app/docedever/releases/20081126030602)
    command finished
    *** [before_symlink] rolling back
    *** [deploy:update_code] rolling back
    * executing “rm -rf /home/docedever/rails_app/docedever/releases/20081126030602; true”
    servers: ["docedever.tempsite.ws"]
    [docedever.tempsite.ws] executing command
    command finished
    command “cd /home/docedever/rails_app/docedever/releases/20081126030602 && rake db:migrate RAILS_ENV=production” failed on docedever.tempsite.ws

  6. AkitaOnRails Says:

    @Gabriel O erro é este ” Unknown MySQL server host ‘200.234.202.120.locaweb.com.br’”

    Provavelmente seu servidor de MySQL ainda não tinha sido criado. Tente se logar diretamente pelo mysql client assim:

    mysql -u [seu usuario] -p -d [seu banco de dados] -h [seu servidor mysql]

  7. Gabriel Rinaldi Says:

    @Akita
    Infelizmente ele ta criado sim, tanto que no meu Mac eu uso ele. esse formato (IP+locaweb.com.br) está correto? Eu tentei em outro computador e formatar meu Mac mas os dois não deram certo…

  8. AkitaOnRails Says:

    aha! Claro que não :-) é só o Ip

Deixe um comentário