スポンサーサイト

一定期間更新がないため広告を表示しています

  • 2013.01.21 Monday
  • -
  • -
  • -
  • -
  • by スポンサードリンク

subversion の post-commit 中で svn update できない件

やー、おひさしぶりです。ネタがないわけではないですが、ネタと言えるほどでもないネタばかりなので書いてませんでしたが、今回のは書きたい!まぢで書きたい!どこかに残しておきたい!

内容は表題の通り

subversion の post-commit 中で svn update がうまく動いてくれないという話

ひとつひとつ順番に行きます。

subversion にソースをコミットしたら Web サイト(つってもテスト環境ですけど)に即反映してほしい。つまるところ、デプロイの手間を省きたい。

subversion のリポジトリには hooks というディレクトリがあり、コミットなどをトリガーとして実行するスクリプトを置く場所があります。そこに指定の名前でスクリプトを置いておくと自動実行してくれます。コミット後にコミットしたソースをプログラムの実行環境にコピーすればいいというわけです。コミット直後に起動してくれるスクリプトは post-commit です。そんなわけで hooks/post-commit を作ります。

#!/bin/sh

LOG="/var/log/svn/post-commit.log"

SVNUSER=xxxxx
SVNPASS=xxxxx
SVNOPTS="--username ${SVNUSER} --password ${SVNPASS}"

echo "START ${1} ${2}" >> ${LOG}

svn ${SVNOPTS} update /var/www/html >> ${LOG}

echo "END ${1} ${2}" >> ${LOG}


本当は一時ディレクトリにワーキングコピーを作成して rsync でコピーしてるんですけど、サンプルですのでそこは割愛。んで、このスクリプト、コマンドライン上から実行した場合は正常に動作します。しかし、ソースコミット後に subversion がキックすると動きません。正確には svn update が動いていません。敢えて「echo "START/END"」を書いてあるのはこれの証明です。どちらの場合にも START と END はログに出力されています。どちらの場合にもスクリプトは最後まで動いているわけです。コマンドライン上から実行した場合はきっちり svn update は動いており、その挙動はログに出力されます。

「なんで?

そこでこのページ

つ Subversion関連のネタとWWWCのプラグイン - Subversion フックスクリプト
http://www.asahi-net.or.jp/~iu9m-tcym/svndoc/svn_hook_script.html

フックスクリプト中には何らかの制限があるんじゃないかと情報を探し回った結果行き着いたページです。そこにはこう書かれています。

フックスクリプトが実行されるときには、セキュリティ上の理由から環境変数(PATH 変数も)がすべて空の状態で起動されます

このためスクリプト内部で外部プログラムを起動する場合は絶対パスを使用するかスクリプト内部で環境変数を設定する必要があります。


「なるほど。コマンドが見つからなきゃ動かんわな。

つっても「コマンドが見つからなきゃその場でエラーだわな」とは思いつつも、スクリプトに echo ${PATH} >> ${LOG} を加えてみたんですが、PATH はありました。ただし env >> ${LOG} で出力してみると確かに環境変数に PATH はありませんでした。フックスクリプトをキックするまえに最低限ローカル変数で設定するように気をきかせてくれているようです。それは置いといて・・・念のためフルパスにしてみたけどやっぱり動かない。

「もしかしてフックスクリプト中は svn コマンドは動かないんじゃね?コミット中だからロックされてて無反応とかね

そこでこのページ

つ 地方で活動するweb制作者の日々を綴るblog - 【Subversion】mod_dav_svn(apache)経由でCommitした時に自動的にupdateを行う
http://blog.livedoor.jp/loopus/archives/50187497.html

勝手に紹介させてもらっておいて言うセリフではないと思うんですが、失礼ながら・・・特に新しい情報は・・ごにょごにょ。ただ単に同じようなことを考えて、かつうまく動作している例を探していたんです。まぁ、確信を得たかったわけです。フックスクリプト中に svn コマンドは使えるんです。じゃあ、なんで動かないの?

そこでこのページ

つ akiyan.com - Subversionのpost-commitフックでsvn updateできないときは
http://www.akiyan.com/blog/archives/2006/12/subversionpostc.html

キタ━━━━(゚∀゚)━━━━ッ!!!! 同じことで悩んだ方の記事!

この方の記事によると

