Chef SoloでTracLightningぽい環境を構築してみた

Chefが面白そうなのでいろいろやってみた結果、TracLightning+hglightぽい環境を構築できるようになったのでまとめを書いてみることにした。TracLightningと違うのはSubversion/MavenがないとかTracプラグインが最小限しかないくらいかな。

f:id:re_guzy:20130525220055p:plain

動作確認は次の環境で行った。

  • Chef 11.4.0
  • Windows 7 SP1 Professional(x86)
  • Windows Server 2008 R2 Standard
  • Windwos Server 2012 Standard

Chefリポジトリここで、cookbook名はtracwithhgとした。

tracwithhgがやっていること

  1. Visual C++ 2008 ランタイムのダウンロードとインストール
    • Python の動作に必要なため
  2. Python 2.7.4のダウンロードと"C:/Trac/python"への展開
    • easy_install のインストールも
  3. Mercurial 2.5.4のダウンロードとインストール
    • attribute(node['hg']['need_build'])にtrueを指定すると、MinGWをインストールして、ソースからビルド後インストールする。
  4. Trac 1.0.1のダウンロードとインストール
    • Wikiに関しては TracJa 1.0を使っている。
    • プロジェクト作成時に wiki load してるだけ。
  5. TracAccountManagerPlugin 0.4.3のダウンロードとインストール
    • 認証方式にDigestを指定した場合のみ
    • 認証方式にSSPIを指定した場合はインストールされない
  6. TracMercurialPlugin 1.0.0.3のダウンロードとインストール
  7. Apache 2.2.24のダウンロードと"C:/Trac/apache"への展開
  8. ファイアーウォールの例外にapache追加
  9. JRE 7u21のダウンロードと"C:/Trac/jre"への展開
  10. .NET Framework 3.5 SP1 の有効化
    • JenkinsのWindowsサービス化に必要
    • Windows 8/Windows Server 2012 ではデフォルトで無効化されているため必要
  11. Jenkins 1.514のダウンロードと"C:/Trac/jenkins"への展開&Trac(Jenkins)のWindowsサービス化
  12. Trac(Apache)のWindowsサービス化
    • Twitter Bootstrapで作成したHTMLをApacheで公開
    • mod_wsgi 3.3のダウンロードと有効化
    • SSPI認証なら mod_auth_sspi 1.0.4のダウンロードと有効化
    • Tracをmod_Wsgiで公開できるようにhttpd.conf書き換え

