一つのサーバで複数バージョンのTracを使用する方法

こんにちわarashoです。最近一人で斜め上に向かった仕事をしていて、何やっているかわからんと社内の人には思われていそうでビクビクしているarashoです。結構気が小さいんです。

ディノではプロジェクト管理にTracを使用しています。お客様にも使用して頂いています。そういったわけでTracはかなり頻繁に使われるツールなのですが、最近バージョンアップを行いました。1サーバで数10のTracプロジェクトが動いているので、できるだけ既存の環境には影響を出さないようバージョンアップは行わなければなりません。


全てのプロジェクトを一気にバージョンアップするのは、サーバ管理者にとっては一番楽で簡単な方法です。ただ、お客様と一緒に使っていることもあるのでメンテナンス時間の調整が必要だったり、お客様によってはインターフェースが変わる事を嫌がったりすることもあるので、サーバ管理者が楽だからといって全てのプロジェクトを一気にアップグレードするのは技術的ではない部分で問題があるかもしれません。不具合があった場合全プロジェクトに影響が出るのもできれば避けたいです。
そこで今回はプロジェクト単位でのアップグレード、社内プロジェクトで使用しているもので何かしら影響が出ても問題ないものから取り掛かる方針で作業を進めました。結果としてはほぼ作業はうまく進んでいます(ただし完全ではありません)。

まず、プロジェクトのバージョンアップの為の前準備です。Tracの旧バージョンと新バージョンを共存させなければなりません。Pythonのバージョンを変えれば(2.3と2,4とか)それはそれでできると思います。しかし、Tracのためだけにバージョンの違うpythonを入れる事は私にとっては大仰すぎます。できれば今使っているPythonを使ってこれを実現したいところです。この辺は人によって意見が分かれそうですね。
ということで、今回のバージョンアップの要件を以下のように定めました

  1. プロジェクト単位でTracのバージョンを自由に選べる(プロジェクト単位でバージョンアップが行える)
  2. Pythonは現在使用しているものを使う
  3. アップグレードに関するダウンタイムはできるだけ少ないものとし、仕事に影響の出ないようにする

まず、新しいバージョンのTracのインストールです。既に古いバージョンのTracがインストールされているので、別ディレクトリに新しいTracをインストールします。Tracの最新バージョンをダウンロードして解凍し、解凍したディレクトリに移ります(今回はインターアクト社提供の日本語版を使用)。

wget http://www.i-act.co.jp/project/products/downloads/trac-0.10.4-ja-1.zip
unzip trac-0.10.4-ja-1.zip
cd trac-0.10.4-ja-1
sudo mkdir /opt/trac-0.10.4-ja
sudo python setup.py install --prefix=/opt/trac-0.10.4-ja

これでTracのインストールは完了しました。trac-adminなどシェルから実行するコマンドのパスに関しては、基本的にはサーバ管理者のみ使用するコマンドなので「新しいバージョンのtrac-adminは /opt/trac-0.10.4-ja/bin/trac10-admin にあるよ」の情報共有をするのみにしておき、お好みでパスを追加してもらうようにします。
ただし、これだけでは新しいバージョンのtrac-adminは動きません。一緒にインストールされたライブラリの類はデフォルトのライブラリパスを参照してしまい、インストールしたディレクトリ以下のライブラリを使用してはくれないからです。

そこで、trac-adminのラッパースクリプトを作ります。
/opt/trac-0.10.4-ja/bin/trac10-admin

#!/bin/bash
 
PYTHONPATH=/opt/trac-0.10.4-ja/lib/python2.3/site-packages /opt/trac-0.10.4-ja/bin/trac-admin $@

これでtrac-adminも使えるようになり、プロジェクトのコンバートができるようになりましたが、webインターフェース側の対応がまだです。これではプロジェクトがアップグレードできてもwebからは使えません。webから使えるようにする必要があります。

古いバージョンのTracはmod_pythonで動いているので、新しいバージョンはcgiで動かすことにしました。fastcgiを使いたいところですが、今回利用したサーバはパッケージだとfastcgiとmod_pythonの同時使用ができないようなのでさくっと諦めcgiを使うこととしました。そこそこアクセスがあるサイトだったら簡単に諦めていいものでもないのですが、アクセスがそれほどないサーバであったことが幸いです。
cgiに変更するため、apacheのサーバの設定を変更します。

ScriptAlias /path/to/trac /opt/trac-0.10.4-ja/share/trac/cgi-bin/trac.cgi
<Location "/dino-avico/trac">
  SetEnv TRAC_ENV "/path/to/project/trac"
  SetEnv PYTHONPATH "/opt/trac-0.10.4-ja/lib/python2.3/site-packages"
  SetEnv PYTHON_EGG_CACHE "/var/cache/apache2"

  ( ~ 中 略 ~ )
</Location>

もちろんmod_pythonを使用する設定は削除します。PYTHONPATHで新しいバージョンのTracをPythonに認識させてやるところはtrac-adminと一緒です。また、PYTHON_EGG_CACHEは各種egg形式で配布されているプラグインを使用するのに必要になります。これでapacheをリロードすればバージョンアップは完了です。

もちろん、ものぐさな私はインストール後のtrac-admin upgrade からapacheの再起動までをスクリプトとすることを忘れませんでした。プロジェクトで使用しているSVNのリビジョンによってはバージョンアップに5分ほどかかったりもしますが、各プロジェクトに対してコマンド一発でバージョンアップ作業が完了。残念ながらスクリプトは公開できませんが、ものぐさ鯖管は幸せになりましたとさ。めでたしめでたし。

ただし、このお話には続きがあります。バージョンアップが完全ではない部分ですが、jsやcssなど静的ファイルは古いバージョンと共有している状態となっています。多分Tracのコードやあるいは設定と調整すればできるのかもしれませんが使用上特に実害が出てないようなのでこのままにしてニタニタしてみます。問題が出たとき時に対処する予定です。
また、mod_pythonのみで複数バージョンを扱えるとベストだったのですが仕組み上できないのかな?試してみたところできませんでした。mod_pythonの仕組みを妄想すると(正確な仕組みは分かっていません)できなくてもおかしくはないと思ったり思わなかったりする今日この頃でした。
この辺は調べて後日まとめたいと思います。

追記1:
静的ファイルはtrac.iniのhtdocs_locationで設定できるのですね。

コメント / トラックバックはありません

コメントする