Chef SoloでTracLightningぽい環境を構築してみた
Chefが面白そうなのでいろいろやってみた結果、TracLightning+hglightぽい環境を構築できるようになったのでまとめを書いてみることにした。TracLightningと違うのはSubversion/MavenがないとかTracプラグインが最小限しかないくらいかな。
動作確認は次の環境で行った。
- Chef 11.4.0
- Windows 7 SP1 Professional(x86)
- Windows Server 2008 R2 Standard
- Windwos Server 2012 Standard
Chefリポジトリはここで、cookbook名はtracwithhgとした。
tracwithhgがやっていること
- Visual C++ 2008 ランタイムのダウンロードとインストール
- Python の動作に必要なため
- Python 2.7.4のダウンロードと"C:/Trac/python"への展開
- easy_install のインストールも
- Mercurial 2.5.4のダウンロードとインストール
- attribute(node['hg']['need_build'])にtrueを指定すると、MinGWをインストールして、ソースからビルド後インストールする。
- Trac 1.0.1のダウンロードとインストール
- Wikiに関しては TracJa 1.0を使っている。
- プロジェクト作成時に wiki load してるだけ。
- TracAccountManagerPlugin 0.4.3のダウンロードとインストール
- 認証方式にDigestを指定した場合のみ
- 認証方式にSSPIを指定した場合はインストールされない
- TracMercurialPlugin 1.0.0.3のダウンロードとインストール
- Apache 2.2.24のダウンロードと"C:/Trac/apache"への展開
- ファイアーウォールの例外にapache追加
- JRE 7u21のダウンロードと"C:/Trac/jre"への展開
- .NET Framework 3.5 SP1 の有効化
- JenkinsのWindowsサービス化に必要
- Windows 8/Windows Server 2012 ではデフォルトで無効化されているため必要
- Jenkins 1.514のダウンロードと"C:/Trac/jenkins"への展開&Trac(Jenkins)のWindowsサービス化
- Trac(Apache)のWindowsサービス化
準備
- Installing Chef Client on Windows - Chef - Opscode Open Source WikiからChefのインストーラをダウンロードしてインストール
- toruuetani / Chef-repository-TracWithHg ― Bitbucket を任意の場所(「C:/Chef」とか)にclone
- 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に対応してみた。こちらからどうぞ。インストール手順とかは本家と同じです。
- 本家 https://bitbucket.org/akihirox/hglight/wiki/
- fork https://bitbucket.org/toruuetani/hglight-for-traclightning3/
本家と違うのはこれくらい。
- hgweb対応を http://d.hatena.ne.jp/re_guzy/20091120/p1 でやった方法に置き換えた。
- TracMercurial 0.12を同梱したので、ライセンスがGPLになった。
今後やってみたいのはこれくらい。
TracLightningでMercurialを使ってみた
サーバリプレースのついでに、自己流でセットアップしたTrac0.10からTracLightning2.3.2に移行してみた。ついでにTracをmod_wsgiで動かしてみたり、Mercurialと連携させてみたり、チケットの自動クローズとかできるようにしてみたのでメモしておく。
環境はこんな感じ。
- Windows Server 2003 R2 Standard Edition
- TracLightning 2.3.2
- mod_wsgi 2.3
- Mercurial 1.4
- TracMercurial 0.11.0.8
- MinGW 5.1.6
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
- MercurialでPythonのフックを実行する方法 / PythonからOutputzにPOSTする方法 - SumiTomohikoの日記
- Mercurial のウェブインタフェースを mod_wsgi にのせてみた - daily dayflower
- Mercurial 勉強中 (7) - Web 経由の push と HTTP 認証 - daily dayflower
- Mercurial 勉強中 (8) - hook を Trac と絡めて - daily dayflower
- Mercurial: "Handling repository events with hooks" を読む | Inside ASCADE
これが一番苦労した。なぜかバッチファイルはどんなものを指定しても実行してくれない。権限の関係?
悩んでても解決しないので、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
あったら便利らしい
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
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
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 を置けない。
解決策
以前はこう対応させてたんだけど、
- http://goodspeed.xii.jp -> /home/XXX/www/
今はこんな風にドメインを分けて、エイリアスを使ってみた。
- http://goodspeed.xii.jp/ -> /home/XXX/www/trac/
- http://libra.jpn.org/ -> /home/XXX/www/libra/
上が 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
なんだかよくわからないけど、動いてるからまあいいか。
これからやりたいこと
なんとか準備は整ったので、本棚アプリを作る。
やりたいこととしては、これくらい。
- 自分の本棚管理(現実の蔵書管理じゃなくて、今までに読んだ本とか、これから読みたい本とかを管理)
- 本のステータス管理(次に読むとか、もう読み終わったとかを記録)
- ajax(もちろん jQuery)
- 開発してて気付いたことをブログに書く。
- 公開(自分の趣味に近い人の本棚を見て、その中の本を次に読むリストに登録とかやりたい)
公開まではできるかわからないけれど、そうなるとユーザ認証をうまく考えた方がよさそうだ。できるだけ敷居は低くしたいので、パスワードを新しく覚えさせるのは避けたい。はてなとか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 で取得したログが文字化け
表示できない文字は、Subversion が ?\xxx で置換する?
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 から標準添付なので、インストールは必要なくなった。
- apache_2.0.59-win32-x86-no_ssl.msi
- python-2.5.msi
- svn-win32-1.4.4.zip
- インストーラが 1.4.3 しかなかったのでこれを解凍してプログラムフォルダにコピー。
- svn-python-1.4.4.win32-py2.5.exe
- trac-0.10.4-ja-1.zip
- 解凍したらコマンドラインから「python setup.py install」。
- ClearSilver-0.10.4.win32-py2.5.zip
- via 気の向くままに・・・: Python2.5への移行
- 公式サイトだと、Python 2.4 用のものしかないので、非公式サイトからダウンロードした。解凍した neo_cgi.pyd を C:\Python25\Lib\site-packages にコピー。
- mod_python-3.3.1.win32-py2.5-Apache2.0.exe
- docutils-0.4.tar.gz
- 解凍したらコマンドラインから「python setup.py install」。
あとは以前と同じ。