Tech Racho エンジニアの「?」を「!」に。
  • 開発

分散バージョン管理Bazaarのチュートリアル(Eclipse対応!)

今日はアプリケーション開発とは切っても切り離せないバージョン管理システムについて書こうと思います。
BPSでは現在バージョン管理システムとしてSubversionをメインに使用していますが、
ここ数年の分散バージョン管理システムの盛り上がりから、
分散バージョン管理システムについて最近調査・検証しています。

ある共同プロジェクトでGit, Mercurialとならぶ分散バージョン管理システム3強のうちの1つ、Bazaarを試す機会があったので、
EclipseでBazaarを使うところまでを共有したいと思います。

Bazaarのインストール

Bazaarのインストールはとても簡単です。

Bazaar公式「Download and Install」のページから自分の環境を選んで、インストーラをダウンロードします。
または説明に沿ってインストールします。

WindowsもBazaarプロジェクトがインストーラを用意しています。
MacOSX用もdmgがありましたので、インストーラが用意されているものと思います。

WindowsではTortoiseBZRというTortoiseSVNのようなシェル統合もインストールされるようですが、
2010/05時点でTortoiseSVNほどの完成度はないようです。

Windowsの場合インストールが終わったら環境変数PATHが更新されているので、いったん再起動するとコマンドラインにもパスが通ります。
bzrコマンドのオプションなどは環境に依存せず同じですので、安心して使えますね。

ローカルにリポジトリを作って使ってみる

windowsでも、UNIX系OSでも、適当にディレクトリを作成して、そこにcdして
bzr init
と打ってみます。
これだけでそのディレクトリは既に立派なBazaarリポジトリです!

ここにtest.txtというファイルを作ってみましょう。
名前や内容はなんでもいいですが...

$ echo "test" > ./test.txt

この状態で、いまBazaarでどういう状態かというのを訪ねるにはbzr statusコマンドを使います。
省略してstatでもいけます。

$ bzr stat
unknown:
  test.txt

こんな感じになるはずです。
これは現在bazaarで管理されてないファイルtest.txtがあるよ、という意味です。
test.txtをBazaarに管理させましょう。svnと同じように、addしてcommitです。

$ bzr add test.txt
adding test.txt
$ bzr commit -m "added test.txt by tomotaka"
Committing to: /home/tomotaka/code/test/
added test.txt
Committed revision 1.

こんな感じになるはずです。
add, stat, commitの他にもmv, log, mkdir, remove, remove-tree, diff, revertなどのコマンドがあります。
だいたいsvnなんかと同じですよね。

詳しいコマンドのリファレンスは

bzr help
bzr help COMMAND

などで調べることができます。

もちろんBazaar公式のオンラインリファレンスを見るのもいいでしょう!

これで一つのディレクトリをバージョン管理することはできるようになりましたね。
次のセクションではネットワークのむこうにあるリポジトリのやりとりを行う実践編です!

リモートのサーバからリポジトリをbranch

ここでは前提として、リモートサーバ上にプロジェクト全員で共有するリポジトリがあり、
最終的な変更はすべてそこに集約しようという前提で話を進めます。
(ようするにSubversionの作業フローを維持してどうBazaarでモアベターに置き換えるかということです。)

どうやら分散管理システムでは、プロジェクトを複数人で共同開発する際は個人ごとにリポジトリを持つのが普通のようなので(そうしないと分散の意味がない)、
checkoutではなく、branchコマンドでリモートにあるリポジトリの複製を作りましょう。(gitならgit cloneかな?)
リモートサーバへはbzr+sshプロトコルで接続するのが簡単そうです。
sshのサービスがあがっていればなにも設定しなくても使えます。便利ですね。

$ bzr branch bzr+ssh://tomotaka@honyarara.bpsinc.jp/path/to/repository/ ./localbranch

これで自分のデスクトップで作業を行うことができますね。
このlocalbranchに対するコミットは自分だけのコミットになるので、
自分の中でのひと区切りや、一定機能単位などで好きにコミットできます。
ここが分散バージョン管理システムの利点です!
subversionなどの集中型のバージョン管理システムでは、
(とくにメンバーの多いプロジェクトでは)リビジョン番号の爆発を防ぐためや、トラッキングのしやすさを維持するために
ある程度ローカルでまとめあげてから(バグを取り除いて、完全に動く状態にする)コミットするのが慣例かと思います。

しかし、これのよくないところは「バグが取り除かれて、完全に動く状態になる」までの一切の変更はバージョン管理されていないのです!
つまり「バグが取り除かれて、完全に動く状態」にならない限り、昨日のコードに戻したい
とかができないわけですね。上記のポリシーだと。

