Trac是一個用
Python程式語言開發出來的軟體開發專案管理程式,可與
Subversion版本控制系統整合,也支援
PostgreSQL資料庫,可讓開發團隊透過網頁介面來管理專案的Wiki文件及問題追蹤。Trac不但免費且開放原始碼(符合
BSD授權),安裝在同樣也是免費的Linux作業系統
CentOS上是個非常棒的組合。
通常同一個開發團隊會參與多個專案,在安裝時我們需要考慮支援多專案的管理。對於多專案的管理,我們可以這樣設計:

每個Project一個專屬的Subverstion Repository,但是放在一個共同的根目錄下:
/path/to/repos/project1
/path/to/repos/project2
Repository存取方式:
http://my.domain.name/svn/project1
http://my.domain.name/svn/project2

每個Project一個專屬的Trac Project Environment,但是放在一個共同的根目錄下:
/path/to/projects/project1
/path/to/projects/project2
Trac Project存取方式:
http://my.domain.name/projects/project1
http://my.domain.name/projects/project2
瞭解了設計的理念後,要安裝就很容易了,請將以下的程式碼複製後貼到一個trac_setup.sh檔案內,並修改相關的參數,然後將trac_setup.sh變更為可執行,然後執行即可(假設已安裝好gcc和
PostgreSQL)。
#!/bin/bash
# Name: trac_setup.sh
# Author: Andowson Chang (andowson [at] gmail [dot] com)
# Version: 0.9
# Since: 2007-01-10
# Last Modified: 2007-08-31
# 請自行依據實際環境修改這邊的參數
SETUP_DIR=/var/trac/setup
REPOSITORY=/var/trac/repos
PROJECTS=/var/trac/projects
TRAC_ADMIN_USER=admin
TRAC_ADMIN_PASSWD=admin
APACHE_USER=apache
APACHE_GROUP=tomcat
# 安裝 Python, ClearSilver, pyPgSQL, Subversion, SWIG, mod_python
# 因為要裝的東西不少,建議是建立一個目錄來存放比較好管理
mkdir -p ${SETUP_DIR}
cd ${SETUP_DIR}
# 安裝Python
yum -y install python python-devel mod_python
PYTHON_VERSION=`python -V 2>&1 | awk '{print $2}' | cut -d "." -f1-2`
# 安裝ClearSilver
yum -y install zlib-devel
wget http://www.clearsilver.net/downloads/clearsilver-0.10.5.tar.gz
tar zxf clearsilver-0.10.5.tar.gz
cd clearsilver-0.10.5
./configure --with-python=/usr/bin/python --prefix=/usr/local --disable-ruby --disable-java --disable-apache --disable-csharp --disable-perl
make
make install
cd ..
# 安裝pyPgSQL
yum -y install postgresql-devel
wget http://nchc.dl.sourceforge.net/sourceforge/pypgsql/pyPgSQL-2.5.1.tar.gz
tar zxvf pyPgSQL-2.5.1.tar.gz
cd pyPgSQL-2.5.1
python setup.py install
cd ..
# 安裝Subversion
yum -y install subversion mod_dav_svn swig
# 安裝setuptools
wget http://peak.telecommunity.com/dist/ez_setup.py
python ez_setup.py
# 安裝docutils
wget http://docutils.sourceforge.net/docutils-snapshot.tgz
tar zxf docutils-snapshot.tgz
cd docutils
python setup.py install
cd tools
./rst2html.py ../FAQ.txt ../FAQ.html
cd ../..
# 安裝SilverCity
yum -y install gcc-c++ libstdc++-devel
wget http://nchc.dl.sourceforge.net/sourceforge/silvercity/SilverCity-0.9.7.tar.gz
tar zxf SilverCity-0.9.7.tar.gz
cd SilverCity-0.9.7
python setup.py install
cd ..
# 安裝enscript
yum -y install enscript
# 安裝 mxDateTime
wget http://downloads.egenix.com/python/egenix-mx-base-3.0.0.linux-i686-py${PYTHON_VERSION}_ucs4.prebuilt.zip
unzip egenix-mx-base-3.0.0.linux-i686-py${PYTHON_VERSION}_ucs4.prebuilt.zip
cd egenix-mx-base-3.0.0.linux-i686-py${PYTHON_VERSION}_ucs4.prebuilt
python setup.py build --skip install
cd ..
# 安裝Trac
wget http://ftp.edgewall.com/pub/trac/trac-0.10.4.tar.gz
tar zxf trac-0.10.4.tar.gz
cd trac-0.10.4
python setup.py install
cd ..
# 安裝WebAdmin管理介面
easy_install http://svn.edgewall.com/repos/trac/sandbox/webadmin/
# 安裝AccountManager
easy_install http://trac-hacks.org/svn/accountmanagerplugin/0.10/
# 安裝IniAdmin
easy_install http://trac-hacks.org/svn/iniadminplugin/0.11/
# 安裝Gantt圖
wget http://willbarton.com/files/TracGantt-0.3.2a-py${PYTHON_VERSION}.egg
easy_install TracGantt-0.3.2a-py${PYTHON_VERSION}.egg
# 使用mod_python和Apache整合
echo "<Location /projects>
SetHandler mod_python
PythonHandler trac.web.modpython_frontend
PythonOption TracEnvParentDir ${PROJECTS}
PythonOption TracUriRoot /projects
SetEnv PYTHON_EGG_CACHE /tmp
</Location>
<LocationMatch \"/projects/[^/]+/login\">
AuthType Basic
AuthName \"Trac\"
AuthUserFile ${PROJECTS}/.htpasswd
Require valid-user
</LocationMatch>" >> /etc/httpd/conf.d/python.conf
# 使用mod_dav_svn和Apache整合
echo "<Location /svn>
DAV svn
SVNParentPath ${REPOSITORY}
AuthType Basic
AuthName \"Subversion Repository\"
AuthUserFile ${PROJECTS}/.htpasswd
AuthzSVNAccessFile ${PROJECTS}/svnaccess
<LimitExcept GET PROPFIND OPTIONS REPORT>
Require valid-user
</LimitExcept>
</Location>" >> /etc/httpd/conf.d/subversion.conf
# 新建Subversion Repository Root Directory
mkdir -p ${REPOSITORY}
chown -R ${APACHE_USER}.${APACHE_GROUP} ${REPOSITORY}
# 新建Project Root Directory
mkdir -p ${PROJECTS}
chown -R ${APACHE_USER}.${APACHE_GROUP} ${PROJECTS}
# 建立共用的管理者帳號
htpasswd -bc ${PROJECTS}/.htpasswd ${TRAC_ADMIN_USER} ${TRAC_ADMIN_PASSWD}
chown ${APACHE_USER}.${APACHE_GROUP} ${PROJECTS}/.htpasswd
# 設定Repositoty存取權限
echo "[/]
* = r
${TRAC_ADMIN_USER} = rw" > ${PROJECTS}/svnaccess
至此便安裝好了Trac,由於改了Apache的設定檔,故我們需要重新啟動Apache
service httpd restart
接下來要為每個專案建立一個Trac環境,Trac只需要安裝一套就可以支援多個專案,但是每個專案都要建立一個自己的Trac資料庫,例如我們的專案叫做project1,我們就新建一個叫trac_project1的資料庫(如果還有project2,資料庫名稱便取叫trac_project2)。請將下面的程式碼存成/var/lib/pgsql/newtracdb.sh並設為可執行:
psql -c "create user trac_$1 createdb;" template1
psql -c "create database trac_$1 with encoding 'unicode';" -U trac_$1 template1
psql -c "alter user trac_$1 nocreatedb;" template1
psql -c "alter user trac_$1 with encrypted password 'trac_$1';" template1
使用方式:
su - postgres
./newtracdb.sh project1
建立好了資料庫,我們可以將下面的指令存檔為newproject.sh並設為可執行:
# Name: newproject.sh
# Author: Andowson Chang (andowson [at] gmail [dot] com)
# Version: 0.9
# Last Modified: 2007-08-31
# 請自行依據實際環境修改這邊的參數
REPOSITORY=/var/trac/repos/$1
PROJECTS=/var/trac/projects
PROJECT=${PROJECTS}/$1
PROJECT_NAME="$2"
PROJECT_MANAGER=$3
DBNAME=trac_$1
DBUSER=trac_$1
DBPASSWD=trac_$1
TRAC_ADMIN_USER=admin
APACHE_USER=apache
APACHE_GROUP=tomcat
# 新建Subversion Repository
svnadmin create --fs-type fsfs ${REPOSITORY}
mkdir /tmp/$1
mkdir /tmp/$1/branches
mkdir /tmp/$1/tags
mkdir /tmp/$1/trunk
svn import /tmp/$1 file:///${REPOSITORY} --message 'Initial repository layout'
rm -rf /tmp/$1
chown -R ${APACHE_USER}.${APACHE_GROUP} ${REPOSITORY}
echo "
[$1:/]
* = r
${TRAC_ADMIN_USER} = rw
${PROJECT_MANAGER} = rw" >> ${PROJECTS}/svnaccess
# 新建一個Trac環境
trac-admin ${PROJECT} initenv "${PROJECT_NAME}" postgres://${DBUSER}:${DBPASSWD}@localhost/${DBNAME} svn ${REPOSITORY} /usr/share/trac/templates
chown -R ${APACHE_USER}.${APACHE_GROUP} ${PROJECTS}
# 設定管理者帳號
trac-admin ${PROJECT} permission add ${TRAC_ADMIN_USER} TRAC_ADMIN
trac-admin ${PROJECT} permission add ${PROJECT_MANAGER} TRAC_ADMIN
# 取消匿名使用者的部分寫入權限(以免有人惡意搗蛋)
trac-admin ${PROJECT} permission remove anonymous TICKET_CREATE TICKET_MODIFY WIKI_CREATE WIKI_MODIFY
trac-admin ${PROJECT} permission add authenticated TICKET_CREATE TICKET_MODIFY TICKET_VIEW WIKI_CREATE WIKI_MODIFY
# 啟用 WebAdmin
echo "[components]
webadmin.* = enabled
tracgantt.* = enabled
iniadmin.iniadmin.iniadminplugin = enabled
trac.web.auth.LoginModule = disabled
acct_mgr.* = enabled
[account-manager]
password_format = htpasswd
password_file = ${PROJECTS}/.htpasswd
[ticket-custom]
due_assign = text
due_assign.label = Due to assign
due_assign.value = YYYY/MM/DD
dependencies = text
dependencies.label = Dependencies
dependencies.value =
due_close= text
due_close.label = Due to close
due_close.value = YYYY/MM/DD
include_gantt = checkbox
include_gantt.label = Include in GanttChart
include_gantt.value =
[gantt-charts]
# The format of dates entered by humans in the above ticket fields
date_format = %Y/%m/%d
# Include the ticket summary in the gantt chart display
include_summary = true
# Trim the included summary to the given number of characters
summary_length = 16
# Use the creation date of a ticket as the "due assign" date if no
# assignment date is given
use_creation_date = true
# Show on the gantt chart the date the ticket was opened, to contrast
# with the assignment date.
show_opened = true" >> ${PROJECT}/conf/trac.ini
# 調整一些共同的參數
sed -i -e "s/max_size = 262144/max_size = 10000000/" -e "s/always_notify_owner = false/always_notify_owner = true/" -e "s/always_notify_reporter = false/always_notify_reporter = true/" -e "s/smtp_enabled = false/smtp_enabled = true/" -e "s/default_charset = iso-8859-15/default_charset = UTF-8/" ${PROJECT}/conf/trac.ini
trac-admin ${PROJECT} permission add anonymous GANTT_VIEW
執行方式:
./newproject.sh project1 "My Project1" user1
接著編輯一個/var/lib/pgsql/session_attribute.sql檔案,將小組成員的姓名和email填寫好:
insert into session_attribute(sid, authenticated, name, value) values('admin', 1, 'email', 'admin@example.org');
insert into session_attribute(sid, authenticated, name, value) values('admin', 1, 'name', 'Andowson Chang');
insert into session_attribute(sid, authenticated, name, value) values('user1', 1, 'email', 'user1@example.org');
insert into session_attribute(sid, authenticated, name, value) values('user1', 1, 'name', 'John Doe');
insert into session_attribute(sid, authenticated, name, value) values('user2', 1, 'email', 'user2@example.org');
insert into session_attribute(sid, authenticated, name, value) values('user2', 1, 'name', 'Mary Doe');
將小組成員的資料加到這個新開好的專案
su - postgres
psql trac_project1 trac_project1 -f session_attribute.sql
要加入小組成員的寫入權限時,可以請他先透過Trac網頁介面register,然後再把帳號加到svnaccess去; 或者透過htpasswd幫他開好帳號及密碼,然後再把帳號加到svnaccess去。
htpasswd -b /var/trac/projects/.htpasswd user1 user1pwd
htpasswd -b /var/trac/projects/.htpasswd user2 user2pwd
vi /var/trac/projects/svnaccess
[/]
* = r
admin = rw
[project1:/]
* = r
admin = rw
user1 = rw
user2 = rw
參考資料:
Version Control with Subversion中譯版
Debian Linux: Apache2(Virtual Host) + Subversion(SVN) + Trac 快速建置