準備

  1. Installing Chef Client on Windows - Chef - Opscode Open Source WikiからChefのインストーラをダウンロードしてインストール
  2. toruuetani / Chef-repository-TracWithHg ― Bitbucket を任意の場所(「C:/Chef」とか)にclone
  3. Chefに同梱されている「win32/registry.rb」を修正(参照:Chef Solo で invalid byte sequence in Windows-31J / invalid byte sequence in UTF8 に遭遇したときの対処をいくつか - 記憶は削除の方向で

実行方法

cloneしてきたChefリポジトリに同梱されている「install.bat」を管理者権限で実行するだけ。
※Windows Server 2012 の場合、インストールメディアがDドライブにセットされている必要あり。Dドライブ以外にインストールメディアをセットする場合、attribute(node['netfx3']['source'])を環境に合わせて修正すること。

プロジェクト作成方法

create-hg-project.batを実行するだけ。
最低限Tracプロジェクト名を指定する必要あり。Mercurialリポジトリをcloneする場合はcloneするURLを指定すること。

既存プロジェクトに管理するMercurialリポジトリを追加する場合、create-hg-append.batを実行してTracプロジェクト名とMercurialリポジトリ名を指定する。Mercurialリポジトリをcloneする場合はcloneするURLを指定すること。

Digest認証の場合、初期ユーザーとして次の2アカウントを用意する。

  • アカウント: admin, パスワード: admin
  • アカウント: guest, パスワード: guest

TODO

  • Jenkinsでプロジェクト作成
  • Jenkinsでバックアップ
  • Jenkins関連ができたらhglightにも反映すること

hglightをTracLightning 3.0に対応してみた。

自己流でTracMercurialをセットアップするのも面倒なので、hglightをforkしてTracLightning 3.0に対応してみた。こちらからどうぞ。インストール手順とかは本家と同じです。

本家と違うのはこれくらい。

今後やってみたいのはこれくらい。

  • trac-post-commit-hook対応
    • ないと結構やってられない。
    • trac 0.11だと、チケットの更新日時がミリ秒まで持ってない?から多数のチェンジセットをpushすると、たまにフックに失敗してコメントが付与されないことがある。 trac 0.12でミリ秒まで持つようになったらしいので、それはなくなるはず。
  • プロジェクト生成時、既存リポジトリからcloneできるようにする。

TracLightningでMercurialを使ってみた

 サーバリプレースのついでに、自己流でセットアップしたTrac0.10からTracLightning2.3.2に移行してみた。ついでにTracをmod_wsgiで動かしてみたり、Mercurialと連携させてみたり、チケットの自動クローズとかできるようにしてみたのでメモしておく。

環境はこんな感じ。

TracLightningをmod_wsgiで動かす

参考URL

これは参考URLのまま。
1.2つ目のURLからmod_wsgi.soをダウンロードして、C:\TracLight\CollabNetSVN\httpd\modulesにコピー
2.C:\TracLight\CollabNetSVN\httpd\conf\httpd.confの書き換え

--- a/CollabNetSVN/httpd/conf/httpd.conf	Fri Nov 20 14:55:06 2009 +0900
+++ b/CollabNetSVN/httpd/conf/httpd.conf	Fri Nov 20 15:05:18 2009 +0900
@@ -496,7 +496,7 @@
 LoadFile "../../python/python25.dll"
 LoadModule authz_svn_module modules/mod_authz_svn.so
 LoadModule dav_svn_module modules/mod_dav_svn.so
-LoadModule python_module modules/mod_python.so
+#LoadModule python_module modules/mod_python.so
 #LoadModule fcgid_module modules/mod_fcgid.so
 
 
@@ -534,14 +534,19 @@
 # PythonDebug On 
 
 #DefaultInitEnv TRAC_ENV_PARENT_DIR "C:\TracLight\projects\trac"
-ScriptAlias /trac "C:\TracLight\CollabNetSVN\httpd\cgi-bin\trac.cgi"
+#ScriptAlias /trac "C:\TracLight\CollabNetSVN\httpd\cgi-bin\trac.cgi"
+LoadModule wsgi_module modules/mod_wsgi.so
+WSGIScriptAlias /trac "C:/TracLight/CollabNetSVN/httpd/cgi-bin/trac.wsgi"
 
 <Location "/trac">
-  SetHandler mod_python
-  PythonHandler trac.web.modpython_frontend
-  PythonOption TracEnvParentDir "C:\TracLight\projects\trac"
-  PythonOption TracUriRoot /trac
-  PythonOption PYTHON_EGG_CACHE "C:\TracLight\projects\.egg-cache"
+#  SetHandler mod_python
+#  PythonHandler trac.web.modpython_frontend
+#  PythonOption TracEnvParentDir "C:\TracLight\projects\trac"
+#  PythonOption TracUriRoot /trac
+#  PythonOption PYTHON_EGG_CACHE "C:\TracLight\projects\.egg-cache"
+  WSGIApplicationGroup %{GLOBAL}
+  Order deny,allow
+  Allow from all
 </Location>
 
 <Location "/svn/">

3.C:\TracLight\CollabNetSVN\httpd\cgi-bin\trac.wsgiを作成

#!C:\TracLight/python/python.exe
# -*- coding: utf-8 -*-
#

import sys
sys.stdout = sys.stderr

import os
os.environ['TRAC_ENV_PARENT_DIR'] = 'C:/TracLight/projects/trac'
os.environ['PYTHON_EGG_CACHE'] = 'C:/TracLight/projects/.egg-cache'

import trac.web.main

application = trac.web.main.dispatch_request

Mercurialとの連携

参考URL

Mercurialはバイナリインストーラは使わず、easy_installでインストールする。でないと、TracMercurialを入れても「Unsupported version control system "hg"」と言われてしまう。

なので、まずはeasy_installから。ez_setup.pyをダウンロードして、コマンドラインから以下のコマンドを実行する。

python ez_setup.py


次に、Mercurialをコンパイルできるようにするため、2つ目のURLを参考にMinGWをインストール。
環境変数PATHに以下の設定を追加して、

%PATH%;C:\MinGW\bin;

C:\TracLight\python\Lib\distutilsの中に「distutils.cfg」というファイルを作成し、そのファイルに下記を記述して保存。

[build]
compiler=mingw32

あとは以下のコマンドでMercurialがインストールできる。

easy_install mercurial


次はTracMercurial – The Trac Project

easy_install -UZ http://svn.edgewall.com/repos/trac/sandbox/mercurial-plugin-0.11

SVNでチェックアウトできない場合は、ソースをダウンロードして、以下のコマンドでインストールする。

python setup.py install


最後にtrac.iniを変更する。
Mercurialリポジトリを「C:\TracLight\projects\hg」に作ることにして、「C:\TracLight\projects\hg\SampleProject」にリポジトリを作成。

--- a/projects/trac/SampleProject/conf/trac.ini	Fri Nov 20 15:05:18 2009 +0900
+++ b/projects/trac/SampleProject/conf/trac.ini	Fri Nov 20 16:59:36 2009 +0900
@@ -29,7 +29,8 @@
 resolve.permissions = TICKET_MODIFY
 
 [trac]
-repository_dir = C:\TracLight\projects/svn/SampleProject
+repository_dir = C:\TracLight\projects/hg/SampleProject
+repository_type = hg
 
 authz_module_name = SampleProject 
 [mainnav]
@@ -53,6 +54,7 @@
 timingandestimationplugin.ticket_daemon.timetrackingticketobserver = disabled
 timingandestimationplugin.ticket_webui.ticketwebuiaddon = disabled
 timingandestimationplugin.webui.timingestimationandbillingpage = disabled
+tracext.hg.* = enabled
 
 [ticket-custom]
 due_assign = text
@@ -73,8 +75,11 @@
 private_wikis = SECRET
 
 #[searchhyperestraier]
 #index_path = C:\TracLight\casket
 #replace_left = C:\TracLight\rep
 #url_left = /
 
+[hg]
+show_rev = yes
+node_format = short

チェンジセット1がない、とエラーにはなるが、コミットすれば問題なく使えるようになる。

チケットの自動クローズ

参考URL

これが一番苦労した。なぜかバッチファイルはどんなものを指定しても実行してくれない。権限の関係?

悩んでても解決しないので、1個目のURLを参考に別の方法でアプローチする。


まずMercurialリポジトリをhttpで公開する。
2個目と3個目のURLを参考に、C:/TracLight/CollabNetSVN/httpd/cgi-bin/hgweb.wsgiを作成して、

import os
os.environ['HGENCODING'] = 'UTF-8'

import mercurial.hg as hg
from mercurial.ui import ui
from mercurial.hgweb.hgweb_mod import hgweb
from mercurial.hgweb.hgwebdir_mod import hgwebdir
from mercurial.hgweb.request import wsgiapplication

def listdir_dironly(base_dir):
    results = []    # prepare for failure
    for root, dirs, files in os.walk(base_dir):
        results = map(lambda d: os.path.join(root, d), dirs)
        dirs[:] = []
    results.sort()
    return results

def get_repo_for_path(path):
    return hg.repository(ui(interactive=False,
                            report_untrusted=False),
                         path=path)

def isrepo(path):
    if False:   # too redundant
        try:
            get_repo_for_path(path)
            return True
        except hg.RepoError:
            return False
    else:
        return os.path.isdir(os.path.join(path, '.hg'))

def make_hgweb_maker(path):
    return lambda: hgweb(path, os.path.split(path)[1])
    #return lambda: hgweb(get_repo_for_path(path))

def make_hgwebdir_maker(path):
    dirs = listdir_dironly(path)
    repos = [(os.path.split(dir)[1], dir) for dir in dirs]
    return lambda: hgwebdir(repos)

def hgweb_wsgiapp(path):
    if isrepo(path):
        return wsgiapplication(make_hgweb_maker(path))
    else:
        return wsgiapplication(make_hgwebdir_maker(path))

# for WSGI
def application(environ, start_response):
    def filter_headers(status, response_headers):
        # stringify header content
        headers = [(key, str(value)) for key, value in response_headers]
        return start_response(status, headers)
    def error_dialog(message):
        headers = [('Content-Type',   'text/plain'),
                   ('Content-Length', str(len(message)))]
        start_response('500 Internal Server Error', headers)
        return [message]

    if 'hgweb.reposdir' in environ:
        reposdir = environ['hgweb.reposdir']
    else:
        return error_dialog("You must specify 'hgweb.reposdir' environment")

    wsgiapp = hgweb_wsgiapp(reposdir)
    return wsgiapp(environ, filter_headers)

# for CGI
if os.environ.get('GATEWAY_INTERFACE', '').startswith('CGI/'):
    import cgitb
    cgitb.enable()

    import mercurial.hgweb.wsgicgi as wsgicgi
    wsgicgi.launch(hgweb_wsgiapp('/path/to/repos'))

さらにhttpd.confを修正する。この時点でHTTP経由でリポジトリが参照できるはず。

--- a/CollabNetSVN/httpd/conf/httpd.conf	Fri Nov 20 16:59:36 2009 +0900
+++ b/CollabNetSVN/httpd/conf/httpd.conf	Fri Nov 20 17:30:12 2009 +0900
@@ -588,3 +588,19 @@
   ProxyPass        http://127.0.0.1:8010/hudson
   ProxyPassReverse http://127.0.0.1:8010/hudson
 </Location>
+
+WSGIScriptAlias /hg "C:/TracLight/CollabNetSVN/httpd/cgi-bin/hgweb.wsgi"
+
+<Location "/hg">
+  WSGIApplicationGroup %{GLOBAL}
+  SetEnv hgweb.reposdir "C:/TracLight/projects/hg/"
+  Order deny,allow
+  Allow from all
+
+  AuthType Digest
+  AuthName trac
+  AuthUserFile "C:\TracLight\projects\trac.htdigest"
+  <LimitExcept GET PROPFIND OPTIONS REPORT>
+    Require valid-user
+  </LimitExcept>
+</Location>

次に4個目のURLを参考に、C:\TracLight\python\Lib\site-packages\hg_post_commit.pyを作成する。これは複数リポジトリがあってもいいように、少し修正してある。

# -*- encoding: utf-8 -*-

hook_script = 'C:/TracLight/python-lib/trac/contrib/trac-post-commit-hook'

# style:: 'short', 'long', or 'number'
changeset_id_style = 'short'

import os

def invoke_trac_hook(trac_env, rev):
    def _make_smart_rev(trac_env, rev):
        if changeset_id_style == 'long':
            return rev
        else:
            import trac.env
            env = trac.env.open_environment(trac_env)
            # instance of mercurial.hg.repository
            repo = env.get_repository().repo
            ctx = repo.changectx(rev)
            if changeset_id_style == 'short':
                import mercurial.node
                return mercurial.node.short(ctx.node())
            else:   # 'number'
                return str(ctx.rev())

    smart_rev = _make_smart_rev(trac_env, rev)

    f = open(hook_script, 'r')
    try:
        import imp
        ext = os.path.splitext(hook_script)[1]
        m = imp.load_module('trac_hook', f, f.name, (ext, f.mode, imp.PY_SOURCE))
        m.CommitHook(project=trac_env, rev=smart_rev)
    finally:
        f.close()

def hook(ui, repo, **kwargs):
    hg_dir, _ = os.path.split(repo.path)
    hg_root_dir, project_name = os.path.split(hg_dir)
    trac_dir = os.path.join(os.path.join(hg_root_dir, os.path.pardir, 'trac', project_name))

    if 'PYTHON_EGG_CACHE' not in os.environ:
        os.environ['PYTHON_EGG_CACHE'] = os.path.join(trac_dir, '.egg-cache')

    invoke_trac_hook(trac_dir, kwargs.get('node'))

最後に「C:\TracLight\projects\hg\SampleProject\.hg\hgrc」を作成して、上記のスクリプトを指定する。

[hooks]
incoming.trac = python:hg_post_commit.hook

[web]
push_ssl = false
allow_push = *
deny_push = unauthenticated_user

あとはSVNのときと同じようにコミットしてpushすれば、チケットが自動クローズされる。

CORESERVER に trac を入れてみた

 動作例はこんな感じ --> http://reguzy.jp/
 基本的に TracDoc/SakuraInternet - HirobeのHack倉庫 - Trac を参考にしてます。

前提

virtual-python と easy_install が便利なので使う。easy_install でpysqlite を入れておく。

# virtual-python
wget http://peak.telecommunity.com/dist/virtual-python.py
python virtual-python

# .bashrc
touch ~/.bashrc
echo 'export PYTHONPATH=~/lib/python2.4/site-packages' > ~/.bashrc
echo 'export PATH=~/bin:$PATH' > ~/.bashrc

#easy_install
wget http://peak.telecommunity.com/dist/ez_setup.py
python ez_setup.py

# pysqlite
easy_install pysqlite

以下、ダウンロードしたり make なんかは ~/tmp ディレクトリで行っている。インストール先とかはいいかげんなので、見直した方がいいかも。

Subversion Python バインディング

CORESERVER には Subversion がインストールされているんだけど、古いのと Python バインディングを入れる方法がわからなかったので、1.4 をインストールする。

swig (よく知らない)
cd ~/tmp
wget http://jaist.dl.sourceforge.net/sourceforge/swig/swig-1.3.31.tar.gz
gunzip swig-1.3.31.tar.gz
tar xvf swig-1.3.31.tar
cd SWIG-1.3.31
./configure --prefix=$HOME/local
make
make install
Subversion & Python バインディング
cd ~/tmp
wget http://subversion.tigris.org/downloads/subversion-1.4.4.tar.gz
wget http://subversion.tigris.org/downloads/subversion-deps-1.4.4.tar.gz

tar -xzvf  subversion-1.4.4.tar.gz
tar -xzvf  subversion-deps-1.4.4.tar.gz
cd subversion-1.4.4/apr
./configure --prefix=$HOME/local
make
make install

cd ../apr-util
./configure --prefix=$HOME/local --with-apr=$HOME/local/bin/apr-config
make
make install

cd ../
./configure --prefix=$HOME/local --with-apr=$HOME/local/bin/apr-config --with-apu-config=$HOME/local/bin/apu-config
make
make install

make swig-py
make install install-swig-py

Python が見つけられるように、PYTHONPATH にリンクしておく。

ln -s $HOME/local/lib/svn-python/* $PYTHONPATH

clearsilver

easy_install でインストールできるんだけど、それで入る 0.10.x だとエラーになって trac が動かない。仕方がないので、手動で 0.9 をインストールした。

cd ~/tmp
wget http://www.clearsilver.net/downloads/clearsilver-0.9.14.tar.gz
gunzip clearsilver-0.9.14.tar.gz
tar -xvf clearsilver-0.9.14.tar
cd clearsilver-0.9.14
./configure --prefix=$HOME/local --oldincludedir=$HOME/local/include --disable-ruby --disable-java --disable-perl --disable-csharp --disable-python --disable-static
make
make install

cd python
python setup.py install

あったら便利らしい

docutils

trac で RST が使えるようになるらしい。よく知らない。

easy_install docutils
SilverCity

リポジトリブラウザで構文強調がされたりして、なんとなく幸せになれる。

cd ~/tmp
wget http://jaist.dl.sourceforge.net/sourceforge/silvercity/SilverCity-0.9.7.tar.gz
tar zxvf SilverCity-0.9.7.tar.gz
cd SilverCity-0.9.7
python setup.py install

trac

ようやく trac 本体。もちろんインタアクトさんの日本語版を使用する。

cd ~/tmp
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
python setup.py install
TracEnv の作成

~/repos/trac に作成する。

trac-admin ~/repos/trac initenv
cgi で動作させる

とりあえずサブドメインとかは使わないで動かすので、 trac.cgi を ~/public.html にコピー。サブドメインとかを使うなら ~/public_html/sub.example.com かな。

cp ~/share/trac/cgi-bin/trac.cgi ~/public_html

~/public_html に置く .htaccess はこんな感じで。

RewriteEngine On
RewriteRule ^$ /trac/ [R=301,L]
RewriteRule ^trac/(.*)$ /trac.cgi/$1 [L]

次に trac.cgi を編集して ~/public_html にアップロードする。TRAC_ENV の設定は必須。SCRIPT_NAME は任意だけど、これを指定しないと /trac.cgi/wiki/ とかになる。http://example.com/wiki/ っていう表示にする方法は見つけられなかった。

# 1行目
#!/virtual/reguzy/bin/python

# 18行目移行に追記する。
try:
    import os
    os.environ['SCRIPT_NAME'] = "/trac/"
    os.environ['TRAC_ENV'] = "/virtual/XXX/repos/trac"
    from trac.web import cgi_frontend
静的ファイルは cgi で配信しない

trac の静的ファイルへリンクしておいて、trac.ini でその場所を指定すればいい。

ln -s ~/share/trac/htdocs/ ~/public_html/trachtdocs

~/repos/trac/conf/trac.ini の trac セクションの htdocs_location を上記のリンクにしておく。

[trac]
htdocs_location = /trachtdocs/

trac プラグイン

WebAdmin

これは easy_install で。

easy_install http://svn.edgewall.com/repos/trac/sandbox/webadmin/

それだけだと動作しないので、 trac.ini に設定を追記する。

[components]
webadmin.* = enabled
AccountManager

ブラウザからユーザを作成するために必要なんだけど、どうも http://trac-hacks.org/ がダウンしてるみたい。本家にチケット #6089 (can't reach http://trac-hacks.org/) - The Trac Project があるけど、しばらく復旧しそうにない。なのでさくらから egg を ~/repos/trac/plugin/ にコピーした。

まずはアカウントを作成するために、 ~/repos/trac/conf/trac.ini に追記する。

[account-manager]
password_format = htpasswd
password_file = /virtual/XXX/repos/trac/conf/trac.htpasswd

[components]
trac.web.auth.LoginModule = disabled
acct_mgr.web_ui.LoginModule = enabled

アカウントを作成したら、勝手にユーザを作られないようにしておく。

[components]
trac.web.auth.LoginModule = disabled
acct_mgr.web_ui.LoginModule = enabled
acct_mgr.web_ui.registrationmodule = disabled

いろいろ出来るように、作成したユーザに管理者権限を与えておく。これでログインすれば Admin メニューが使えるようになってるはず。

trac-admin ~/repos/trac permission add XXX TRAC_ADMIN
SpamFilter

まあないよりあった方がいいので、スパム対策もしておく。

easy_install TracSpamFilter

Admin で 有効化したら、trac.ini に設定を追記する。

[akismet]
api_key = your_api_key
api_url = rest.akismet.com/1.1/

upgrade が必要なのでしておく。

trac-admin ~/repos/trac upgrade

trac-post-commit-hook

これもないよりあった方がいいので、動くようにしておく。

cp ~/tmp/trac-0.10.4-ja-1/contrib/trac-post-commit-hook ~/repos/svn/hooks

post-commit はこんな感じ。実行権限を与えるのを忘れずに。さくらと違って、UTF-8 のための小細工は必要ない。いいね。

#!/bin/sh
REPOS="$1"
REV="$2"

export LANG=ja_JP.UTF-8
LOG=`svnlook log -r $REV $REPOS`
AUTHOR=`svnlook author -r $REV $REPOS`

python ${REPOS}/hooks/trac-post-commit-hook \
 -p "/virtual/XXX/repos/trac" \
 -r "$REV"    \
 -u "$AUTHOR" \
 -m "$LOG"


だいたい必要なのはこれくらいかな。

さくらに trac と Django を共存させる

Django で本棚管理アプリを作ろうと思い立って、さくらに Django を入れてみたら結構手間取ったのでメモ。

手間取った理由

普通にインストールするだけなら、上記のサイトで事足りるはず。
手間取ったのは、trac が導入済みだったから。なので /home/XXX/www/ に django.cgi を置けない。

解決策

以前はこう対応させてたんだけど、

今はこんな風にドメインを分けて、エイリアスを使ってみた。

上が trac で、下がこれから作る Django アプリですな。


で、 django.cgi は http://code.djangoproject.com/attachment/ticket/2407/django.cgi からダウンロード。
これを /home/XXX/www/libra/ にコピーして、次のように修正する。

1行目を変更

#!/usr/bin/env PYTHONPATH=/home/XXX/local/lib/python:/home/XXX/local/lib/python/site-packages python

34行目に追加

sys.path.append('/home/XXX/local/lib/python')
sys.path.append('/home/XXX/local/lib/python/site-packages')

95-97行目を変更

sys.path.append("/home/XXX/www")
# Change mysite to the name of your site package
os.environ['DJANGO_SETTINGS_MODULE'] = 'libra.settings'


これで http://libra.jpn.org/ にアクセスすると、「It worked!」な画面が表示される。

※ ただ、DBを使いだすとうまく動かない。ライブラリにパスが通ってないのか?
仕方ないので、 trac のときと同じように一段かませるようにした。
具体的には django.cgi -> django_.cgi という名前に変更して、次の django.cgi を追加した。

#!/bin/sh
LD_LIBRARY_PATH=/home/XXX/local/lib;export LD_LIBRARY_PATH
PYTHONPATH=/home/XXX/local/lib/python:/home/good-speed/local/lib/python/site-packages;export PYTHONPATH
/usr/local/bin/python /home/XXX/www/libra/django_.cgi

なんだかよくわからないけど、動いてるからまあいいか。

これからやりたいこと

なんとか準備は整ったので、本棚アプリを作る。
やりたいこととしては、これくらい。

  1. 自分の本棚管理(現実の蔵書管理じゃなくて、今までに読んだ本とか、これから読みたい本とかを管理)
  2. 本のステータス管理(次に読むとか、もう読み終わったとかを記録)
  3. ajax(もちろん jQuery
  4. 開発してて気付いたことをブログに書く。
  5. 公開(自分の趣味に近い人の本棚を見て、その中の本を次に読むリストに登録とかやりたい)

公開まではできるかわからないけれど、そうなるとユーザ認証をうまく考えた方がよさそうだ。できるだけ敷居は低くしたいので、パスワードを新しく覚えさせるのは避けたい。はてなとかlivedoorの認証APIを使うのがいいのかな。
Webサービスというのはなかなか難しい。

さくらインターネットに構築した trac で trac-post-commit-hook

trac サイトを構築した時のメモ の続き。


trac を構築していて trac-post-commit-hook を使っていないのはありえない、っていうくらい便利な trac-post-commit-hook ですが、さくらに構築したときにものすごく手間取ったのでメモ。

ちなみに trac:0.10.4、subversion:1.2.3 です。

詰まったところ

svnlook の結果が変数に格納されない

svnlook のパスを省略したらだめっぽい。

svnlook で取得したログが文字化け

表示できない文字は、Subversion が ?\xxx で置換する?

  • > LANG=ja_JP.UTF-8 を指定したらいけるはず。
  • > さくらにそんな文字コードはない、と怒られる。
  • > ここ から svnlog2utf8 をダウンロードして、/home/XXX/local/bin/ に置く。それに svnlook の出力を渡したら文字化けしなくなった。
trac-post-commit-hook が実行されない

PYTHONPATH がおかしい?

  • > export PYTHONPATH で解決した。

post-commit

最終的に post-commit はこうなった。XXXはさくらのユーザ名を指定して、TRAC_REPOSに trac のパスを指定する。

#!/bin/sh

REPOS="$1"
REV="$2"

USER_HOME="/home/XXX"
TRAC_REPOS="/path/to/trac/"
BIN="${USER_HOME}/local/bin"
LOG=`${BIN}/svnlook log -r "${REV}" "${REPOS}" | ${BIN}/svnlog2utf8`
AUTHOR=`${BIN}/svnlook author -r "${REV}" "${REPOS}"`

PYTHONPATH=${USER_HOME}/local/lib/python:${USER_HOME}/local/lib/python/site-packages;export PYTHONPATH

/usr/local/bin/python ${REPOS}/hooks/trac-post-commit-hook \
 -p "${TRAC_REPOS}"  \
 -r "${REV}"       \
 -u "${AUTHOR}"    \
 -m "${LOG}"

あとは post-commit と trac-post-commit-hook を、 Subversionリポジトリの hooks ディレクトリにコピーしてやればOK。

さっき気付いたんだけど、Windows版ではチケットに転記されるログが最初の1行だけなのに、さくらに構築したら何もしなくても普通に全部転記されてた。
Windowsでやってた時は、なんとか全部転記させようといろいろ苦労したのになあ?なんでだろう?

trac 0.10 on Windows × Python 2.5

ここら辺の続き。


Python 2.5 を使いたいとかいう人以外は、Trac月を使ったほうが幸せだと思います。
Vista だと trac が動いてくれません。tracd だと大丈夫。原因はよく分からない。

インストールリスト

インストールするものは Python 2.5 用のものを使う。
pysqlite が Python 2.5 から標準添付なので、インストールは必要なくなった。


あとは以前と同じ。