人気ブログランキング |
タグ:Subversion ( 5 ) タグの人気記事
(Linux)Subversionのバックアップ処理をhot-backup.pyを使って行う
当初、Subversionのバックアップは普通にリポジトリのファイルをシェルスクリプトでコピー(cp)するだけで考えてました。
しかし、そのままコピーしたのではまずいようです。

リポジトリ領域にアクセスするプロセスがなければ通常コピーでも構わないのですが、何かがアクセスしていると整合性が取れなくなるようです。

TortoiseSVNのヘルプでは、svnadmin hotcopy を使う方法が推奨されてました。
svnadmin hotcopy でリポジトリをコピーすると、整合性を保ったまま安全にリポジトリをまるごとコピー出来るようです。
書式としては下記のようになります。

svnadmin hotcopy path/to/repository path/to/backup --clean-logs

しかし、svnadmin hotcopy はリポジトリを全く同じものを安全にコピーするだけなので、アーカイブ化や世代管理などはできません。

これをアーカイブ化、世代管理ができるようにしたのが、svnadmin hotcopy をラッピングした hot-backup.py スクリプトです。

今回はCentOS5.5を使ったんですが、Redhat系は、/usr/share/doc/subversion-x.x.x/tools/backup にあるようです。
UbuntuなどのDebian系はsubversion-toolsというパッケージをインストールするとsvn-hot-backupコマンドとして使えるようになるようです。

世代管理は、subversion 1.4 付属の hot-backup.py だとスクリプト内の変数の値を変えないといけません。
hot-backup.py スクリプト内の先頭の方に、num_backups = 64 てのがあります。
この変数が残す世代数のようです。64は大きいので適宜調整します。

Subversion 1.6 付属の hot-backup.py だとスクリプト内の num_backups 変数が int(os.environ.get("SVN_HOTBACKUP_BACKUPS_NUMBER", 64)) となっています。
ここの値を直接書き換えることもできますし、環境変数 SVN_HOTBACKUP_BACKUPS_NUMBER を使うこともできるようです。
シェルスクリプトから呼び出す場合は、環境変数を使ったほうが楽かもしれません。


書式は、下記のとおりです。

./hot-backup.py リポジトリパス バックアップディレクトリパス

オプションで、--archive-type=圧縮形式 で指定した形式で圧縮してくます。
圧縮形式は、bz2 , gz , zip から選べます。

例:
./hot-backup.py --archive-type=gz /var/www/svn/devloprepo /var/backup/svn


これをスクリプト化してcronから呼ぶようにすると自動的にバックアップできますね。

とりあえず、cronから呼ぶスクリプトを作成してみました。

#! /bin/sh

#このスクリプトのパスを取得
MYPATH=$(cd $(dirname $0);pwd)
#hot-backup.py のパスを指定。CentOS5.5だと下記の場所にある。
SCRIPT_PATH=/usr/share/doc/subversion-1.4.2/tools/backup/hot-backup.py

#1.6付属の hot-backup.py を使った場合下記のように環境変数に世代数を入れることもできます。
#export SVN_HOTBACKUP_BACKUPS_NUMBER=3

#-------バックアップ処理-------
#バックアップ元ファイル読み込みパスと保存ファイル名読み込み、ループ開始
cat ${MYPATH}/bksrc_svn.dat | grep -v \# | while read REPO_DIR BKUP_DIR
do
#バックアップ処理
$SCRIPT_PATH --archive-type=gz $REPO_DIR $BKUP_DIR

#成功したらその旨を表示かつ、ログに保存
if [ $? = 0 ]; then
logger "SVN Backup OK $BKFILE"
echo "SVN Backup OK $BKFILE"
else
#失敗したらその旨を表示かつ、ログに保存、メール送信
logger "SVN Backup NG $BKFILE"
echo "SVN Backup NG $BKFILE"
${MYPATH}/mailsend.sh "SVN バックアップ失敗通知" "実行バックアップスクリプト: ${0}
バックアップ対象: ${REPO_DIR}
Subversionバックアップに失敗しました。"
fi
done

bksrc_svn.datというファイル(上記スクリプトと同じディレクトリに保存)に、バックアップ対象のリポジトリパスとバックアップ先を定義します。

