Nginx+mod_rails(Phusion Passenge)+redmine+gitosis的整合笔记
个人使用Git很长时间了,感觉比subversion方便太多。因此,最近准备将团队的版本管理工具从subversion转向git.
周末花了点时间搭建了一个项目开发构建的环境:
版本管理使用git并用gitosis来搭建。
项目管理使用redmine。
部署:Nginx+Passenge(mod_rails)
中间出现了不少问题,做个笔记,以备后查:
一、安装Git/Gitosis环境
1.安装git
这部分没有什么问题
2.安装gitosis
git环境默认是可以直接使用的,但需要为每个成员开ssh权限帐号,且各个仓库之间的交叉权限管理很麻烦,
所以需要使用gitosis, 它无需为每个开发人员开设ssh帐号,安全方便。
我使用的机器还是Redhat EL4U3, 其中python的版本是2.3, gitosis并不兼容。
所以首先是安装一个独立的python26环境。
之后就简单了:
* 添加一个git用户,用它来运行gitosis,将其home设置为要存放git repositories的目录,注意将owner设置为git.
* clone gitosis
git clone git://eagain.net/gitosis.git
python setup.py install
* 上传你的ssh public key到服务器
scp ~/.ssh/id_rsa.pub root@xxx:/tmp/
* 用你的key初始化gitosis
sudo -H -u git gitosis-init < /tmp/id_rsa.pub
这将创建gitosis-admin 库,位于:
gitosis将使用这个库进行用户和库权限的管理,由于其自身就是一个git repository,所以管理起来很方便:
修改post-update hook:
chmod a+x
现在服务端部署完毕.
git clone git@xxx:gitosis-admin.git
这将checkout/clone 到你本地.
现在将你的开发组成员的public key放到keys目录下,
格式为: user_name.pub , 如night.pub, little_zhang.pub.
然后,修改gitosis.conf:
[gitosis]
[group gitosis-admin]
writable = gitosis-admin
members = night
[group night-team]
members = night
writable = nginx-cache nginx-mirror
[group doggy-team]
members = night
writable = doggy doggy-passport
每个group是一个组,members是成员名,空格分隔, writeable定义该组成员可以写入的repository.
members对应的就是keys目录下的文件名(无pub后缀)。
修改后,提交并push到服务端:
git commit -m’setup users and access’
git push
如何使用?
现在,某个用户就可以创建一个repository并push到服务端了:
假设night这个用户 要创建一个nginx-mirror仓库并push上去, 他需要这样做:
mkdir nginx-mirror
git init
touch .gitignore
git commit -m’init commit’
git remote add origin git@xxx:nginx-mirror.git
git push –mirror
现在本地的nginx-mirror就和服务端的nginx-mirror.git同步了,之后就是正常的git日常管理流程:
add,commit,branch,push….
Git环境至此就告一段落。
二、安装部署Redmine
Redmine是一个Rails项目,和Trac类似,但操作界面要比trac要简单方便很多. 包括项目管理中常用的模块:Issue, Timeline,
Wiki,Files,Documents, 并且可以和Subversion,Git整合, 多数plugin都有中文的locale.
1. 安装Ruby
最新的Ruby是1.9,但Rails2.2不支持,只能安装1.8
2.安装Rails 2.2
3. 安装mysql和其他可选模块,如RMagic
4.Checkout最新的代码
svn co svn://rubyforge.org/var/svn/redmine/trunk redmine
5. 配置数据库
创建project数据库,并修改config/database.yml
6.Load数据库并插入初始数据
rake config/initializers/session_store.rb
rake db:migrate RAILS_ENV=”production”
rake redmine:load_default_data RAILS_ENV=”production”
7. 创建并修改临时目录的权限
mkdir tmp public/plugin_assets
chmod -R 777 files log tmp public/plugin_assets
8.测试
ruby script/server webrick -e production
现在,3000端口就可以进入,默认的用户 admin/admin
9. 部署Redmine
Redmine是一个rails应用, 所以如何部署是和普通rails一样, 我使用nginx+mod_rails方式,简单,高效。
安装 mod_rails(http://www.modrails.com/)
gem install passenger
现在需要安装passenger的nginx模块, 其自带了一个passenger-install-nginx-module命令,
可以自动编译并安装nginx,不过我嫌啰嗦,自己编译:
cd /usr/local/src/nginx-0.7.58
./configure –with-http_stub_status_module –with-http_gzip_static_module –add-module=’/usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.2/ext/nginx’
make install
现在修改nginx.conf:
在http段加入:
passenger_root /usr/local/lib/ruby/gems/1.8/gems/passenger-2.2.2;
然后在虚拟主机启用passenger:
server {
listen 80;
server_name dev.xxx.com;
access_log /logs/dev.access.log;
index index.html;
passenger_enabled on;
root /project/redmine/public;
}
现在重启nginx,访问上述域名即可.Passenge会自动监测并重启ruby进程.
其他高级配置可以参考相应文档.
三、整合Gitosis和redmine
这部分稍微有点小麻烦。
1. 创建新项目,在版本库中SCM选择git,
然后将gitosis的仓库位置填入.
2. 刷新,并访问版本库模块,此时出错,显示没有相应的修订条目
这个问题主要是由于gitosis创建的仓库的权限是750,而gitosis和redmine的运行
用户不同.因此,需要将redmine的运行用户调成git,这样才能读取仓库的信息。
感谢mod_rails(Passenge), 它支持user switching, 由于redmine是rails程序,
因此只需要改变config/environment.rb文件owner即可,mod_rails默认将该应用切换这个文件的owner:
chown /project/redmine/config/environment.rb
killall -HUP nginx
现在,可以在redmine中浏览版本库了.
3. Hack redmine支持branches/tags的浏览
还有一个小问题,那就是默认的redmine的git插件只能浏览HEAD/master的信息,而无法查看branche/tags的信息,
这是我不能容忍的。
所以,需要对redmine打个补丁.
cd /project/redmine
path -p1 < ../redmine_git_branches.diff
killall -HUP nginx
现在重新刷新,wow!, 所有的分支和tag都能够浏览了,虽然还没有像github那样完美,但至少满足我的工作要求了。
这是我所使用的patch:redmine_git_branches,可以对现在trunk版本直接patch。
=====================END===================
ProjectPlus无法显示git状态
更新了git后,projectplus就无法支持git状态显示了,svn则正常。之前是自己编译的git,这次更新则使用了Git for OSX installer。区别在于后者默认install到/usr/local/git,看了下ProjectPlus的Libraries,自带了svn的运行库,没有git。看来是直接使用系统的git路径了。于是,将git做了一个symbol link:
ln -s /usr/local/git/bin/git /usr/local/bin/git
返回TextMate, 正常了,看来ProjectPlus是使用了绝对路径。
Git for OSX installer
http://code.google.com/p/git-osx-installer/
以后不用自己编译了,省事.
OpenInGitGui还挺方便的,
虽然我一般在iTerm里用命令行,配合git complete脚本,也非常方便。
开始使用git
配置管理工具用了不少,最初的CVS,后来切换成Subversion. 最近开始转换到git上.
Git是linus 为linux 内核写的一个分布式版本管理工具. 非常高效和灵活.
用subversion比较麻烦的一个是中央仓库服务器成为一个瓶颈.就我来说吧,白天在公司,
由于服务器在内部,速度还没有什么影响.晚上回家,当commit和update的时候就非常慢.
如果不commit,本地修改的东西就没有管理,有时候时间长了就麻烦, 尤其当你想作不同的尝试的时候,
需要创建一些branch.
Git则弥补了这些问题,作为一个分布式的版本管理,不依赖特定的中央仓库,任何一个节点完了都不影响
整体.
Git目前只有linux/unix版本,windows上可以用cygwin来安装. 对于那些迷恋GUI界面的人,GIT没有subversion
那么好的图形界面, Eclipse上的plugin也刚刚起步(不过基本功能都还全了).
不过git的命令都比较简单,用起来还是蛮顺手的.
我比较幸运,因为我用TextMate,TextMate作者似乎也比较喜欢git了,Textmate有一个比较好用的bundle,
安装很简单:
mkdir -p ~/Library/Application\ Support/TextMate/Bundles
cd !$
git clone git://gitorious.org/git-tmbundle/mainline.git Git.tmbundle
osascript -e 'tell app "TextMate" to reload bundles'
然后,在配置里增加一个TM_GIT的变量,指向你的git的所在.
git好用,不过其他的同事未必能够适应,所以我现在用git-svn配合.
把原来subversion的源码checkout出来形成本地的git仓库.
平时自己修改用git管理, 当需要合并的时候再提交到subvesion中形成新版本.