- 2009-07-26 (日) 3:40
- Eclipse | Redmine | Subversion
こんにちは。kubomaです。
今日はさくらインターネットでのSubversion運用と、そのSubversionに対するEclipse+Subversiveからの鍵交換方式SSHの接続設定(svn+ssh)をするまでの設定について記載します。
またRedmineとSubversionの連携についても記載します。
ここではRedmineは別サーバで稼働するケースを想定しています。
# 実際さくらインターネット上でのRedmine稼働は可能ですが、かなり遅くて実用には向かないと思いました。
今回のゴール
- さくらインターネットのサーバとPoderosaを用いて鍵交換方式のSSH接続を行う
- さくらインターネットのサーバでSubversionを稼働させる
- さくらインターネットのサーバ上のSubversionに、クライアント側(Windows)のEclipse+Subversiveから接続、使用できるようにする
- 別サーバのRedmineとさくらインターネットのサーバ上のSubversionを連携させる
サーバはさくらインターネットのレンタルサーバ、クライアントは自宅のWindows XPです。
またRedmineが別サーバのCentOS上にインストール済みです。
Redmineのインストールから稼働までについては、当ブログの以前の記事サクッとCentOS 5.3にRedmine + Passenger環境をインストールを参考にしてください。
注意点
当記事中のuserは、さくらインターネット上のユーザ名を示します。
またserverは、さくらインターネット上のサーバ名を示します。
みなさんの環境に合わせて読み替えてください。
使用したソフトウェアのバージョン
| さくらインターネットのOS | FreeBSD 7.1-RELEASE-p6 i386 | |
|---|---|---|
| Poderosa | 4.1.0 | |
| Subversion | 1.6.3 | sourceからインストール |
| Eclipse+Subversive | 3.4.2 | Pleiades All in One 3.4.2.20090426のJavaバージョンを使用。 |
| Redmine | 0.8.3.stable |
さくらインターネットのサーバとPoderosaを用いて鍵交換方式のSSH接続を行う
ここでやっていることは、一般的な鍵交換方式によるSSH接続の設定になります。
なおさくらインターネットのSSH(sshd)はパスワードによる認証を禁止することは恐らくできません。
Poderosaで公開鍵/秘密鍵のペアを作成
Poderosaの[ツール]-[SSH鍵作成ウィザード]でDSA-2048bitで鍵を作成し(RSAや2048bit以外のbit数でも上手く行くと思いますが、確認はしていません)、秘密鍵とOpenSSH形式の公開鍵を保存します。
秘密鍵はローカルのどこかに置きます。
公開鍵はWinSCPなどでさくらサーバの以下の場所に置きますので、いったんローカルに保存します。
生成した公開鍵を、WinSCPなどでさくらサーバの所定の位置に配置
配置場所は、
$HOME/.ssh/authorized_keys2
です。
既にそのファイルが存在する場合には、置き換えではなく追記するようにします。
cat id_dsa.put >> authorized_keys2
Poderosaで接続
[ファイル]-[新規TELNET/SSH接続]を実行し、新規接続ダイアログを開きます。
[SSHパラメータ]の認証方法を公開鍵とし、パスフレーズは鍵生成時に入力したものを指定、鍵ファイルはローカルに保存した秘密鍵を指定します。
[OK]ボタンを押し、ログインに成功すれば無事完了です。
さくらインターネットのサーバでSubversionを稼働させる
Subversionへのインターフェース(スキーマ)はhttp/https/svn/svn+sshなど色々な形があります。
ここではセキュリティを考慮し、svn+sshスキーマを用いることにします。
ググると分かりますが、Subversionのインストールについて書かれた様々な文書がWeb上にはあり、またTracとの連携を前提としたものなども多く、結構混乱します。
公式には何を入れればよいのかは未だによく分かっていませんが、ここでは私が上手くいった方法を記載します。
これはかなり2つのアーカイブのみでインストールが完了する簡単な方法です。
Subversionのインストール
さくらインターネットに(簡単に)Subversionを入れてみるの手順に従って行いました。
~/archives以下で作業し、$HOME/local以下にインストールしています。
[user@server ~/archives]$ wget http://subversion.tigris.org/downloads/subversion-1.6.3.tar.gz [user@server ~/archives]$ wget http://subversion.tigris.org/downloads/subversion-deps-1.6.3.tar.gz [user@server ~/archives]$ tar zxvf subversion-1.6.3.tar.gz [user@server ~/archives]$ tar zxvf subversion-deps-1.6.3.tar.gz [user@server ~/archives]$ cd subversion-1.6.3 [user@server ~/archives/subversion-1.6.3]$ ./configure --prefix=$HOME/local --with-ssl --without-berkeley-db [user@server ~/archives/subversion-1.6.3]$ gmake clean [user@server ~/archives/subversion-1.6.3]$ gmake [user@server ~/archives/subversion-1.6.3]$ gmake install
今のSubversionはデフォルトでBerkeleyDBではなくFSFSを使用するため、configure時に–without-berkeley-dbを指定しているものと思います。
インストール後、$HOME/local/binにPATHが通ってる場合、
[user@server ~/archives/subversion-1.6.3]$ which svn /home/user/local/bin/svn
となるはずです。
svnコマンドの文字化け(LANGの設定変更?)
上記インストール後、
svn --version
などを実行すると、
svn, ?\227?\131?\144?\227?\131?\188?\227?\130?\184?\227?\131?\167?\227?\131?\179 1.6.3 (r38063) ?\227?\130?\179?\227?\131?\179?\227?\131?\145?\227?\130?\164?\227?\131?\171?\230?\151?\165?\230?\153?\130: Jul 25 2009, 12:37:00 Copyright (C) 2000-2009 CollabNet. Subversion is open source software, see http://subversion.tigris.org/ This product includes software developed by CollabNet (http://www.Collab.Net/). ?\228?\187?\165?\228?\184?\139?\227?\129?\174?\227?\131?\170?\227?\131?\157?\227?\130?\184?\227?\131?\136?\227?\131?\170?\227?\130?\162?\227?\130?\175?\227?\130?\187?\227?\130?\185 (RA) ?\227?\131?\162?\227?\130?\184?\227?\131?\165?\227?\131?\188?\227?\131?\171?\227?\129?\140?\229?\136?\169?\231?\148?\168?\227?\129?\167?\227?\129?\141?\227?\129?\190?\227?\129?\153: (後略)
という風に文字化けして表示されることがあります。
どうも環境変数LANGがらみの問題らしいですが、私自身はこの現象があまり理解できていません。
とりあえずさくらインターネット、svn、文字化けにあるように、環境変数LANGをUTF-8にすると化けないようです。
[user@server ~/.ssh]$ svn ?\228?\189?\191?\231?\148?\168?\230?\150?\185?\230?\179?\149?\227?\130?\146?\231?\159?\165?\227?\130?\138?\227?\129?\159?\227?\129?\132?\227?\129?\168?\227?\129?\141?\227?\129?\175 'svn help' ?\227?\129?\168?\230?\137?\147?\227?\129?\163?\227?\129?\166?\227?\129?\143?\227?\129?\160?\227?\129?\149?\227?\129?\132?\227?\128?\130 [user@server ~/.ssh]$ echo $LANG ja_JP.UTF-8 [user@server ~/.ssh]$ export LANG=UTF-8 [user@server ~/.ssh]$ echo $LANG UTF-8 [user@server ~/.ssh]$ svn Type 'svn help' for usage.
結局元々.bashrcで
export LANG=ja_JP.UTF-8
と指定していたのを、
export LANG=UTF-8
と変更しました。
Subversionのレポジトリ作成
例えばtestというレポジトリを作ってみます。
[user@server ~]$ mkdir -p svn/repos [user@server ~]$ cd svn/repos [user@server ~/svn/repos]$ svnadmin create test [user@server ~/svn/repos]$ cd ~/temp [user@server ~/temp]$ svn co file:///home/user/svn/repos/test test [user@server ~/temp]$ cd test [user@server ~/temp/test]$ svn mkdir trunk branches tags [user@server ~/temp/test]$ svn commit -m "first commit" [user@server ~/temp/test]$ cd .. [user@server ~/temp]$ rm -rf test
最後に、以下のようにローカルからfileスキーマ接続し、先ほどコミットしたtrunk/branches/tagsが確認できればOKとなります。
[user@server ~]$ svn list file:///home/user/svn/repos/test branches/ tags/ trunk/
$HOME/svn/repos/testにテスト用のレポジトリがあり、branches/tags/trunkというディレクトリが出来ている場合、上記のようになるはずです。
さくらインターネットのサーバ上のSubversionに、クライアント側(Windows)のEclipse+Subversiveから接続、使用できるようにする
前章で無事Subversionが稼働していますが、httpやhttpsによる公開は行っていない状態です。
ではどうやって自分のクライアント側から利用するかですが、Subversionの鍵交換方式によるsvn+sshスキーマを利用します。
これは基本的に当ブログの過去の記事Subversiveで鍵交換方式によるSSH接続の手順で行けますが、2点注意点があります。
1点はPuttyではなくPoderosaを利用している点、もう1点はさくらインターネットのレンタルサーバを利用している点、です。
Poderosaで作ったSECSH形式の秘密鍵をOpenSSH形式に変換する
上記の記事ではPuttyで作成したSSHの秘密鍵(Putty形式)をOpenSSH形式に変換することがポイントですが、今回はPoderosaを使用しています。
この記事の冒頭、Poderosaで生成した秘密鍵はSECSH形式でありOpenSSH形式ではありませんので、同じくOpenSSH形式に変換する必要があります。
(OpenSSH形式に変換するのは、SubversiveがOpenSSH形式の鍵を必要とするからです。)
Poderosa自身にはこの機能はありませんので、Puttyを利用します。
具体的な手順は、
SSHクライアントの秘密鍵/公開鍵についてまとめの後半「SECSH←→OpenSSH形式の相互変換はどうするの?編:」を参照してください。
上記の手順でOpenSSH形式に変換できます。
svn+sshスキーマでのさくらインターネットサーバへの接続が、svnserve: command not foundにより失敗する
これはサーバにおいてSSHのコマンド検索パス上にSubversionの各実行ファイルが存在しないことが原因です。
さくらサーバでsvn+sshを利用する方法(Linux/Mac)やさくらインターネットに設置した subversion で ssh ログイン時に発生するエラーを参照していただくと分かりますが、SSHのコマンド検索パスと.bashrcなどの各種シェル環境設定ファイル上で設定したPATHは関連していないようです。
私の環境では
$HOME/local/bin
以下にSubversionのコマンド群がインストールされていますが、$HOME以下でSSHのコマンド検索パス上にあるのは
$HOME/bin
だけです。
そのためコマンドが見つからないというエラーが発生します。
これを解決するには、以下のようにシンボリックリンクを貼るなどして、
$HOME/bin
にSubversionのコマンド群が存在するようにします。
[user@server ~]$ ln -s $HOME/local/bin $HOME/bin
別サーバのRedmineとさくらインターネットのサーバ上のSubversionを連携させる
RedmineとSubversionの連携設定をします。
タイトルに別サーバのとありますが、同一サーバである場合も同じ設定で動きそうです。(fileスキーマを使う方が簡単かもしれませんが)
Redmineの稼働について
今回は別サーバですでにRedmineが稼働しているものとします。
Redmineのインストールから稼働までについては、当ブログの以前の記事サクッとCentOS 5.3にRedmine + Passenger環境をインストールを参考にしてください。
RedmineとSubversionの連携1: Redmineの入ったサーバで、Subversionのコマンド群を利用可能にする
プロジェクト管理ソフトウェアRedmine 日本語情報 (unofficial) – リポジトリなどに記載のある通り、RedmineとSubversionを連携させる場合、RedmineのサーバでSubversionのコマンド群が利用可能になっている必要があります。
ここでは当記事のSubversionのインストールなどに従い、Subversionを適切にインストールしたものとします。
RedmineとSubversionの連携2: RedmineサーバからSubversionサーバに対し、Redmine(Apache)の実行ユーザで、パスフレーズの入力なしで(non-interactive, ノンパス)SSH接続可能にする
今回さくらインターネット上に構築したSubversionは、http/httpsスキーマでの公開をしていないため、svn+sshスキーマで接続することになります。
この場合RedmineサーバからSubversionサーバに対し、Redmine(Apache)の実行ユーザで、パスフレーズの入力なしに鍵交換方式のSSH接続が出来ている必要があります。
ssh-agent でパスフレーズの入力を省くなどを参考にして、それらの設定を行ってください。
これらの設定が完了した場合には、Redmineが稼働しているサーバのRedmine(Apache)の実行ユーザで以下のコマンドを実行し、パスワードを入力することなしに結果が返ってくるはずです。
[redmine@redmine ~]$ svn list svn+ssh://user@server/home/user/svn/repos/test branches/ tags/ trunk/
これは、当記事のSubversionのレポジトリ作成で確認したローカルからのfileスキーマでの接続確認の、svn+sshスキーマ版となります。
ここではredmineユーザにてコマンドを実行しています。
接続URLでuser@serverという風にさくらインターネット上のユーザを指定していることに注意してください。
RedmineとSubversionの連携3: Redmine上でリポジトリの設定を行い、Redmine上からリポジトリを参照可能にする
ようやく最後です。
Redmine上からさくらインターネット上のSubversionへの参照を行います。
まずプロジェクトの[設定]-[リポジトリ]から、SCMの設定を行います。
| 入力欄 | 入力例 |
|---|---|
| SCM | Subversion |
| URL | svn+ssh://server/home/user/svn/repos/test (svn+ssh://[サーバ][リポジトリのフルパス] |
| ログイン | さくらインターネット上のユーザ名 |
| パスワード | なし |
次にメニューの[ファイル]等をクリックし、いったんプロジェクトメニューを再描画します。
するとメニューに[リポジトリ]が現れる([設定]-[リポジトリ]とは別です)ので、クリックします。
これで以下のようにSubversionのリポジトリが表示されれば成功です。
上手く行ったでしょうか?
Redmineのバージョンに依るかもしれませんが、私の環境(0.8.3.stable)では以下のエラーメッセージが画面上に表示されました。
リポジトリに、エントリ/リビジョンが存在しません。
Redmineのログを見てみると、以下のようなエラーが出ています。
Error parsing svn output: #<REXML::ParseException: No close tag for /lists/list> /usr/lib/ruby/1.8/rexml/parsers/treeparser.rb:28:in `parse' /usr/lib/ruby/1.8/rexml/document.rb:205:in `build' /usr/lib/ruby/1.8/rexml/document.rb:42:in `initialize' /home/redmine/lib/redmine/scm/adapters/subversion_adapter.rb:85:in `new' /home/redmine/lib/redmine/scm/adapters/subversion_adapter.rb:85:in `entries' /home/redmine/lib/redmine/scm/adapters/abstract_adapter.rb:177:in `call' /home/redmine/lib/redmine/scm/adapters/abstract_adapter.rb:177:in `shellout' /home/redmine/lib/redmine/scm/adapters/abstract_adapter.rb:175:in `popen' /home/redmine/lib/redmine/scm/adapters/abstract_adapter.rb:175:in `shellout' /home/redmine/lib/redmine/scm/adapters/abstract_adapter.rb:165:in `shellout' /home/redmine/lib/redmine/scm/adapters/subversion_adapter.rb:82:in `entries' /home/redmine/app/models/repository.rb:63:in `entries' /home/redmine/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:173:in `send' /home/redmine/vendor/rails/activerecord/lib/active_record/associations/association_proxy.rb:173:in `method_missing' /home/redmine/app/controllers/repositories_controller.rb:71:in `show' /home/redmine/vendor/rails/actionpack/lib/action_controller/base.rb:1166:in `send' /home/redmine/vendor/rails/actionpack/lib/action_controller/base.rb:1166:in `perform_action_without_filters' /home/redmine/vendor/rails/actionpack/lib/action_controller/filters.rb:579:in `call_filters' /home/redmine/vendor/rails/actionpack/lib/action_controller/filters.rb:572:in `perform_action_without_benchmark' /home/redmine/vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue' /usr/lib/ruby/1.8/benchmark.rb:293:in `measure' /home/redmine/vendor/rails/actionpack/lib/action_controller/benchmarking.rb:68:in `perform_action_without_rescue' /home/redmine/vendor/rails/actionpack/lib/action_controller/rescue.rb:201:in `perform_action_without_caching' /home/redmine/vendor/rails/actionpack/lib/action_controller/caching/sql_cache.rb:13:in `passenger_orig_perform_action' /home/redmine/vendor/rails/activerecord/lib/active_record/connection_adapters/abstract/query_cache.rb:33:in `cache' /home/redmine/vendor/rails/activerecord/lib/active_record/query_cache.rb:8:in `cache' /home/redmine/vendor/rails/actionpack/lib/action_controller/caching/sql_cache.rb:12:in `passenger_orig_perform_action' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/railz/request_handler.rb:53:in `perform_action' /home/redmine/vendor/rails/actionpack/lib/action_controller/base.rb:529:in `send' /home/redmine/vendor/rails/actionpack/lib/action_controller/base.rb:529:in `process_without_filters' /home/redmine/vendor/rails/actionpack/lib/action_controller/filters.rb:568:in `process_without_session_management_support' /home/redmine/vendor/rails/actionpack/lib/action_controller/session_management.rb:130:in `process' /home/redmine/vendor/rails/actionpack/lib/action_controller/base.rb:389:in `process' /home/redmine/vendor/rails/actionpack/lib/action_controller/dispatcher.rb:149:in `handle_request' /home/redmine/vendor/rails/actionpack/lib/action_controller/dispatcher.rb:107:in `dispatch' /home/redmine/vendor/rails/actionpack/lib/action_controller/dispatcher.rb:104:in `synchronize' /home/redmine/vendor/rails/actionpack/lib/action_controller/dispatcher.rb:104:in `dispatch' /home/redmine/vendor/rails/actionpack/lib/action_controller/dispatcher.rb:120:in `dispatch_cgi' /home/redmine/vendor/rails/actionpack/lib/action_controller/dispatcher.rb:35:in `dispatch' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/railz/request_handler.rb:38:in `process_request' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/abstract_request_handler.rb:197:in `main_loop' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/railz/application_spawner.rb:340:in `start_request_handler' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/railz/application_spawner.rb:298:in `handle_spawn_application' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/utils.rb:176:in `safe_fork' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/railz/application_spawner.rb:296:in `handle_spawn_application' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/abstract_server.rb:332:in `__send__' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/abstract_server.rb:332:in `main_loop' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/abstract_server.rb:182:in `start_synchronously' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/abstract_server.rb:149:in `start' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/railz/application_spawner.rb:192:in `start' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/spawn_manager.rb:260:in `spawn_rails_application' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/abstract_server_collection.rb:121:in `lookup_or_add' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/spawn_manager.rb:254:in `spawn_rails_application' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/abstract_server_collection.rb:75:in `synchronize' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/abstract_server_collection.rb:74:in `synchronize' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/spawn_manager.rb:253:in `spawn_rails_application' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/spawn_manager.rb:148:in `spawn_application' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/spawn_manager.rb:285:in `handle_spawn_application' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/abstract_server.rb:332:in `__send__' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/abstract_server.rb:332:in `main_loop' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/lib/phusion_passenger/abstract_server.rb:182:in `start_synchronously' /usr/lib/ruby/gems/1.8/gems/passenger-2.1.3/bin/passenger-spawn-server:50 ... No close tag for /lists/list Line: Position: Last 80 unconsumed characters: Output was: <?xml version="1.0"?> <lists> <list path="svn+ssh://server/home/user/svn/repos/test"> Rendering template within layouts/base Completed in 1.37096 (0 reqs/sec) | Rendering: 0.02282 (1%) | DB: 0.01060 (0%) | 500 Internal Server Error
ググって見ると、Redmineとsvnの連携でエラー経由でRedmine公式のチケットが見つかりました。
そのコメント中では、lib/redmine/scm/adapters/subversion_adapter.rbファイルの
cmd = "#{SVN_BIN} list --xml #{target(path)}@#{identifier}"
を
cmd = "#{SVN_BIN} list --xml #{target(path)}@#{identifier} 2>&1"
に変更しろと言っていますので、その通りにしてみます。
その上で再度リポジトリ画面にアクセスすると、以下のような画面になるはずです。
まとめ
長々と書きましたが、無事さくらインターネット上のSubversionに対して、
- さくらインターネットのサーバ上のSubversionに、クライアント側(Windows)のEclipse+Subversiveから接続、使用できるようにする
- 別サーバのRedmineとさくらインターネットのサーバ上のSubversionを連携させる
が出来たでしょうか?
はまりどころが大変多いですので、皆様気をつけてください。
当記事の記述にも私の理解不足などの理由から不正確な点があると思います。
余談
私は本日土曜日の半日ほどをこれらの作業に費やしています(さらに半日は、この記事の執筆に費やしています)
私のスキルが不足していることは当然としても、一つはまって、解決してはまた一つはまって、を繰り返しているなかで、高林哲さんのいうバッドシグナル(現Web+DB Pressで連載中の記事バッドシグナル通信)やヤクの毛を刈るを痛感した一日となりました。。。
なお高林哲さんと言えば、バッドノウハウと「奥が深い症候群」もプログラマ必読です。
オーム社
売り上げランキング: 13561

trunk,branches,tagsでとまどったら
Subversionを使う上で”は”よい本だと思う
日本語のSubversion解説本の最高作
- Newer: 読書記録#3 ガイ・カワサキ『起業成功マニュアル』
- Older: 読書記録#2 ジグ・ジグラー『世界一シンプルな営業の教科書』
Comments:0
Trackbacks:2
- Trackback URL for this entry
- http://www.sakuttoly.com/blog/2009/07/sakura_subversion_eclipse_redmine.html/trackback
- Listed below are links to weblogs that reference
- さくらインターネットで、Subversion運用と、Eclipse+Subversiveでのsvn+ssh接続と、RedmineとSubversion連携を行う from サクっとly.com
- pingback from CalmTech | カームテック 09-11-17 (火) 17:16
-
[...] さくらインターネットで、Subversion運用と、Eclipse+Subversiveでのsvn+ssh接続と、RedmineとSubversion連携を行う [...]
- pingback from SubversionへSSH接続を行う » o-live.jp 10-05-13 (木) 11:54
-
[...] サクっとly.com [...]