vi bksrc_svn.dat
/var/www/svn/test/ /var/backup/svn
/var/www/svn/webdate/ /var/backup/svn
/var/www/svn/devlop_java/ /var/backup/svn


処理に失敗したらメールを飛ばすようにしていますが、メールを飛ばす部分は、(Linux)シェルスクリプトでメールを送信するを参考してください。

参考:
Subversionリポジトリのバックアップ方法いろいろ - ぱせらんメモ
2007-07-11 - mir the developer
2007-05-06 - tmishina’s diary
by Jehoshaphat | 2011-10-09 11:57 | Linux
Subversion on apache で大量ファイルをコミットするとエラーになる

Subversion on apacheでTortoiseSVNから大量ファイルをコミットすると「サーバに接続できませんでした」というエラーになります。
環境は下記のとおりです。
OS:CentOS5.5
Apache 2.2.3 (OSバンドル品)
Subvsersion:mod_dav_svn-1.4.2

で、原因は Apache の KeepAlive が OFF になっていたからでした。
なので、コミット中に top コマンドで確認すると大量に httpd プロセスが存在してました。(ファイル毎にプロセスが立ち上がりプロセス数最大値を超えて接続が切れたんだと思います。)

httpd.conf の KeepAlive を On にすることでコネクションを使い回しするようになり、ちゃんとコミットできました。
普通 apache の KeepAlive でデフォルトでOnになってたと思うんですが、redhat系はoffなんでしょうか・・・

参考:
Subversionで大量のコミット中に接続が切断される
自宅LAN内に、linux(CentOS)サーバーを作り、subversionを設置.. - 人力検索はてな
by Jehoshaphat | 2011-09-23 21:39 | サーバがらみ
Subversion(Apache,Linux)で認証にActiveDirectoryを使う

LinuxでSubVersionを構築しEclipse Subversive から使うではSubversionの認証としてBasic認証を使ってましたが、Windowsドメインを建てているということで、ActiveDirectoryを使って認証してみました。

環境はApache2.2 , CentOS5.5で、ドメインコントローラはWindowsServer2003です。

SubversionはApacheコンポートネントとして動かしているため、普通のWEBサーバとしての認証でも使えるかと思います。


ActiveDirectoryとの認証方法はいくつかあるようですが、今回はLDAPでの認証を試しました。
(LDAPを使ってもAuthTypeはBasicでないといけないのでパスワードは平文で流れてしまいます。)

LDAPでActiveDirectoryの認証情報を使うには、下記のように設定ファイルを編集すればOKです。(認証部分のみ)

/etc/httpd/conf.d/subversion.conf

<Location /svn>
AuthType Basic
AuthName "Subversion Repositoryr"
AuthBasicProvider ldap (認証方式。LDAPを使う)
AuthLDAPUrl "ldap://hogesv01:389/OU=person,dc=hogedomain,dc=jp?sAMAccountName?sub?(objectClass=*)"
AuthLDAPBindDN userhoge@hogedomain.jp
AuthLDAPBindPassword userhogeのパスワード
Require ldap-attribute objectClass=person
</Location>


AuthLDAPUrlはLDAP URLと呼ばれるもので下記の書式になるようです。

ldap://host:port/basedn?attribute?scope?filter

host : これはドメインコントローラを指定します。
port : LDAPだと389になります。
basedn : 検索の起点となる識別名(DN)を指定します。
attribute : 検索対象の属性です。sAMAccountNameはWindowsのログイン名になります。
scope : 検索する深さを指定します。one(1階層のみ検索)またはsub(下位の階層も検索)です。
filter : 検索のLDAPフィルターです。(objectClass=*)となっているのでツリー上の全てのオブジェクトを検索します。


ここで一つ問題が出てきました。
basedn部分で、OUまで含めないとサーバエラーとなってしまう点です。つまり、OUは必ず指定しないといけません。
しかし、今回ドメイン直下には複数のOUがあり、それぞれにユーザアカウントオブジェクトがあるのです。
仮に下記のように試してみましたが、下の行の設定だけが有効になってしまう状態でした。

