• このエントリーをはてなブックマークに追加

最近ようやく Carton の使い方を少しずつ覚えている今日この頃.ローカル環境で carton bundle して詰め込んで,Git フックスクリプトに caron install --cached などと書くことで,詰め込んだモジュールたちをみごとにデプロイ先でインストールなどしてくれてとてもありがたいです.

そんな中,自ビルドな MySQL (--prefix=$HOME/local/mysql)を DBD::mysql 経由で使用するようなアプリケーションを作っていて,デプロイ時に carton install したりごにょごにょしたりする Git フックスクリプトでちょこっとハマりました.

スクリプトの一部は次のような感じです:

# post-receive
...
 
source $HOME/perl5/perlbrew/etc/bashrc
perlbrew use 5.14.3@myapp
 
carton install --cached
 
# データベース構成の変更等のSQLを適用する
PLACK_ENV=deployment carton exec -- perl $BASEDIR/script/migrate_db.pl
 
...

このスクリプト,エラーもなく実行されたのでうまくいったと思いきや,対象のデータベースを見てみると,構成の変更が反映されていませんでした.

(中略)

以前,cpanm で DBD::mysql のインストールに失敗してた ことを思い出し,mysql_config のパスが合ってないんでないか?と疑うに至りました.(自ビルドのヤツは $HOME/local/mysql/bin/mysql_config,デフォルトのヤツは /usr/bin/mysql_config

そこで,フックスクリプトを,次のように書き換えました:

# post-receive
...
 
source $HOME/perl5/perlbrew/etc/bashrc
perlbrew use 5.14.3@myapp
 
PATH=$HOME/local/mysql/bin:$PATH \
    carton install --cached
 
# データベース構成の変更等のSQLを適用する
PLACK_ENV=deployment carton exec -- perl $BASEDIR/script/migrate_db.pl
 
...

carton install の際に環境変数 PATH に手を加えています.

結果,データベースの構成変更が反映されており,今度こそうまくいったようです.

...ということで,Git フックスクリプト経由で DBD::mysql を Carton で入れる場合は,mysql_config へのパスをしっかり通しておく,これが肝心なのかな,と思いました.

ちなみに,解決まで 3時間くらいかかりました...orz

データベース構成変更などするスクリプトでは

$dbh->do($sql) or croakf '...';  # use Log::Minimal

のようにしてるけど,これだとエラー拾わないのかなぁ...要調査.