分散リポジトリなら、自分のリポジトリにガンガンコミットしても、誰にも迷惑はかかりませんし、
むしろバージョン管理ができるのでガンガンコミットするべきです。
適切な単位=バグが取り除かれて、完全に動く状態になったら、それをまとめてリモートのリポジトリに反映してあげましょう。

リポジトリ間での差分をやりとりするには、pushとpullというコマンドを使います。
pushは自分の変更履歴を引数で指定されたリポジトリに送ります。
pullは指定したリポジトリの変更履歴を取り寄せて自分のリポジトリに反映します。

リポジトリは互いに対等ですが、Bazaarではコピーしたリポジトリは自分のコピー元の
リポジトリのURLを覚えているため、リポジトリを指定しないbzr pushを実行すると
コピー元リポジトリにpushしてくれます。これがsvnでいう中央サーバへのコミットのようなイメージですね。

$ bzr push

うーん、簡単。

となりの人のマシン(192.168.0.123)の、となりの人のリポジトリから中央サーバを介さずに
となりの人が施した変更をもらってくることもできます。

$ bzr pull bzr+ssh://tomotaka@192.168.0.123/tonari/no/hito/no/repository

これでネットワーク経由でのバージョン管理もマスターできました!?

bzr-eclipseを使ってみる

BPSではいろいろな言語をプラグインを利用して統一的なインタフェースで編集することができるEclipseを
共通の開発環境として使っています。
普段はSubclipseプラグインを使ってサーバ上のSubversionリポジトリとやりとりを行っているため、
似たような使い勝手のEclipseプラグインを探してみたところ、
どうやらBazaarにもbzr-eclipseというEclipseプラグインがあることがわかりました。

ただ、このプラグインは単独では動かず、bazaarが実行するPCにインストールされていないといけません。
先にBazaarをインストールしましょう!
あ、Bazaarだけでなくbzr-xmloutpuptプラグインが必要でした。
Windowsのインストーラは標準でbzr-xmloutputを入れてくれます。
Ubuntuだったらaptitude install bzr-xmloutputでインストールできます。

インストールは簡単で、いつものeclipseのプラグインインストーラにURLを入れればいけます。
最新バージョンがアップロードされているURLは、Bazaar公式のbzr-eclipse intallationページから参照してください。
うまくインストールできましたでしょうか。
インストールできたら設定画面のTeam > Bazaarから、Bazaarのバイナリ(bzr.exe)を選択する必要があります。
Windows 7ではインストーラのデフォルトのままインストールしたらC:\Program Files (x86)\Bazaar\bzr.exeでした。
環境に合わせて適切に設定しましょう。

しかしこれだけではbzr+sshプロトコルでリモートサーバとうまくやりとりすることができません。
とくにWindowsでは設定がめんどくさいです!(Linux版Eclipseは普段使わないのでここでは触れられません, すいません!)
bzr+sshをうまくいかせるためにいろいろ悪戦苦闘したので、ここで共有します。

まず、PuTTYで鍵交換方式によるSSH接続のページを参考に、
コマンドプロンプトで

$ bzr branch bzr+ssh://目的のリモートリポジトリURL/

を実行してパスワードが出なくなるところまで持っていきます。
おおざっぱに書くと

  1. puttygen, pagentをDLする
  2. puttygenでprivate keyとpublic keyをつくる, パスフレーズはなしで。
  3. pagentをdouble clickで起動, タスクトレイにいる帽子かぶってるやつ右クリックでadd key => つくったprivate key登録
  4. 公開鍵をサーバに転送。 ssh-keygen -i -f (公開鍵ファイル) >> authorized_keysで変換してauthorized_keysに追加
  5. コマンドラインでbzr branch bzr+ssh://user@host/path/to/repos/ localrepos/ とかやって認証なしでbranch切れるか確認する
  6. うまくいけばbzr-eclispeでもいけるはず。(File > New > Project > Bazaarにbranch作成がある)

ですね。

普段サーバ作業をあまりしない方には以下のチェックリストが参考になるかもしれません:

  • 公開鍵をauthorized_keysに登録するときに変換し忘れてない?
  • .sshディレクトリのパーミッションは700 ? オーナーは自分 ?
  • authorized_keysのパーミッションは600 ? オーナーは自分 ?
  • ファイル名間違ってない ?
  • 公開鍵と秘密鍵間違えてない ?

コマンドプロンプトでうまくいけば、bzr-eclipseでもうまくいきます。
bzr-eclipseでリモートリポジトリからbranchをつくるには、new project > Bazaarから行います。
Importではないので注意!


いかがだったでしょうか?
以上で今回のBazaarチュートリアルはおしまいです。

それではBazaarで楽しい開発ライフを!


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。