2011年6月23日木曜日

macからデプロイ時にエラー発生

開発環境をUbuntuからmacへ移行しています。Windowsしかしらなかった私ですが、ここ2年ほどでWindows→Linux→Macへと変わってしまいました。感慨深いものです。

そんな中、macだとCapistranoで妙なエラーが発生しているのを発見しました。
* executing "cd /var/rails/myapp/releases && tar xzf /tmp/20110614225357.tar.gz && rm /tmp/20110614225357.tar.gz"
    servers: ["myapp.jp"]
    [myapp.jp] executing command
*** [err :: myapp.jp] tar:
*** [err :: myapp.jp] Ignoring unknown extended header keyword `SCHILY.dev'
*** [err :: myapp.jp] 
*** [err :: myapp.jp] tar:
*** [err :: myapp.jp] Ignoring unknown extended header keyword `SCHILY.ino'
*** [err :: myapp.jp] 
*** [err :: myapp.jp] tar:
*** [err :: myapp.jp] Ignoring unknown extended header keyword `SCHILY.nlink'
*** [err :: myapp.jp] 
    command finished
どうやらmac標準のtar(bsdtar)だとXZ形式という圧縮形式のデータを扱うことができないようです。そこで、ローカルのmacにgnu tarをインストールします。

まずtarページヘアクセス。
http://www.gnu.org/software/tar/tar.html

1.26をダウンロード。
$ tar xfz tar-1.26.tar.gz
$ cd tar-1.26
$ ./configure
$ make
するとsrcにtarができているので、実行権限を与え、今のtarに上書きします。
$ cd src
$ chmod u+x tar
$ sudo cp ./tar /usr/bin
$ tar --version
tar (GNU tar) 1.26
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later .
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by John Gilmore and Jay Fenlason.
これでデプロイできるようになりました。

参考
http://d.hatena.ne.jp/takkan_m/20110213/1297557344
http://www.my-notebook.net/951e79e7-673a-468d-a44a-2dfd07f27248.html

2011年6月20日月曜日

Gitによるリモートリポジトリの作成

私は常にソースコードをネット上でシェアできるようにリモートリポジトリを作成するようにしています。

その方法をまとめておきます。

<サーバーでの作業>
まずサーバーにログインにして、リポジトリ用のディレクトリを作成します。
$ ssh user@myappserver.jp
$ cd /opt/git
$ mkdir my_project
$ cd my_project
ベアリポジトリ(作業ディレクトリを持たない)を作成します。
$ git --bare init
Initialized empty Git repository in /opt/git/my_project.git/
<ローカルでの作業>
ローカルに戻り、リポジトリのリモート設定を行います。
$ git remote add origin user@myappserver.jp:/opt/git/my_project.git
そして、ローカルリポジトリをpushします。
$ git push origin master
よく見かけるやり方としてローカルでgit cloneして、scpでアップする方法もあります。
こちらの方がスタンダードのようです。

2011年6月9日木曜日

database.ymlをGitから除外する

mysqlをつかった開発環境が複数ある場合、mysqlの実行環境がdatabase.ymlに記載されているため、pullするたびに自分の環境のものに書き換えなければならないことがあります。

Gitから除外してしまうと、CapistranoはGitの内容をそのままもってくるので、デプロイされなくなってしまいます。

この場合の解決策は下記の通りです。

・Gitから外す
・デプロイ時に本番サーバー上にあるdatabase.ymlをもってくる

以下が実際の手順です。

1 サーバーにあるdatabase.ymlを別の場所にコピーする
sshとかでログインして、cpコマンドでコピーします。
cp /var/rails/(app_name)/current/config/database.yml ~/config

2 ローカルのGitからdatabase.ymlを外す
git rm config/database.yml --cached
つぎに無視ファイルに登録します。
vim .gitigrore
下記を挿入します。
config/database.yml
変更内容をインデックスに登録します。
git add .gitignore
git add config/database.yml

3 config/deploy.rbを編集する
after "deploy:update_code", :config_database
task :config_database, :roles => :app do
  config_file = "/home/rails/(app_name)/config/database.yml"
  run "cp #{config_file} #{release_path}/config/database.yml"
end
config_fileにはサーバー上においたdatabase.ymlのパスを指定します。
git add config/deploy.rb

4 変更内容をGitへコミットする
git commit -m "database.ymlをGitから除外する"
git push origin master # 必要に応じて

5 デプロイする
cap deploy
以上です。

参考資料:RailsによるアジャイルWebアプリケーション開発

2011年6月7日火曜日

ActiveSupportの便利メソッド(日付編)

RailsではActiveSupportで実装された日付に関する便利なメソッドがあります。
d = Date.parse("2011/06/07")

d.tomorrow #=> 2011/06/08(明日)
d.yesterday #=> 2011/06/06(昨日)
d.beginning_of_month #=> 2011/06/01(月初)
d.end_of_month #=> 2011/06/30(月末)
d.months_ago(2) #=> 2011/04/07(2ヶ月前)
d.months_since(2) #=> 2011/08/07(2ヶ月後)
英文のように表現できますね。
ところで、5月31日の1ヶ月前はいつになるのでしょうか。
d = Date.parse("2011/05/31")
d.months_ago(1) #=> 2011/04/30
月末とみるのでしょうか。じゃあ5月30日の1ヶ月前は?
d = Date.parse("2011/05/30")
d.months_ago(1) #=> 2011/04/30
これには納得。しかし、5月31日と30日の1ヶ月前が同じになるということはバッチ処理とかで1ヶ月後に1回だけ行いたい場合には注意が必要ですね。

days_sinceといったメソッドはないようですが、3日後はどうやって実装するのでしょうか。
d.since(3.day)
sinceには秒で渡します。しかし、これだとDateTime型が返ってきます。Date型がほしい場合は、
d.since(3.day).to_date
とすればOKです。

ActiveSupportのドキュメントは下記です。
http://as.rubyonrails.org/