【サーバ関連】Ktai Libraryのリポジトリ周りと公開方法を晒してみる

当方はgitの扱いに関してはまだまだど素人でして、至らない部分はあるのですが、それでも「コードを公開する」という点で興味をお持ちの方が少なからずいらっしゃると思いますし、他のご意見も聞きたかったりするので、今回「Ktai Library」周りで整備をした、ソースコードの公開方法について晒してみようと思います。

「Ktai Library」は少々特殊かもしれませんが「主にCakePHP内で利用されているライブラリ」ではありますが一応PHP全般で利用が可能な携帯サイト向けライブラリです。また、それぞれのCakePHP環境に「上書きコピー」で適用していただく方が利便性が高いと思い、CakePHPに実装した形ではなく、必要なファイルのみをアーカイブにまとめて公開していました。
ところが、当方では基本的にCakePHP内に実装した形で開発を行い、そこから必要なものを抜き出して公開イメージを作っていました。この作業が非常に面倒で、そのうちバージョン管理ミス等も起きるだろうと考え、なんとかしたい要因の一つとして前々から方法を模索していました。

それとは別に、Ktai Libraryの開発そのものもオープン化したいと考えていましたので、「ktai-dev」というプロジェクトも公開し、その複製物からKtai Libraryを生成するような仕組みが必要になってきました。共にgithabにて公開するつもりでしたので、つまりgitでバージョン管理されたものについて、いくつかの操作を行って連携していく必要があります。

そんなわけで、どうしようかとずっと悩んでいた開発環境とリポジトリ周りの構築についてようやく実用的なものが出来たので、「ktai-dev」のリリースと共に運用を始めた次第です。
まずは簡単に図にしたものをご覧ください。

ご覧の通り、gitリポジトリがた~くさんあるのですが、分散管理できるgitならではという感じかもしれません(笑)。

まず一番左はローカル環境です。自宅のデスクトップと持ち運びようのノートPCに、それぞれVMWareServerを稼働させ、VMでFedora11を動かしています。それぞれでgit によるktai-devの作業ディレクトリがあり、その右側にある非公開サーバ内にあるktai-devリポジトリに対してのみコミットしています。
ここについては、最初は非公開サーバにリポジトリを置かずにUSBメモリで作業ディレクトリを共有していたこともあるのですが、何か事故があってはいけないと思いやめてそれぞれでcloneするようにしました。また他の作業者が増えた場合にも対応に困る場合もあるので。
欠点もあり、「作業途中で続きをデスクトップとノートで行き来できない」点でUSBメモリ方式と比べて使い勝手が悪い点があります。当方は「電車開発」を常時行っていて、作業が未完のまま帰宅するのが当たり前なので。途中のままコミットするのが気持ち悪いので、仕方がないのでノートで作業を完結するようにしています(笑)。

次に非公開サーバなのですが、これは外にある専用サーバです。sshにてやりとりしています。例えば

git clone ssh://user@mydomain.com/home/user/git/ktai-dev

のように取得しておけば、次からここに対して更新を行えます。
git操作時(push/pull等)では、sshのパスワードを聞かれます。ここが面倒ですが、共有リポジトリを作るにはとても面倒な設定作業が必要になるのでとりあえずそのままです。

ここで注意するのは、サーバ内でリポジトリを作成する際、git initで「–bare」を付けないことです。何故かというと、ここに集められたコードを「KtaiLibrary」リポジトリに反映させる必要があるからです。このために、仮の作業ディレクトリを展開して実ファイルを取り出すことを行っています。
そして、必要なファイルを抜き出してKtaiLibraryリポジトリに反映させるための「デプロイツール」があります。これは単純なrmやらcpが列挙されているコマンドスクリプトです。これを叩いてファイルをKtaiLibrary作業ディレクトリに反映させます。その内容でgit commitを行い、その右のgithubリポジトリにpushします。また、ktai-devはそれで別途pushします。

ここの部分についてはもう一つポイントがあります。それは「ktai-devの作業ディレクトリを定期的に最新のものにする」必要があるのですが、自分のmasterに対してコミットが進んできたものに対して、自分に対して普通にgit checkout masterをすると、作業ファイル内に更新されたファイルがあると見なされてcheckoutがされないのです。ここで相当はまりました。結論から言いますと

git checkout -f master

で、作業ディレクトリの内容を問わずに最新のファイルが展開されます。ググってもなかなかこの情報が出てきませんでしたので、気づくのが遅すぎました(^^;。

そしてgithubですが…github内は特に何も行ってなくて、純粋な公開窓口です。多くを語ることもないでしょう。

リポジトリ公開はここまでですが、それとは別にBTSをRedmineにて行っていて、その中でgitリポジトリ(のリスト)を公開しています。これをやるためにはRedmine内にcloneをfetchする必要があり、さらにリポジトリを作っています。そして、cronでリポジトリを定期的にfetchしています(ちなみに、現在fetchを行っているのはKtaiLibraryリポジトリの方であり、図とはちょっと違います。kta-devに対して行うように修正予定です)。

現在非公開サーバ側からgithubにpushする行程は全て手動で行っています。ktai-devのpushについては当面ため込んでから行いたいというのもあるので非公開サーバ側でコマンドを叩く方式でいいのですが、KtaiLibraryに対しては、前述のktai-devに対してのcheckoutや、githubへのpushもデプロイツールに入れてしまおうと考えています。
また、Redmine側のリポジトリもある意味無駄なので、なんとか出来ないかなと思っています。github側にフックできる仕組みがあるみたいなのでそれを活用するか、そもそもgithubを見ずに非公開サーバ側で解決するべきかなとも考えています。

こんな感じで多少他のプロジェクトと比べて複雑かもしれませんが、このように別のリポジトリからの複製物に対してgit管理が出来るとか、間接的にgithub公開できるとか、多少なりともノウハウがお見せできたかなと思います。
何か他におもしろいアイデアがあるようでしたら是非教えてください!

追記(2010.05.01)
Twitterでいくつかアイデアをいただきました!
ありがとうございます。

●非公開サーバ側の.ssh/authorized_keysに公開鍵を登録すればパスワードは聞かれなくなる(@nojimageさん)
これは常識的なものでしたね。当方の技術力のなさが露呈しました(^^;;;

●「git remote add github (githubのURL)」とかすれば、サーバのコンソールからでなくてもgithubにpushできる(@kaz_29さん)
確かにその通りです。早速設定しました!


コメントは受け付けていません。