AuthLDAPUrl "ldap://hogesv01:389/OU=person,dc=hogedomain,dc=jp?sAMAccountName?sub?(objectClass=*)"
AuthLDAPUrl "ldap://hogesv01:389/OU=devlop,dc=hogedomain,dc=jp?sAMAccountName?sub?(objectClass=*)"


で、調査したところ、Trac と mod_pythonの中ほどに答えが。。。
portをActiveDirectoryのグローバルカタログ(ポート3268)にすれば、basednでOUを指定しなくてもディレクトリ全体が検索範囲になることが分かりました。(グローバルカタログはフォレスト内の全ドメインの全オブジェクトから、ひんぱんに利用する属性のみを抽出したものです。)
AuthLDAPUrlは下記のようになります。

AuthLDAPUrl "ldap://hogesv01:3268/dc=hogedomain,dc=jp?sAMAccountName?sub?(objectClass=*)"



AuthLDAPBindDNはActiveDirectoryにアクセスするためのユーザ名です。管理者権限持ってなくもActiveDirectory内のユーザで有ればどれでもいいようです。
AuthLDAPBindPasswordで、AuthLDAPBindDNで指定したユーザのパスワードを指定します。


Requireでどのユーザに対してアクセスを許可するか設定します。(特定のユーザや特定のグループだけならAuthLDAPUrlのフィルタで設定してしまう方法も有ります)
下記にいくつかの設定例を紹介します。

LDAPディレクトリ内の全ユーザに許可する
Require valid-user

LDAPディレクトリ内のtest01 test02ユーザだけ許可する
Require ldap-user test01 test02

LDAPディレクトリ内のグループdev supportグループに属するユーザだけ許可する
AuthLDAPGroupAttribute member
AuthLDAPGroupAttributeIsDN on
Require ldap-group CN=dev,CN=Users,DC=hogedomain,DC=jp
Require ldap-group CN=support,CN=Users,DC=hogedomain,DC=jp

グループの識別名(DN)を取得するには、ADSI Edit が有用です。
ADSI Edit については、(ADSI)ActiveDirectoryのオブジェクトの属性をのぞきたいが参考になります。


参考:
開発リソース/Unix/Apache2でmod_auth_ldapを利用したActiveDirectoryベースの認証
LDAPによるApacheの認証と認可
The auth_ldap Module for Apache


今回はLDAPを使ってApacheからActiveDirecotryへの認証を行いましたが、KERBEROS認証やNTLM認証(winbind+samba)、SSPI、SPNEGO認証を用いる方法があるようです。(方法によってはシングルサインオンできそうですね。)
とりあえず参考になりそうなページだけリンクはっておきます。
●KERBEROS認証
Apache/認証にActiveDirectoryを使う方法
ActiveDirectoryでApacheの認証を
mod_auth_kerb で Basic認証を有効にする (Active Directory を使ったシングルサインオン)

●NTLM認証
Apache(Linux)に、Windowsドメイン認証を利用して、シングルサインオンを実現する詳細手順 - RX-7乗りの適当な日々
ActiveDirectoryとSUSE11.3(LINUX)上のapacheでシングルサインオンを利用する
Apacheで統合Windows認証を使う

●SSPI
ドメイン認証(mod_sspi) - なんとなく ~学習もかねて~
2008/01/28 日記: Microsoft セキュリティ サポート プロバイダ インターフェイス / Microsoft Security Support Providers Interface (SSPI)
Apache ベースのサーバ

●SPNEGO認証
Subversion にも SPNEGO 認証:お試しlog4
SPNEGO
by Jehoshaphat | 2011-09-21 23:20 | Linux
TortoiseSVNを使ってみた

LinuxでSubVersionを構築しEclipse Subversive から使うでSubVersionの構築方法とEclipseを使ったクライアントアクセスの方法を書きました。

今回は、クライアントとしてTortoiseSVNを使ってみました。
TortoiseSVN は WindowsExplorer に統合されてるようです。

ダウンロードは、TortoiseSVN公式サイト から可能です。Language packsもダウンロードしておきましょう。
TortoiseSVNインストール後に再起動が要求されるので注意です。