/usr/local/bin/svn up /path/to/working/directory/* >> /tmp/svnupdate.log &


のようにワーキングコピーの後ろにワイルドカード(*)をつけると動作するようになったらしい。さっそくやってみると・・・動いた・・・。「Updated to revision xxxx.」とログに出力されている。今まではこれすら出力されていなかった。確かに動いたんだけど・・・テスト目的でコミットしたファイルはワーキングコピーに更新されていない。そして気持ちの悪いことに「Updated to revision xxxx.」は2行表示されている。なんで動いてるのにコピーされない?なんで2行?完全解決に至っていないと思われたのでさらに情報を求めて、同ページないで紹介されていた元情報と思わしきページを参照させてもらった。

つ Id of Radiance ver.5 - SubversionによるPHP開発環境バージョン管理話
http://idrad.atso-net.jp/index/solo/id/6236/SVN/

そこには・・・自分が陥っている状況より、さらに気持ち悪い状況があった(笑)。フックスクリプト中で2回 svn update をやって、片方は動くが、もう片方が動かないらしい。コマンドライン上で post-commit を動かすと両方成功するそうだ。うわー、いやらしいw

でも、同じようなことで悩んだ人達がいるんだなーて感じで目新しい情報はない。(すいません)

「どうにもならんわ・・・

と思いつつこのページ

Odyssey - Subversion Hooksでsvn updateできなかった件について。解決
http://blog.as-roma.com/tetsujin/index.php?itemid=952

この方の記事によると・・・日本語を使った名前のファイルが存在するとうまくいかない模様。そうか、日本語ファイルを消せばいいのか。Webアプリで日本語ファイル名とかナンセンスにもほどがある。まるごと削除してよかろう。どうせ要らないファイルに決まっている・・・はず・・・。えーと・・・つまり・・・何百あるディレクトリ中から何千あるファイルのなかから日本語ファイルを探してひとつづつ消せと・・・。めんどくさい・・・

「しかし、なんで日本語が問題になんの?仮に日本語があったとしてもコマンドライン上ではうごいてるで?

そこでひらめいた。コマンドライン上と subversion がキックしたときの差は・・・環境変数。日本語に関係しそうな環境変数・・・LANG!

そんなわけで LANG を追加したらきっちり動いた

LANG=en_US.UTF-8 /usr/bin/svn ${SVNOPTS} update /var/www/html >> ${LOG}


日本語ファイル名が問題なのにリージョンが en_US なのが不満だけど、システムのデフォルトがその設定だから仕方がない。

とりあえず完全解決でしょう?

今日の俺、ひさびさにさえてる。

丸一日使っちゃったんですけどね・・・

ついでに書いておくとワイルドカードを使って動いたときに出力されたふたつの「Updated to revision xxxx.」。ワーキングコピーのトップには4つのディレクトリと1つのファイルがあったんですが、2ヵ所だけ動作したということだと思われます。
svn up /path/*

svn up /path/hoge
svn up /path/foo
....

と書いているのと同じこと。事実上複数に展開されたコマンドのうち、配下に日本語ファイルがない2つのディレクトリは無事に完了したが、テストしていたファイルがあったディレクトリ配下には日本語ファイル名があったので動作しなかった。

当たり前と言えば当たり前かもしれませんが、これって仮にリポジトリのトップに新しいファイルもしくはディレクトリが増えた場合(つまりトップディレクトリが5個になった場合とか)、更新対象にならないってことじゃないかしら?そうだよね?

紹介させてもらったサイトの方は、きっと仕様書なども subversion で管理してたんではないでしょうか?仕様書なら日本語ファイル名でトップディレクトリに置きたくなりますよね。仕様書じゃないにしても、環境構築手順を書きなぐったメモとか。ワイルドカードを使えば、仕様書(日本語ファイル)を無視してソースディレクトリのみ動作しますよね。たぶんですけど。

どうです?完全解決でしょう?解決ですよね?

先人達の苦労と情報があり解決しました。紹介させてもらったサイトにはひとつづつ「こうしたらうまくいった!」とコメントさせていただこうかと思ったんですけど「全部にそれぞれに合った内容で書いてまわれって?^^;」という感じになりまして・・・やめておきました。

とりあえずここでお礼だけ。

あざーっす!

ときれいにまとめたフリをしてオレツッコミしますけど、結果から見れば今回の問題ってフックスクリプトはあんまり関係ないですよね。フックスクリプト中の制限により問題が発生していたとはいえ、svn コマンドの使用方法を理解していなかったことによるわけです。LANG をしっかり設定しないと正常動作を期待できなくなりますよ、と。

教訓:不自然なときは環境変数を疑え

スポンサーサイト

  • 2013.01.21 Monday
  • -
  • 20:53
  • -
  • -
  • -
  • by スポンサードリンク

コメント
こちらこそあざす
  • ななし
  • 2013/12/19 6:44 PM
すみません。こちらと同じ様な事をやろうとしているのですが、
どうしてもうまくいきません。
こちらでは、コマンドラインからでもsvn updateで更新対象が
表示されないのです。

/var/www/htmlディレクトリに対しては、svn importした
だけですよね?!
こちらでは、checkoutしたディレクトリでないとUpdate対象
になっていない様子です。

他のページにもできるような事が書いてあったのですが。
バージョンアップとか環境の違いのせいでしょうか。

こちらは、CentOS7 Subversion1.7 です
Y!知恵袋にも質問中ですのでそのURLも載せさせていただきました
何かご存知でしたら憶測でも構わないのでお知らせいただけたら
幸いです。
コメントする








   
この記事のトラックバックURL
トラックバック

calendar

S M T W T F S
    123
45678910
11121314151617
18192021222324
252627282930 
<< June 2017 >>

最近の記事

記事(カテゴリ別)

リンク

recent comment

recent trackback

  • 続 クロスドメインで使う XMLHttpRequest と CORS の話
    RougeBleu (07/31)

ブログ内検索

others