バージョン違いのTrac(Trac0.12rc1とTrac0.10)の混在環境をmod_pythonで構築してみる実験

社内で利用中のTracのバージョンが0.10で、多少のカスタマイズがされていたり、時間が取れないとか、バージョンアップするためのモチベーションがなかったとか、そういったことがあって、0.10環境を使い続けていました。
今度の0.12は、マルチリポジトリというすばらしい機能が追加されていて、今度はバージョンアップする気満々です。

ですが、0.10の環境を0.12に、一気にバージョンアップするというのは、運用中の環境なので難しいという事情があり、段階移行を考えようと思い立ちました。
段階移行に当たって、混在環境が可能かどうかの調査をしました。また、実験環境を構築し動作しているようですので、その手順を公開します。

環境について

  • CentOS 5.3環境に、yumでセットアップしたTrac0.10(0.10-5)をあらかじめ用意
  • 上記環境にTrac0.12を追加で導入する
    • /opt/trac-0.12rc1 に配置する
  • mod_pythonで両方のバージョンを動作させる
  • python2.4
  • とりあえず実験環境なので、DBはsqliteを使う(ちなみに実環境はPostgresql

手順

CentOS5.3にyumでTrac0.10-4を導入
    • 省略します
Trac0.12の導入

基本的にはhttp://jamz.jp/tech/2008/06/how-to-install-trac-0_12_dev.htmlの手順で行いました。

  1. easy_install/setuptoolsが未導入なら
wget http://peak.telecommunity.com/dist/ez_setup.py
python ./ez_setup.py
yum install python-setuptools
  1. Trac0.12が利用するPyhonのライブラリを導入
easy_install Genshi
easy_install Babel
easy_install Pygments
easy_install docutils
easy_install textile

SilverCityは、Pygmentsが入ったので、無視でよいみたいです。SilverCity – The Trac Project

  1. Trac0.12の導入
wget http://ftp.edgewall.com/pub/trac/Trac-0.12rc1.tar.gz
tar xzvf Trac-0.12rc1.tar.gz
cd Trac-0.12rc1
mkdir /opt/trac-0.12rc1
python setup.py compile_catalog -f
python setup.py build
python setup.py install --root /opt/trac-0.12rc1/
  • これで、以下のようにファイルが配置される
    • Trac.egg-info to /opt/trac-0.12rc1/usr/lib/python2.4/site-packages/Trac-0.12rc1-py2.4.egg-info
    • trac-admin script to /opt/trac-0.12rc1/usr/bin
    • tracd script to /opt/trac-0.12rc1/usr/bin
  1. trac-adminのラッパースクリプトを作る
vi /usr/bin/trac-admin-012
    • 次のようにする
#!/bin/sh
#
export PYTHONPATH=/opt/trac-0.12rc1/usr/lib/python2.4/site-packages
/opt/trac-0.12rc1/usr/bin/trac-admin $@
    • 実行権付与
chmod +x /usr/bin/trac-admin-012
  1. 同様にTracdのラッパーも作ります
vi /usr/bin/tracd-012 
    • 次のようにする
#!/bin/sh
#
export PYTHONPATH=/opt/trac-0.12rc1/usr/lib/python2.4/site-packages
/opt/trac-0.12rc1/usr/bin/tracd $@
    • 実行権付与
chmod +x /usr/bin/tracd-012
Tracの環境(trac-admin initenvする)のために必要なものを準備する

Python2.4だと、追加でpysqliteの導入をします。TracInstall – The Trac Project

  • pysqlite未導入だとinitenvしたときにエラーが出ます
プロジェクトの生成と初期化
initenv 失敗: '/var/www/html/trac012/test-new' 
tracenv が作成できません。
SQLite 向け Python バインディングをロードできません
Traceback (most recent call last):
  File "usr/lib/python2.4/site-packages/trac/admin/console.py", line 413, in do_initenv
  File "usr/lib/python2.4/site-packages/trac/env.py", line 221, in __init__
  File "usr/lib/python2.4/site-packages/trac/env.py", line 408, in create
  File "usr/lib/python2.4/site-packages/trac/db/api.py", line 145, in init_db
  File "usr/lib/python2.4/site-packages/trac/db/api.py", line 195, in get_connector
TracError: <unprintable instance object>
initenv 失敗: '/var/www/html/trac012/test-new' 
1
Traceback (most recent call last):
  File "usr/lib/python2.4/site-packages/trac/admin/console.py", line 418, in do_initenv
SystemExit: 1
  • gccがpysqliteのビルドに必要なので、入ってなければ導入します
yum groupinstall "Development Tools" -y
  • pysqliteの導入
    • 必要なものをダウンロード
yum install sqlite-devel -y
wget http://pysqlite.googlecode.com/files/pysqlite-2.6.0.tar.gz
tar xzvf pysqlite-2.6.0.tar.gz
cd pysqlite-2.6.0
    • 設定ファイルの編集
vi setup.cfg
      • 設定ファイルのincludeとlibのファイルパス変更
#include_dirs=/usr/local/include
include_dirs=/usr/include
#library_dirs=/usr/local/lib
library_dirs=/usr/lib
    • ビルドとインストール
python setup.py build_static install
Tracの環境を作る(trac-admin initenv)
  • trac-adminで環境を作る
trac-admin-012 /var/www/html/trac012/test-new initenv
  • tracdでとりあえず動作確認
tracd-012 --port 8000 /var/www/html/trac012/test-new/

mod-pythonでTrac0.10/0.12を混在して動作させる

  • trac0.12用のhttpd設定
vi /etc/httpd/conf.d/trac0.12.conf
    • 以下のようにします(/trac012にアクセスすると、Tracプロジェクト一覧が見える)
<Location /trac012>
        SetHandler mod_python
        # PythonDebug On
        PythonPath "['/opt/trac-0.12rc1/usr/lib/python2.4/site-packages'] + sys.path"
        PythonInterpreter main_interpreter
        PythonHandler trac.web.modpython_frontend
        # PythonOption TracEnv /path/to/trac/project
        PythonOption TracEnvParentDir /var/www/html/trac012
        PythonOption TracLocale ja_JP.UTF8
        PythonOption PYTHON_EGG_CACHE /tmp/.trac012-python-egg-cache
        PythonOption TracUriRoot /trac012
</Location>
<LocationMatch "/trac012/[^/]+/login">
  AuthType Basic
  AuthName "Trac"
  AuthUserFile /opt/trac-0.12rc1/.htpasswd
  Require valid-user
</LocationMatch>
  • PythonPathの指定がミソです。

この指定が無いと、Trac0.12のコードが読まれません。
また、PythonPath "sys.path + ['/opt/trac-0.12rc1/usr/lib/python2.4/site-packages']" というように、sys.pathを先に書くと、/usr/lib/python2.4/site-packages以下あたりの、Trac0.10のPythonコードが読み込まれてInternalErrorとなります。(Database newer than Trac version)

  • あと、0.12からはmod_pythonの設定方法が今までとは変わっているようですのでバージョンアップ時には注意が必要ですね。
mod_pythonでの動作確認
  • httpdのリスタート
servce httpd restart

    • わかりにくいですが、0.10も動いています