スタートメニュー→TortoiseSVN→Seettingsから設定画面を開きます。
Language packsをインストールしていれば、GeneralのLanguageから日本語が選択できます。

リポジトリ用のフォルダを作成し、右クリック→TortoiseSVN→リポジトリブラウザ
URL入れる画面開くので、リポジトリのパスを入力して開ければOKです。
リポジトリパス: http://testsv/svn/test/


・リポジトリの構成
TortoiseSVNとは関係ないSubVersionサーバ側のリポジトリの構成ですが、下記ディレクトリを作成してメインやタグ、ブランチに分けることが推奨されているようです。
trunk : 開発の主系。普段はここに対してコミットや更新をする。
tags : タグ。VisualSourceSafeでいうところのラベル。
branches : ブランチ。つまり枝分かれプロジェクト。

さらに複数のプロジェクトがあるなら、それもディレクトリで分ける必要があり、いろいろなリポジトリの構成が出てくるようですね。
それについては、Subversionのリポジトリ構成 - watawata日記が参考になります。

・リビジョン
これもTortoiseSVNとは関係なく、SubVersion自体の仕様なのですが、リビジョンは個々のファイルにつくのではなく、ツリー全体につくようです。(つまり、全ファイルに同じリビジョン)
CVSとかでは各ファイルにリビジョンがついていたので間違えないようにしないといけませんね。

・リポジトリ内の確認
リポジトリの中身を確認したいときはリポジトリブラウザが使えます。
適当なフォルダのコンテキストメニュー→TortoiseSVN→リポジトリブラウザ から起動できます。
リポジトリブラウザ内の各ファイルのコンテキストメニューからファイルの履歴も確認することができます。

・リポジトリデータの取得
最初にリポジトリのデータを取得するには、ローカルにフォルダ作成し、コンテキストメニュー→SVN チェックアウト でOKです。
これでそのフォルダがSubVersionのリポジトリ編集用フォルダになります。
次回からは コンテキストメニュー→SVN更新 でリポジトリ上のデータを取得できます。
注意として、この時ローカルのファイルがリポジトリと異なっている場合(アイコンが!)、更新時に自動マージ、もしくは競合が発生します。

・リポジトリにファイルやフォルダを追加する
リポジトリに新たにファイルを追加するには、追加するファイルをローカルで作成したのち、追加したいファイルを選択してコンテキストメニューから TortoiseSVN → 追加 で可能です。
追加後はコミットを忘れずに。

・ローカルで加えた変更をリポジトリに保存する
チェックアウトしたファイルに変更を加えた後、変更したファイルをリポジトリに保存するには、コミット を実行します。
コミットは、変更が加えられたファイルを含むフォルダでショートカットメニューから SVNコミット → メモを入力しコミットするファイルをチェック後、OK をクリックするとコミットされます。

・ファイル名の変更
CVSとの違いの大きな利点として、ファイル名やフォルダ名を変更でき、名称変更前の履歴も保持できるという点があります。
ファイル名の変更は、コンテキストメニュー→TortoiseSVN→名前の変更 で行い、コミットします。

・削除
リポジトリからファイル・フォルダを削除する場合は、コンテキストメニュー→TortoiseSVN→削除 で、コミットします。


・タグを付ける
trunkフォルダのコンテキストメニュー→TortoiseSVN→ブランチ/タグ で 先URL にタグとどのリビジョンか分かるように入力します。
例:http://sv/svn/test/testprj/tags/ver1.0
タグ付は、サーバ上の内部処理としては指定したリビジョンのハードリンクを作っているだけらしいですね。


・コミット時のエラー
例えば下記のような場合だと、コミット時に「コミットに失敗しました。ファイルまたはディレクトリ'xxx'はリポジトリ側と比べて古くなっています。updateを実行してみてください」とエラーになります。
TortoiseSVNを使ってみた_e0091163_2391827.jpg


