ALMiniumを使って構築したMercurialにpushしようとしたら一筋縄ではいかなかった件【追記有り】

追記

以下、場当たり的な対応を行っていたためよろしくない設定方法です。正しい方法はこちらの「ALMiniumを使って構築したMercurialにpushしようとしたら一筋縄でいけた件。【ちゃんと本家のFAQ読んでませんでした。。orz】」の記事に記載しています。

Redmineで成果物の管理ってどうやるの?

先日にALMinium環境を構築してから色々と弄っています。そろそろRedmineに成果物を登録したいなと思ったのでALMiniumを使って構築した環境のMercurialにローカルのリポジトリをPushする事にしました。

どこにPushすればいいんだ?

備忘録のため新規にプロジェクトを作って流れをなぞってみます。
ALMiniumを使って構築されたRedmineでプロジェクトを新規作成する時にSCMを選択できる項目があると思います。まずそこで"Mercurial"を指定しましょう。いいですか? Mercurial*1 ですよ。

無事にプロジェクトが作成できたら設定 -> リポジトリとクリックしていきましょう。これでリポジトリのパスが表示されます。hgコマンドを使ってリポジトリにアクセスする場合は"リポジトリのパス"を使用します。なお、その下に記載されているアドレスはHTTPアクセス用です。

さっそくローカルで作成してたリポジトリをサーバにpushしよう

#クライアント側作業

oxdb$ hg push ssh://oxdb@sl62//var/opt/alminium/hg/prohoge 
ssh://oxdb@sl62//var/opt/alminium/hg/prohoge への反映中
oxdb@sl62's password:
遠隔ホスト: Not trusting file /var/opt/alminium/hg/prohoge/.hg/hgrc from untrusted user apache, group apache
遠隔ホスト: Not trusting file /var/opt/alminium/hg/prohoge/.hg/hgrc from untrusted user apache, group apache
変更点を探索中
遠隔ホスト: abort: could not lock repository /var/opt/alminium/hg/prohoge: Permission denied
中止: 未知の応答: 空文字列

はい。
やっぱりそう簡単にはいきませんか。見た感じでは2種類のエラーが出ているようですね。

  • Not trusting file
  • Permission denied

"Not trusting file"とは

どうやらこのエラーは警告のようです。例えこの警告が出たとしても処理は進みます。
この警告は貴方はこのリポジトリのオーナーでもなければ*2 Mercurialとしても管理してないユーザ、つまり信用できないリポジトリだよと教えてくれているようです。

この警告を消すためにはそのリポジトリは信用できるよとMercurialに教えてあげればいいんです。なのでリポジトリのオーナー名をhgrcファイル*3 に設定をしてやればOKです。

# サーバー側作業

# リポジトリのオーナー確認
[root@sl62 prohoge]# ls -la
合計 12
drwxr-xr-x  3 apache  apache  4096  48 18:01 2012 .
drwxr-xr-x. 8 apache  apache  4096  48 18:01 2012 ..
drwxr-xr-x  3 prohoge prohoge 4096  48 19:06 2012 .hg

# hgrcの[trusted]配下にユーザー名とグループ名を記述
[root@sl62 prohoge]# cat /etc/mercurial/hgrc
[trusted]
users = prohoge
groups = prohoge

Permission denied

よくある事ですよね。Redmineから作成したリポジトリのオーナーはapacheユーザとなっています。これでは書き込み権限がないのも当たり前ですのでパーミッションを変更してしまいましょう。*4

今後複数の人がアクセスする事を想定してリポジトリ管理用のアカウントを作成してしまいましょう。プロジェクト名はPROJECT HOGEなのでユーザ名はprohogeとします。

# サーバ側作業
[root@sl62 prohoge]# adduser prohoge
[root@sl62 prohoge]# passwd prohoge
ユーザー prohoge のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: 全ての認証トークンが正しく更新できました。

リポジトリの.hg配下を全てprohogeユーザがオーナーとなるように変更します。

# サーバー側作業
[root@sl62 prohoge]# ls -la
合計 12
drwxr-xr-x  3 apache apache 4096  48 18:01 2012 .
drwxr-xr-x. 8 apache apache 4096  48 18:01 2012 ..
drwxr-xr-x  3 apache apache 4096  48 20:41 2012 .hg
[root@sl62 prohoge]# chown -R prohoge:prohoge .hg/
[root@sl62 prohoge]# ls -la
合計 12
drwxr-xr-x  3 apache  apache  4096  48 18:01 2012 .
drwxr-xr-x. 8 apache  apache  4096  48 18:01 2012 ..
drwxr-xr-x  3 prohoge prohoge 4096  48 20:41 2012 .hg

これでクライアント側からのpushに対して警告もエラーも出なくなります。

# クライアント側作業
oxdb$ hg push ssh://prohoge@sl62//var/opt/alminium/hg/prohoge
ssh://prohoge@sl62//var/opt/alminium/hg/prohoge への反映中
prohoge@sl62's password: 
変更点を探索中
遠隔ホスト: adding changesets
遠隔ホスト: adding manifests
遠隔ホスト: adding file changes
遠隔ホスト: added 1 changesets with 1 changes to 1 files

これでやっとRedmineで成果物の管理も出来ます。

間違い探し

そうそう。違いに気づきますか?

# push失敗時
oxdb$ hg push ssh://prohoge@sl62/var/opt/alminium/hg/prohoge
ssh://prohoge@sl62/var/opt/alminium/hg/prohoge への反映中
prohoge@sl62's password: 
遠隔ホスト: abort: There is no Mercurial repository here (.hg not found)!
中止: 遠隔ホストの応答が不適切!
# push成功時
oxdb$ hg push ssh://prohoge@sl62//var/opt/alminium/hg/prohoge
ssh://prohoge@sl62//var/opt/alminium/hg/prohoge への反映中
prohoge@sl62's password: 
変更点を探索中
遠隔ホスト: adding changesets
遠隔ホスト: adding manifests
遠隔ホスト: adding file changes
遠隔ホスト: added 1 changesets with 1 changes to 1 files

分からないという方、これならどうでしょうか。

ssh://prohoge@sl62/
ssh://prohoge@sl62//

ネットワーク経由でリポジトリをアクセスする場合、/(シングルスラッシュ)だとユーザーのホームからの相対パスとして認識をするそうです。なので//(ダブルスラッシュ)を入力する事で絶対パスとなってリポジトリにアクセスできます。

*1:大事な事なので2回(略 僕はPythonが好きです

*2:hgrcファイルに記載がなくてもオーナーアカウントでアクセスした場合は警告はでません

*3:ファイルが存在しない場合は作成して下さい

*4:これをやっていいのかよくわかっていないのですが、非公開かつ個人サーバなのでまずは使えるようにします