その場合、コンテキストメニュー→SVN更新 でリポジトリのデータをローカルを更新します。
その際、リポジトリの最新リビジョンとローカルの変更済みファイルとで、違う行の変更(テキストファイルのみ)の場合自動的にマージされます。
同じ行の変更もしくはバイナリファイルで変更があった場合は、競合となります。
競合の場合、ローカルのベースリビジョンのファイル(ファイル名:filename.ext.rOLDREV)と、リポジトリの最新リビジョンのファイル(ファイル名:filename.ext.rNEWREV)が作成されます。
競合ファイル自身は、%lt;%lt;%lt;%lt;%lt;%lt;%lt; と >>>>>>> との間でどのような変更があったか表示してくれます。

競合の場合は、手動で競合を解決しないといけません。
その時、競合ファイルのコンテキストメニュー→競合の編集 も使えますしテキストエディタで直に修正しても構いません。
いずれにせよ、競合の修正が手動で直せたら、コンテキストメニュー→競合の解消 をします。
(注意として、競合の解消が、実際に競合をマージ等で自動的に解消するわけではありません。変更をコミットできるよう、filename.ext.mine ファイルや filename.ext.r* ファイルを削除するだけです)

これでコミットをします。

流れとしては下記のような感じでしょうか。
TortoiseSVNを使ってみた_e0091163_231079.jpg



・Windowsエクスプローラの列
TortoiseSVNはWindowsエクスプローラのコンポーネントとして動いているので、Explorerの列で下記列を表示するようにすると便利です。
SVN状態:ファイルの状態。つまりアイコンの意味。
SVNリビジョン:ローカルで編集元のリビジョン。
SVN短いURL:サーバ側リポジトリの場所
SVNローカルのロック保持者:ロックしているユーザ
SVN作者:更新ユーザ



TortoiseSVNのコンテキストメニューには差分に関するいくつかのメニューがありますがそれらの意味は下記のようです。
・差分
自身が直近でリポジトリから取得したリビジョンと、現在のデータの差分を表示します。
・以前のバージョンとの差分
自身が直近でリポジトリから取得した一つ前のリビジョンと、現在のデータの差分を表示します。
・変更をチェック
そのまま開いた画面でダブルクリックすると、「差分」と同じ意味のようです。
「リポジトリをチェック」ボタンを押下すると、リポジトリと今作業中のファイルとの差分を見れます。

TortoiseSVNの差分ツールでうれしいのは、一部のバイナリファイル(画像ファイル、MS Office(Word,Excel),OpenOfffice(Writer,Calcのみ。Draw,ImpressはNG))の差分も見れるようしてくれてることです。。



・ロック(排他制御)モードと、マージ(統合モード)
SubVersionは基本的にはマージモードで動かすことが推奨されてますが、ロック機能もあるようです。
コンテキストメニュー→TortoiseSVN→ロックを取得 でロックできます。ロックした人以外はコミットできません。
ロックモードで運用する場合は、Subversion の属性で svn:needs-lock を使用するといいようです。これをするとロック取得しない限りチェックアウトや更新時にファイルが読み取り専用になります。VisualSourceSafeのような動きになるようですね。
svn:needs-lockを使用する方法については、こちらが参考になります。


詳しくは下記サイトが参照になります。(TortoiseSVN以外にもSubVersionの基本概念サイトや競合サイトも含みます)
TortoiseSVN TortoiseSVNのリファレンスです。ここを見るのが一番いいかと思います。
TortoiseSVNの使い方
svn commitで「リポジトリ側と比べて古くなっています」
CVS/Subversionを使ったバージョン管理(後編:SVNを使ったバージョン管理) - SourceForge.JP Magazine
nDiki: Subversion で衝突が起きた場合
Subversion 競合発生時の正しい対処 - 130単位
subversionでできること - ITとともに生きよう
Subversion(TortoiseSVN)でマージする方法(手順)(1) branchからtrunkにマージする方法です。
by Jehoshaphat | 2011-09-21 23:11 | ツール
LinuxでSubVersionを構築しEclipse Subversive から使う
ソース管理のSubVersionのLinux(CentOS5)での構築方法です。
SubVersion は Apache のモジュールして動くようですね。
(Apacheは元から入ってるパッケージ管理されてるものを使うこととします。)

まず、yum で SubVersion モジュールをインストールします。

# yum -y install subversion mod_dav_svn


次に SubVersion の設定ファイルを編集します。
とりあえず下記のような設定にしてみました。

vi /etc/httpd/conf.d/subversion.conf

<Location /svn>
DAV svn
#SVNPath /var/www/svn (SVNPathは1個のリポジトリだけを指定する)
SVNParentPath /var/www/svn (SVNParentPathは複数のリポジトリがある時その親ディレクトリを指定)
SVNAutoversioning on
Order deny,allow (ここからアクセス権。指定したIPからのみ通信許可)
Deny from all
Allow from 127.0.0.1
Allow from 192.168.0.0/24
# Limit write permission to list of valid users.
<LimitExcept GET PROPFIND OPTIONS REPORT>
# Require SSL connection for password protection.
# SSLRequireSSL
AuthType Basic (認証方式。このあたりはApacheの普通のベーシック認証と同じ)
AuthName "Authorization Realm"
AuthUserFile /var/www/svn/.htpasswd (パスワードファイルを指定)
Require valid-user
</LimitExcept>
</Location>


次にベーシック認証のユーザを作成します。作成方法はApacheベーシック認証おなじみのhtpasswdを使います。

htpasswd -b -c /var/www/svn/.htpasswd hoge passwd (初回時のみ -c が必要)


svnadmin コマンドを使ってリポジトリの作成を行います。

# svnadmin create /var/www/svn/testrepo
chown -R apache:apache /var/www/svn/testrepo/ (所有者をapacheを動かしてるユーザにします)



次にクライアント側の準備です。
今回は Eclipse3.6 で Subversive プラグインを入れて使うことにします。

Eclipseを起動し、メニューバーの Help → Install New Software でダイアログを起動します。
Work with: に http://www.polarion.org/projects/subversive/download/eclipse/2.0/update-site/ を追加すると、Subversion SVN Connectors を選択してインストールします。

これでEclipseを再起動し、パースペクティブから SVN Repositories を選択します。
New Repository Location でリポジトリ設定ダイアログが開くのでそこで設定をします。
この時ハマったのが URL でした。
この URL ではリポジトリのパスまで入れないといけないのです。上記の設定だと下記のイメージのように設定する必要がります。
LinuxでSubVersionを構築しEclipse Subversive から使う_e0091163_0101125.jpg


WEBブラウザでリポジトリのURLを叩くと中身を見ることができるので、Subversion の生存確認につかるかもしれません。
LinuxでSubVersionを構築しEclipse Subversive から使う_e0091163_0101493.jpg



こう見ると構築自体はあっさりできます。

参考:
バージョン管理システム構築(Subversion) - CentOSで自宅サーバー構築 構築方法です。
Subversiveプラグイン - EclipseWiki EclipseのSubversiveプラグインについてです。
Subversionメモ/SVNPathとSVNParentPath - Piroshiki PukiWiki
Linux/Subversion/yumからインストール - MinacoWiki
SubversionとTracでファイル管理の“迷宮”から脱出 (1/4) - @IT



補足
上記のSubversion設定ファイル(/etc/httpd/conf.d/subversion.conf)で、<LimitExcept GET PROPFIND OPTIONS REPORT> としてましたが、これは読み取りにはアクセス権は必要ないけど、コミットには必要という意味だそうです。

ですので、リポジトリのRead,Writeに認証を描けるには、下記のように、ディレクティブを無しにしてやればいいようです。

<Location /svn>
DAV svn
#SVNPath /var/www/svn (SVNPathは1個のリポジトリだけを指定する)
SVNParentPath /var/www/svn (SVNParentPathは複数のリポジトリがある時その親ディレクトリを指定)
SVNAutoversioning on
Order deny,allow (ここからアクセス権。指定したIPからのみ通信許可)
Deny from all
Allow from 127.0.0.1
Allow from 192.168.0.0/24
# Require SSL connection for password protection.
# SSLRequireSSL
AuthType Basic (認証方式。このあたりはApacheの普通のベーシック認証と同じ)
AuthName "Authorization Realm"
AuthUserFile /var/www/svn/.htpasswd (パスワードファイルを指定)
Require valid-user
</Location>

by jehoshaphat | 2010-11-09 00:11 | Linux